Changeset 601 for libcaca/trunk
- Timestamp:
- Mar 14, 2006, 3:19:58 PM (15 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcaca/trunk/caca/driver_network.c
r599 r601 41 41 #include "cucul_internals.h" 42 42 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 */ 45 46 46 47 /* Following vars are static */ … … 69 70 int fd; 70 71 int ready; 71 char buffer[BACKBUFFER]; 72 uint8_t inbuf[INBUFFER]; 73 int inbytes; 74 uint8_t outbuf[OUTBUFFER]; 72 75 int start, stop; 73 76 }; … … 94 97 static void manage_connections(caca_t *kk); 95 98 static int send_data(caca_t *kk, struct client *c); 96 ssize_t nonblock_write(int fd, char*buf, size_t len);99 ssize_t nonblock_write(int fd, void *buf, size_t len); 97 100 98 101 static int network_init_graphics(caca_t *kk) … … 173 176 kk->drv.p->sigpipe_handler = signal(SIGPIPE, SIG_IGN); 174 177 178 fprintf(stderr, "initialised network, listening on port %i\n", 179 kk->drv.p->port); 180 175 181 return 0; 176 182 } … … 225 231 226 232 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); 227 237 kk->drv.p->clients[i].fd = -1; 238 } 228 239 } 229 240 … … 260 271 return; 261 272 273 fprintf(stderr, "client %i connected from %s\n", 274 fd, inet_ntoa(remote_addr.sin_addr)); 275 262 276 /* Non blocking socket */ 263 277 flags = fcntl(fd, F_SETFL, 0); … … 278 292 kk->drv.p->clients[kk->drv.p->client_count].fd = fd; 279 293 kk->drv.p->clients[kk->drv.p->client_count].ready = 0; 294 kk->drv.p->clients[kk->drv.p->client_count].inbytes = 0; 280 295 kk->drv.p->clients[kk->drv.p->client_count].start = 0; 281 296 kk->drv.p->clients[kk->drv.p->client_count].stop = 0; 282 297 283 298 /* 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 } 285 306 286 307 kk->drv.p->client_count++; … … 295 316 return -1; 296 317 297 /* Debug: showincoming data */318 /* Listen to incoming data */ 298 319 for(;;) 299 320 { 300 unsigned char in; 301 ret = read(c->fd, &in, 1); 321 ret = read(c->fd, c->inbuf + c->inbytes, 1); 302 322 if(ret <= 0) 303 323 break; 304 324 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 } 306 357 } 307 358 … … 326 377 if(c->stop) 327 378 { 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); 329 380 330 381 if(ret == -1) … … 346 397 347 398 if(c->stop - c->start + strlen(ANSI_PREFIX) + kk->drv.p->size 348 > BACKBUFFER)399 > OUTBUFFER) 349 400 { 350 401 /* Overflow! Empty buffer and start again */ 351 memcpy(c-> buffer, ANSI_RESET, strlen(ANSI_RESET));402 memcpy(c->outbuf, ANSI_RESET, strlen(ANSI_RESET)); 352 403 c->start = 0; 353 404 c->stop = strlen(ANSI_RESET); … … 356 407 357 408 /* 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) 359 410 { 360 memmove(c-> buffer, c->buffer+ c->start, c->stop - c->start);411 memmove(c->outbuf, c->outbuf + c->start, c->stop - c->start); 361 412 c->stop -= c->start; 362 413 c->start = 0; 363 414 } 364 415 365 memcpy(c-> buffer+ c->stop, ANSI_PREFIX, strlen(ANSI_PREFIX));416 memcpy(c->outbuf + c->stop, ANSI_PREFIX, strlen(ANSI_PREFIX)); 366 417 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); 368 419 c->stop += kk->drv.p->size; 369 420 … … 386 437 if(ret < (ssize_t)strlen(ANSI_PREFIX)) 387 438 { 388 if(strlen(ANSI_PREFIX) + kk->drv.p->size > BACKBUFFER)439 if(strlen(ANSI_PREFIX) + kk->drv.p->size > OUTBUFFER) 389 440 { 390 441 /* Overflow! Empty buffer and start again */ 391 memcpy(c-> buffer, ANSI_RESET, strlen(ANSI_RESET));442 memcpy(c->outbuf, ANSI_RESET, strlen(ANSI_RESET)); 392 443 c->start = 0; 393 444 c->stop = strlen(ANSI_RESET); … … 395 446 } 396 447 397 memcpy(c-> buffer, ANSI_PREFIX, strlen(ANSI_PREFIX) - ret);448 memcpy(c->outbuf, ANSI_PREFIX, strlen(ANSI_PREFIX) - ret); 398 449 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); 400 451 c->stop += kk->drv.p->size; 401 452 … … 415 466 if(ret < kk->drv.p->size) 416 467 { 417 if(kk->drv.p->size > BACKBUFFER)468 if(kk->drv.p->size > OUTBUFFER) 418 469 { 419 470 /* Overflow! Empty buffer and start again */ 420 memcpy(c-> buffer, ANSI_RESET, strlen(ANSI_RESET));471 memcpy(c->outbuf, ANSI_RESET, strlen(ANSI_RESET)); 421 472 c->start = 0; 422 473 c->stop = strlen(ANSI_RESET); … … 424 475 } 425 476 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); 427 478 c->stop = kk->drv.p->size - ret; 428 479 … … 433 484 } 434 485 435 ssize_t nonblock_write(int fd, char*buf, size_t len)486 ssize_t nonblock_write(int fd, void *buf, size_t len) 436 487 { 437 488 size_t total = 0; … … 452 503 453 504 total += len; 454 buf += len;505 buf = (void *)((uintptr_t)buf + len); 455 506 } 456 507
Note: See TracChangeset
for help on using the changeset viewer.