diff --git a/caca/driver_network.c b/caca/driver_network.c index b20e713..5ca8903 100644 --- a/caca/driver_network.c +++ b/caca/driver_network.c @@ -38,22 +38,25 @@ #include "cucul.h" #include "cucul_internals.h" +static void manage_connections(caca_t *kk); +static int send_data(caca_t *kk, int fd); struct driver_private { unsigned int width, height; unsigned int port; - int sockfd, new_fd; + int sockfd; struct sockaddr_in my_addr; struct sockaddr_in remote_addr; socklen_t sin_size; int clilen; - char buffer[256]; + + char *buffer; + int size; int client_count; int *fd_list; - }; @@ -127,15 +130,19 @@ static int network_init_graphics(caca_t *kk) printf("network ok.\n"); + kk->drv.p->buffer = NULL; + return 0; } static int network_end_graphics(caca_t *kk) { int i; + for(i = 0; i < kk->drv.p->client_count; i++) { close(kk->drv.p->fd_list[i]); } + return 0; } @@ -157,52 +164,19 @@ static unsigned int network_get_window_height(caca_t *kk) static void network_display(caca_t *kk) { - int size, i; - char *to_send = cucul_get_ansi(kk->qq, 0, &size);; - - kk->drv.p->clilen = sizeof(kk->drv.p->remote_addr); - kk->drv.p->new_fd = accept(kk->drv.p->sockfd, (struct sockaddr *) &kk->drv.p->remote_addr, &kk->drv.p->clilen); - if(kk->drv.p->new_fd != -1) - { - - if(kk->drv.p->fd_list == NULL) { - kk->drv.p->fd_list = malloc(sizeof(int)); - if(kk->drv.p->fd_list == NULL) - return; - kk->drv.p->fd_list[kk->drv.p->client_count] = kk->drv.p->new_fd; - } else { - kk->drv.p->fd_list = realloc(kk->drv.p->fd_list, (kk->drv.p->client_count+1) * sizeof(int)); - kk->drv.p->fd_list[kk->drv.p->client_count] = kk->drv.p->new_fd; - } + int i; - kk->drv.p->client_count++; + kk->drv.p->buffer = cucul_get_ansi(kk->qq, 0, &kk->drv.p->size);; - } + for(i = 0; i < kk->drv.p->client_count; i++) + { + if(send_data(kk, kk->drv.p->fd_list[i])) + kk->drv.p->fd_list[i] = -1; + } - for(i = 0; i < kk->drv.p->client_count; i++) { - if(kk->drv.p->fd_list[i] == -1) - continue; - - /* FIXME, handle >255 sizes */ - codes[16] = (unsigned char) kk->drv.p->width&0xff; - codes[18] = (unsigned char) kk->drv.p->height&0xff; - - /* Send basic telnet codes */ - if (send(kk->drv.p->fd_list[i], codes,sizeof(codes) , 0) == -1) { - kk->drv.p->fd_list[i] = -1; - } - - /* ANSI code for move(0,0)*/ - if (send(kk->drv.p->fd_list[i], "\033[1,1H", 6, 0) == -1) { - kk->drv.p->fd_list[i] = -1; - } - - if (send(kk->drv.p->fd_list[i], to_send, size, 0) == -1) { - kk->drv.p->fd_list[i] = -1; - } - } - + manage_connections(kk); } + static void network_handle_resize(caca_t *kk) { /* Not handled */ @@ -210,10 +184,69 @@ static void network_handle_resize(caca_t *kk) static unsigned int network_get_event(caca_t *kk) { + manage_connections(kk); + /* Not handled */ return 0; } +/* + * XXX: The following functions are local + */ + +static void manage_connections(caca_t *kk) +{ + int fd; + + kk->drv.p->clilen = sizeof(kk->drv.p->remote_addr); + fd = accept(kk->drv.p->sockfd, (struct sockaddr *) &kk->drv.p->remote_addr, &kk->drv.p->clilen); + if(fd != -1) + { + if(kk->drv.p->fd_list == NULL) + { + kk->drv.p->fd_list = malloc(sizeof(int)); + if(kk->drv.p->fd_list == NULL) + return; + } + else + { + kk->drv.p->fd_list = realloc(kk->drv.p->fd_list, (kk->drv.p->client_count+1) * sizeof(int)); + } + + if(send_data(kk, fd) == 0) + { + kk->drv.p->fd_list[kk->drv.p->client_count] = fd; + kk->drv.p->client_count++; + } + } +} + +static int send_data(caca_t *kk, int fd) +{ + /* No error, there's just nothing to send yet */ + if(!kk->drv.p->buffer) + return 0; + + if(fd < 0) + return -1; + + /* FIXME, handle >255 sizes */ + codes[16] = (unsigned char) kk->drv.p->width & 0xff; + codes[18] = (unsigned char) kk->drv.p->height & 0xff; + + /* Send basic telnet codes */ + if (send(fd, codes,sizeof(codes) , 0) == -1) + return -1; + + /* ANSI code for move(0,0)*/ + if (send(fd, "\033[1,1H", 6, 0) == -1) + return -1; + + if (send(fd, kk->drv.p->buffer, kk->drv.p->size, 0) == -1) + return -1; + + return 0; +} /* * Driver initialisation