Ignore:
Timestamp:
Mar 14, 2006, 3:19:58 PM (14 years ago)
Author:
Sam Hocevar
Message:
  • Pressing Ctrl-C on the client side now drops the connection.
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcaca/trunk/caca/driver_network.c

    r599 r601  
    4141#include "cucul_internals.h"
    4242
    43 #define BACKLOG 1337    /* Number of pending connections */
    44 #define BACKBUFFER 300000 /* Size of per-client buffer */
     43#define BACKLOG 1337     /* Number of pending connections */
     44#define INBUFFER 32      /* Size of per-client input buffer */
     45#define OUTBUFFER 300000 /* Size of per-client output buffer */
    4546
    4647/* Following vars are static */
     
    6970    int fd;
    7071    int ready;
    71     char buffer[BACKBUFFER];
     72    uint8_t inbuf[INBUFFER];
     73    int inbytes;
     74    uint8_t outbuf[OUTBUFFER];
    7275    int start, stop;
    7376};
     
    9497static void manage_connections(caca_t *kk);
    9598static int send_data(caca_t *kk, struct client *c);
    96 ssize_t nonblock_write(int fd, char *buf, size_t len);
     99ssize_t nonblock_write(int fd, void *buf, size_t len);
    97100
    98101static int network_init_graphics(caca_t *kk)
     
    173176    kk->drv.p->sigpipe_handler = signal(SIGPIPE, SIG_IGN);
    174177
     178    fprintf(stderr, "initialised network, listening on port %i\n",
     179                    kk->drv.p->port);
     180
    175181    return 0;
    176182}
     
    225231
    226232        if(send_data(kk, &kk->drv.p->clients[i]))
     233        {
     234            fprintf(stderr, "client %i dropped connection\n",
     235                            kk->drv.p->clients[i].fd);
     236            close(kk->drv.p->clients[i].fd);
    227237            kk->drv.p->clients[i].fd = -1;
     238        }
    228239    }
    229240
     
    260271        return;
    261272
     273    fprintf(stderr, "client %i connected from %s\n",
     274                    fd, inet_ntoa(remote_addr.sin_addr));
     275
    262276    /* Non blocking socket */
    263277    flags = fcntl(fd, F_SETFL, 0);
     
    278292    kk->drv.p->clients[kk->drv.p->client_count].fd = fd;
    279293    kk->drv.p->clients[kk->drv.p->client_count].ready = 0;
     294    kk->drv.p->clients[kk->drv.p->client_count].inbytes = 0;
    280295    kk->drv.p->clients[kk->drv.p->client_count].start = 0;
    281296    kk->drv.p->clients[kk->drv.p->client_count].stop = 0;
    282297
    283298    /* If we already have data to send, send it to the new client */
    284     send_data(kk, &kk->drv.p->clients[kk->drv.p->client_count]);
     299    if(send_data(kk, &kk->drv.p->clients[kk->drv.p->client_count]))
     300    {
     301        fprintf(stderr, "client %i dropped connection\n", fd);
     302        close(fd);
     303        kk->drv.p->clients[kk->drv.p->client_count].fd = -1;
     304        return;
     305    }
    285306
    286307    kk->drv.p->client_count++;
     
    295316        return -1;
    296317
    297     /* Debug: show incoming data */
     318    /* Listen to incoming data */
    298319    for(;;)
    299320    {
    300         unsigned char in;
    301         ret = read(c->fd, &in, 1);
     321        ret = read(c->fd, c->inbuf + c->inbytes, 1);
    302322        if(ret <= 0)
    303323            break;
    304324
    305         fprintf(stderr, "client %i said \\x%.02x\n", c->fd, in);
     325        c->inbytes++;
     326
     327        /* Check for telnet sequences */
     328        if(c->inbuf[0] == 0xff)
     329        {
     330            if(c->inbytes == 1)
     331            {
     332                ;
     333            }
     334            else if(c->inbuf[1] == 0xfd || c->inbuf[1] == 0xfc)
     335            {
     336                if(c->inbytes == 3)
     337                {
     338                    fprintf(stderr, "client %i said: %.02x %.02x %.02x\n",
     339                            c->fd, c->inbuf[0], c->inbuf[1], c->inbuf[2]);
     340                    /* Just ignore, lol */
     341                    c->inbytes = 0;
     342                }
     343            }
     344            else
     345                c->inbytes = 0;
     346        }
     347        else if(c->inbytes == 1)
     348        {
     349            if(c->inbuf[0] == 0x03)
     350            {
     351                fprintf(stderr, "client %i pressed C-c\n", c->fd);
     352                return -1; /* User requested to quit */
     353            }
     354
     355            c->inbytes = 0;
     356        }
    306357    }
    307358
     
    326377    if(c->stop)
    327378    {
    328         ret = nonblock_write(c->fd, c->buffer + c->start, c->stop - c->start);
     379        ret = nonblock_write(c->fd, c->outbuf + c->start, c->stop - c->start);
    329380
    330381        if(ret == -1)
     
    346397
    347398            if(c->stop - c->start + strlen(ANSI_PREFIX) + kk->drv.p->size
    348                 > BACKBUFFER)
     399                > OUTBUFFER)
    349400            {
    350401                /* Overflow! Empty buffer and start again */
    351                 memcpy(c->buffer, ANSI_RESET, strlen(ANSI_RESET));
     402                memcpy(c->outbuf, ANSI_RESET, strlen(ANSI_RESET));
    352403                c->start = 0;
    353404                c->stop = strlen(ANSI_RESET);
     
    356407
    357408            /* Need to move? */
    358             if(c->stop + strlen(ANSI_PREFIX) + kk->drv.p->size > BACKBUFFER)
     409            if(c->stop + strlen(ANSI_PREFIX) + kk->drv.p->size > OUTBUFFER)
    359410            {
    360                 memmove(c->buffer, c->buffer + c->start, c->stop - c->start);
     411                memmove(c->outbuf, c->outbuf + c->start, c->stop - c->start);
    361412                c->stop -= c->start;
    362413                c->start = 0;
    363414            }
    364415
    365             memcpy(c->buffer + c->stop, ANSI_PREFIX, strlen(ANSI_PREFIX));
     416            memcpy(c->outbuf + c->stop, ANSI_PREFIX, strlen(ANSI_PREFIX));
    366417            c->stop += strlen(ANSI_PREFIX);
    367             memcpy(c->buffer + c->stop, kk->drv.p->buffer, kk->drv.p->size);
     418            memcpy(c->outbuf + c->stop, kk->drv.p->buffer, kk->drv.p->size);
    368419            c->stop += kk->drv.p->size;
    369420
     
    386437    if(ret < (ssize_t)strlen(ANSI_PREFIX))
    387438    {
    388         if(strlen(ANSI_PREFIX) + kk->drv.p->size > BACKBUFFER)
     439        if(strlen(ANSI_PREFIX) + kk->drv.p->size > OUTBUFFER)
    389440        {
    390441            /* Overflow! Empty buffer and start again */
    391             memcpy(c->buffer, ANSI_RESET, strlen(ANSI_RESET));
     442            memcpy(c->outbuf, ANSI_RESET, strlen(ANSI_RESET));
    392443            c->start = 0;
    393444            c->stop = strlen(ANSI_RESET);
     
    395446        }
    396447
    397         memcpy(c->buffer, ANSI_PREFIX, strlen(ANSI_PREFIX) - ret);
     448        memcpy(c->outbuf, ANSI_PREFIX, strlen(ANSI_PREFIX) - ret);
    398449        c->stop = strlen(ANSI_PREFIX) - ret;
    399         memcpy(c->buffer + c->stop, kk->drv.p->buffer, kk->drv.p->size);
     450        memcpy(c->outbuf + c->stop, kk->drv.p->buffer, kk->drv.p->size);
    400451        c->stop += kk->drv.p->size;
    401452
     
    415466    if(ret < kk->drv.p->size)
    416467    {
    417         if(kk->drv.p->size > BACKBUFFER)
     468        if(kk->drv.p->size > OUTBUFFER)
    418469        {
    419470            /* Overflow! Empty buffer and start again */
    420             memcpy(c->buffer, ANSI_RESET, strlen(ANSI_RESET));
     471            memcpy(c->outbuf, ANSI_RESET, strlen(ANSI_RESET));
    421472            c->start = 0;
    422473            c->stop = strlen(ANSI_RESET);
     
    424475        }
    425476
    426         memcpy(c->buffer, kk->drv.p->buffer, kk->drv.p->size - ret);
     477        memcpy(c->outbuf, kk->drv.p->buffer, kk->drv.p->size - ret);
    427478        c->stop = kk->drv.p->size - ret;
    428479
     
    433484}
    434485
    435 ssize_t nonblock_write(int fd, char *buf, size_t len)
     486ssize_t nonblock_write(int fd, void *buf, size_t len)
    436487{
    437488    size_t total = 0;
     
    452503
    453504        total += len;
    454         buf += len;
     505        buf = (void *)((uintptr_t)buf + len);
    455506    }
    456507
Note: See TracChangeset for help on using the changeset viewer.