|
|
@ -35,6 +35,10 @@ static const size_t SUCCESS_HTTP_SIZE_OFF = 17;
|
|
|
|
/* To always have space for error messages ;) */
|
|
|
|
/* To always have space for error messages ;) */
|
|
|
|
static char static_scratch[8192];
|
|
|
|
static char static_scratch[8192];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG_FDS
|
|
|
|
|
|
|
|
static char fd_debug_space[0x10000];
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
static void carp(const char* routine) {
|
|
|
|
static void carp(const char* routine) {
|
|
|
|
buffer_puts(buffer_2,routine);
|
|
|
|
buffer_puts(buffer_2,routine);
|
|
|
|
buffer_puts(buffer_2,": ");
|
|
|
|
buffer_puts(buffer_2,": ");
|
|
|
@ -70,10 +74,18 @@ void senddata(int64 s, struct http_data* h, char *buffer, size_t size ) {
|
|
|
|
if( h ) array_reset(&h->r);
|
|
|
|
if( h ) array_reset(&h->r);
|
|
|
|
written_size = write( s, buffer, size );
|
|
|
|
written_size = write( s, buffer, size );
|
|
|
|
if( ( written_size < 0 ) || ( written_size == size ) ) {
|
|
|
|
if( ( written_size < 0 ) || ( written_size == size ) ) {
|
|
|
|
|
|
|
|
#ifdef _DEBUG_FDS
|
|
|
|
|
|
|
|
if( !fd_debug_space[s] ) fprintf( stderr, "close on non-open fd\n" );
|
|
|
|
|
|
|
|
fd_debug_space[s] = 0;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
free(h); io_close( s );
|
|
|
|
free(h); io_close( s );
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
/* here we would take a copy of the buffer and remember it */
|
|
|
|
/* here we would take a copy of the buffer and remember it */
|
|
|
|
fprintf( stderr, "Should have handled this.\n" );
|
|
|
|
fprintf( stderr, "Should have handled this.\n" );
|
|
|
|
|
|
|
|
#ifdef _DEBUG_FDS
|
|
|
|
|
|
|
|
if( !fd_debug_space[s] ) fprintf( stderr, "close on non-open fd\n" );
|
|
|
|
|
|
|
|
fd_debug_space[s] = 0;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
free(h); io_close( s );
|
|
|
|
free(h); io_close( s );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -337,6 +349,10 @@ e404:
|
|
|
|
senddata( s, h, static_scratch + reply_off, reply_size );
|
|
|
|
senddata( s, h, static_scratch + reply_off, reply_size );
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
if( h ) array_reset(&h->r);
|
|
|
|
if( h ) array_reset(&h->r);
|
|
|
|
|
|
|
|
#ifdef _DEBUG_FDS
|
|
|
|
|
|
|
|
if( !fd_debug_space[s] ) fprintf( stderr, "close on non-open fd\n" );
|
|
|
|
|
|
|
|
fd_debug_space[s] = 0;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
free( h ); io_close( s );
|
|
|
|
free( h ); io_close( s );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -349,6 +365,15 @@ void graceful( int s ) {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG_FDS
|
|
|
|
|
|
|
|
void count_fds( int s ) {
|
|
|
|
|
|
|
|
int i, count = 0;
|
|
|
|
|
|
|
|
for( i=0; i<sizeof(fd_debug_space); ++i )
|
|
|
|
|
|
|
|
if( fd_debug_space[i] ) ++count;
|
|
|
|
|
|
|
|
fprintf( stderr, "Open fds here: %i\n", count );
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
void usage( char *name ) {
|
|
|
|
void usage( char *name ) {
|
|
|
|
fprintf( stderr, "Usage: %s [-i serverip] [-p serverport] [-d serverdirectory]"
|
|
|
|
fprintf( stderr, "Usage: %s [-i serverip] [-p serverport] [-d serverdirectory]"
|
|
|
|
#ifdef WANT_CLOSED_TRACKER
|
|
|
|
#ifdef WANT_CLOSED_TRACKER
|
|
|
@ -394,6 +419,10 @@ void handle_read( int64 clientsocket ) {
|
|
|
|
array_reset(&h->r);
|
|
|
|
array_reset(&h->r);
|
|
|
|
free(h);
|
|
|
|
free(h);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef _DEBUG_FDS
|
|
|
|
|
|
|
|
if( !fd_debug_space[clientsocket] ) fprintf( stderr, "close on non-open fd\n" );
|
|
|
|
|
|
|
|
fd_debug_space[clientsocket] = 0;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
io_close(clientsocket);
|
|
|
|
io_close(clientsocket);
|
|
|
|
return;
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -423,6 +452,11 @@ void handle_accept( int64 serversocket ) {
|
|
|
|
continue;
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef _DEBUG_FDS
|
|
|
|
|
|
|
|
if( fd_debug_space[i] ) fprintf( stderr, "double use of fd: %i\n", (int)i );
|
|
|
|
|
|
|
|
fd_debug_space[i] = 1;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
io_wantread( i );
|
|
|
|
io_wantread( i );
|
|
|
|
|
|
|
|
|
|
|
|
byte_zero(h,sizeof(struct http_data));
|
|
|
|
byte_zero(h,sizeof(struct http_data));
|
|
|
@ -448,6 +482,10 @@ void handle_timeouted( ) {
|
|
|
|
array_reset( &h->r );
|
|
|
|
array_reset( &h->r );
|
|
|
|
free( h );
|
|
|
|
free( h );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
#ifdef _DEBUG_FDS
|
|
|
|
|
|
|
|
if( !fd_debug_space[i] ) fprintf( stderr, "close on non-open fd\n" );
|
|
|
|
|
|
|
|
fd_debug_space[i] = 0;
|
|
|
|
|
|
|
|
#endif
|
|
|
|
io_close(i);
|
|
|
|
io_close(i);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -521,7 +559,10 @@ int main( int argc, char **argv ) {
|
|
|
|
panic("io_fd");
|
|
|
|
panic("io_fd");
|
|
|
|
|
|
|
|
|
|
|
|
signal( SIGPIPE, SIG_IGN );
|
|
|
|
signal( SIGPIPE, SIG_IGN );
|
|
|
|
signal( SIGINT, graceful );
|
|
|
|
signal( SIGINT, graceful );
|
|
|
|
|
|
|
|
#ifdef _DEBUG_FDS
|
|
|
|
|
|
|
|
signal( SIGINFO, count_fds );
|
|
|
|
|
|
|
|
#endif
|
|
|
|
if( init_logic( serverdir ) == -1 )
|
|
|
|
if( init_logic( serverdir ) == -1 )
|
|
|
|
panic("Logic not started");
|
|
|
|
panic("Logic not started");
|
|
|
|
|
|
|
|
|
|
|
|