Changeset 584 for libcaca/trunk
- Timestamp:
- Mar 10, 2006, 2:06:40 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/caca/driver_network.c
r582 r584 39 39 #include "cucul_internals.h" 40 40 41 static void manage_connections(caca_t *kk); 42 static int send_data(caca_t *kk, int fd); 41 43 42 44 … … 45 47 unsigned int width, height; 46 48 unsigned int port; 47 int sockfd , new_fd;49 int sockfd; 48 50 struct sockaddr_in my_addr; 49 51 struct sockaddr_in remote_addr; 50 52 socklen_t sin_size; 51 53 int clilen; 52 char buffer[256]; 54 55 char *buffer; 56 int size; 53 57 54 58 int client_count; 55 59 int *fd_list; 56 57 60 }; 58 61 … … 128 131 printf("network ok.\n"); 129 132 133 kk->drv.p->buffer = NULL; 134 130 135 return 0; 131 136 } … … 134 139 { 135 140 int i; 141 136 142 for(i = 0; i < kk->drv.p->client_count; i++) { 137 143 close(kk->drv.p->fd_list[i]); 138 144 } 145 139 146 return 0; 140 147 } … … 158 165 static void network_display(caca_t *kk) 159 166 { 160 int size, i; 161 char *to_send = cucul_get_ansi(kk->qq, 0, &size);; 167 int i; 168 169 kk->drv.p->buffer = cucul_get_ansi(kk->qq, 0, &kk->drv.p->size);; 170 171 for(i = 0; i < kk->drv.p->client_count; i++) 172 { 173 if(send_data(kk, kk->drv.p->fd_list[i])) 174 kk->drv.p->fd_list[i] = -1; 175 } 176 177 manage_connections(kk); 178 } 162 179 180 static void network_handle_resize(caca_t *kk) 181 { 182 /* Not handled */ 183 } 184 185 static unsigned int network_get_event(caca_t *kk) 186 { 187 manage_connections(kk); 188 189 /* Not handled */ 190 return 0; 191 } 192 193 /* 194 * XXX: The following functions are local 195 */ 196 197 static void manage_connections(caca_t *kk) 198 { 199 int fd; 200 163 201 kk->drv.p->clilen = sizeof(kk->drv.p->remote_addr); 164 kk->drv.p->new_fd = accept(kk->drv.p->sockfd, (struct sockaddr *) &kk->drv.p->remote_addr, &kk->drv.p->clilen); 165 if(kk->drv.p->new_fd != -1) 202 fd = accept(kk->drv.p->sockfd, (struct sockaddr *) &kk->drv.p->remote_addr, &kk->drv.p->clilen); 203 if(fd != -1) 204 { 205 if(kk->drv.p->fd_list == NULL) 166 206 { 167 168 if(kk->drv.p->fd_list == NULL) { 169 kk->drv.p->fd_list = malloc(sizeof(int)); 170 if(kk->drv.p->fd_list == NULL) 171 return; 172 kk->drv.p->fd_list[kk->drv.p->client_count] = kk->drv.p->new_fd; 173 } else { 174 kk->drv.p->fd_list = realloc(kk->drv.p->fd_list, (kk->drv.p->client_count+1) * sizeof(int)); 175 kk->drv.p->fd_list[kk->drv.p->client_count] = kk->drv.p->new_fd; 176 } 177 207 kk->drv.p->fd_list = malloc(sizeof(int)); 208 if(kk->drv.p->fd_list == NULL) 209 return; 210 } 211 else 212 { 213 kk->drv.p->fd_list = realloc(kk->drv.p->fd_list, (kk->drv.p->client_count+1) * sizeof(int)); 214 } 215 216 if(send_data(kk, fd) == 0) 217 { 218 kk->drv.p->fd_list[kk->drv.p->client_count] = fd; 178 219 kk->drv.p->client_count++; 179 180 220 } 181 182 for(i = 0; i < kk->drv.p->client_count; i++) { 183 if(kk->drv.p->fd_list[i] == -1) 184 continue; 185 186 /* FIXME, handle >255 sizes */ 187 codes[16] = (unsigned char) kk->drv.p->width&0xff; 188 codes[18] = (unsigned char) kk->drv.p->height&0xff; 221 } 222 } 223 224 static int send_data(caca_t *kk, int fd) 225 { 226 /* No error, there's just nothing to send yet */ 227 if(!kk->drv.p->buffer) 228 return 0; 229 230 if(fd < 0) 231 return -1; 232 233 /* FIXME, handle >255 sizes */ 234 codes[16] = (unsigned char) kk->drv.p->width & 0xff; 235 codes[18] = (unsigned char) kk->drv.p->height & 0xff; 189 236 190 /* Send basic telnet codes */ 191 if (send(kk->drv.p->fd_list[i], codes,sizeof(codes) , 0) == -1) { 192 kk->drv.p->fd_list[i] = -1; 193 } 194 195 /* ANSI code for move(0,0)*/ 196 if (send(kk->drv.p->fd_list[i], "\033[1,1H", 6, 0) == -1) { 197 kk->drv.p->fd_list[i] = -1; 198 } 199 200 if (send(kk->drv.p->fd_list[i], to_send, size, 0) == -1) { 201 kk->drv.p->fd_list[i] = -1; 202 } 203 } 237 /* Send basic telnet codes */ 238 if (send(fd, codes,sizeof(codes) , 0) == -1) 239 return -1; 204 240 205 } 206 static void network_handle_resize(caca_t *kk) 207 { 208 /* Not handled */ 209 } 210 211 static unsigned int network_get_event(caca_t *kk) 212 { 213 /* Not handled */ 214 return 0; 215 } 216 241 /* ANSI code for move(0,0)*/ 242 if (send(fd, "\033[1,1H", 6, 0) == -1) 243 return -1; 244 245 if (send(fd, kk->drv.p->buffer, kk->drv.p->size, 0) == -1) 246 return -1; 247 248 return 0; 249 } 217 250 218 251 /*
Note: See TracChangeset
for help on using the changeset viewer.