diff options
Diffstat (limited to 'opentracker.c')
| -rw-r--r-- | opentracker.c | 39 | 
1 files changed, 34 insertions, 5 deletions
| diff --git a/opentracker.c b/opentracker.c index 374824f..6ff9da3 100644 --- a/opentracker.c +++ b/opentracker.c | |||
| @@ -5,6 +5,7 @@ | |||
| 5 | 5 | ||
| 6 | #include "socket.h" | 6 | #include "socket.h" | 
| 7 | #include "io.h" | 7 | #include "io.h" | 
| 8 | #include "iob.h" | ||
| 8 | #include "buffer.h" | 9 | #include "buffer.h" | 
| 9 | #include "array.h" | 10 | #include "array.h" | 
| 10 | #include "byte.h" | 11 | #include "byte.h" | 
| @@ -52,7 +53,10 @@ static void panic(const char* routine) { | |||
| 52 | } | 53 | } | 
| 53 | 54 | ||
| 54 | struct http_data { | 55 | struct http_data { | 
| 55 | array r; | 56 | union { | 
| 57 | array r; | ||
| 58 | io_batch batch; | ||
| 59 | }; | ||
| 56 | unsigned char ip[4]; | 60 | unsigned char ip[4]; | 
| 57 | }; | 61 | }; | 
| 58 | 62 | ||
| @@ -81,12 +85,24 @@ void senddata(int64 s, struct http_data* h, char *buffer, size_t size ) { | |||
| 81 | free(h); io_close( s ); | 85 | free(h); io_close( s ); | 
| 82 | } else { | 86 | } else { | 
| 83 | /* here we would take a copy of the buffer and remember it */ | 87 | /* here we would take a copy of the buffer and remember it */ | 
| 84 | fprintf( stderr, "Should have handled this.\n" ); | 88 | char * outbuf = malloc( size - written_size ); | 
| 89 | tai6464 t; | ||
| 90 | |||
| 91 | if( !outbuf ) { | ||
| 85 | #ifdef _DEBUG_FDS | 92 | #ifdef _DEBUG_FDS | 
| 86 | if( !fd_debug_space[s] ) fprintf( stderr, "close on non-open fd\n" ); | 93 | if( !fd_debug_space[s] ) fprintf( stderr, "close on non-open fd\n" ); | 
| 87 | fd_debug_space[s] = 0; | 94 | fd_debug_space[s] = 0; | 
| 88 | #endif | 95 | #endif | 
| 89 | free(h); io_close( s ); | 96 | free(h); io_close( s ); | 
| 97 | return; | ||
| 98 | } | ||
| 99 | |||
| 100 | iob_reset( &h->batch ); | ||
| 101 | memmove( outbuf, buffer + written_size, size - written_size ); | ||
| 102 | iob_addbuf_free( &h->batch, outbuf, size - written_size ); | ||
| 103 | |||
| 104 | // writeable sockets just have a tcp timeout | ||
| 105 | taia_uint(&t,0); io_timeout( s, t ); | ||
| 90 | } | 106 | } | 
| 91 | } | 107 | } | 
| 92 | 108 | ||
| @@ -437,6 +453,16 @@ void handle_read( int64 clientsocket ) { | |||
| 437 | httpresponse(clientsocket,h); | 453 | httpresponse(clientsocket,h); | 
| 438 | } | 454 | } | 
| 439 | 455 | ||
| 456 | void handle_write( int64 clientsocket ) { | ||
| 457 | struct http_data* h=io_getcookie(clientsocket); | ||
| 458 | if( !h ) return; | ||
| 459 | if( iob_send( clientsocket, &h->batch ) <= 0 ) { | ||
| 460 | iob_reset( &h->batch ); | ||
| 461 | io_close( clientsocket ); | ||
| 462 | free( h ); | ||
| 463 | } | ||
| 464 | } | ||
| 465 | |||
| 440 | void handle_accept( int64 serversocket ) { | 466 | void handle_accept( int64 serversocket ) { | 
| 441 | struct http_data* h; | 467 | struct http_data* h; | 
| 442 | unsigned char ip[4]; | 468 | unsigned char ip[4]; | 
| @@ -510,6 +536,9 @@ void server_mainloop( int64 serversocket ) { | |||
| 510 | handle_read( i ); | 536 | handle_read( i ); | 
| 511 | } | 537 | } | 
| 512 | 538 | ||
| 539 | while( ( i = io_canwrite() ) != -1 ) | ||
| 540 | handle_write( i ); | ||
| 541 | |||
| 513 | taia_now(&t); | 542 | taia_now(&t); | 
| 514 | if( taia_less( &next_timeout_check, &t ) ) { | 543 | if( taia_less( &next_timeout_check, &t ) ) { | 
| 515 | handle_timeouted( ); | 544 | handle_timeouted( ); | 
