summaryrefslogtreecommitdiff
path: root/opentracker.c
diff options
context:
space:
mode:
Diffstat (limited to 'opentracker.c')
-rw-r--r--opentracker.c57
1 files changed, 11 insertions, 46 deletions
diff --git a/opentracker.c b/opentracker.c
index 6b5902e..a2ada33 100644
--- a/opentracker.c
+++ b/opentracker.c
@@ -8,7 +8,6 @@
8#include <sys/types.h> 8#include <sys/types.h>
9#include <sys/stat.h> 9#include <sys/stat.h>
10#include <sys/socket.h> 10#include <sys/socket.h>
11#include <sys/mman.h>
12#include <arpa/inet.h> 11#include <arpa/inet.h>
13#include <unistd.h> 12#include <unistd.h>
14#include <stdlib.h> 13#include <stdlib.h>
@@ -62,8 +61,8 @@ time_t g_now;
62#endif 61#endif
63 62
64/* To always have space for error messages ;) */ 63/* To always have space for error messages ;) */
65char static_inbuf[8192]; 64static char static_inbuf[8192];
66char static_outbuf[8192]; 65static char static_outbuf[8192];
67 66
68#define OT_MAXMULTISCRAPE_COUNT 64 67#define OT_MAXMULTISCRAPE_COUNT 64
69static ot_hash multiscrape_buf[OT_MAXMULTISCRAPE_COUNT]; 68static ot_hash multiscrape_buf[OT_MAXMULTISCRAPE_COUNT];
@@ -103,7 +102,6 @@ int main( int argc, char **argv );
103static void httperror( const int64 s, const char *title, const char *message ); 102static void httperror( const int64 s, const char *title, const char *message );
104static void httpresponse( const int64 s, char *data _DEBUG_HTTPERROR_PARAM(size_t l ) ); 103static void httpresponse( const int64 s, char *data _DEBUG_HTTPERROR_PARAM(size_t l ) );
105 104
106static void sendmmapdata( const int64 s, char *buffer, const size_t size );
107static void sendiovecdata( const int64 s, int iovec_entries, struct iovec *iovector ); 105static void sendiovecdata( const int64 s, int iovec_entries, struct iovec *iovector );
108static void senddata( const int64 s, char *buffer, const size_t size ); 106static void senddata( const int64 s, char *buffer, const size_t size );
109 107
@@ -152,42 +150,6 @@ static void httperror( const int64 s, const char *title, const char *message ) {
152 senddata(s,static_outbuf,reply_size); 150 senddata(s,static_outbuf,reply_size);
153} 151}
154 152
155static void sendmmapdata( const int64 s, char *buffer, size_t size ) {
156 struct http_data *h = io_getcookie( s );
157 char *header;
158 size_t header_size;
159 tai6464 t;
160
161 if( !h ) {
162 munmap( buffer, size );
163 return;
164 }
165 if( h->flag & STRUCT_HTTP_FLAG_ARRAY_USED ) {
166 h->flag &= ~STRUCT_HTTP_FLAG_ARRAY_USED;
167 array_reset( &h->request );
168 }
169
170 header = malloc( SUCCESS_HTTP_HEADER_LENGTH );
171 if( !header ) {
172 munmap( buffer, size );
173 HTTPERROR_500;
174 }
175
176 header_size = sprintf( header, "HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\nContent-Length: %zd\r\n\r\n", size );
177
178 iob_reset( &h->batch );
179 iob_addbuf_free( &h->batch, header, header_size );
180 iob_addbuf_munmap( &h->batch, buffer, size );
181 h->flag |= STRUCT_HTTP_FLAG_IOB_USED;
182
183 /* writeable sockets timeout after twice the pool timeout
184 which defaults to 5 minutes (e.g. after 10 minutes) */
185 taia_now( &t ); taia_addsec( &t, &t, OT_CLIENT_TIMEOUT_SEND );
186 io_timeout( s, t );
187 io_dontwantread( s );
188 io_wantwrite( s );
189}
190
191static void sendiovecdata( const int64 s, int iovec_entries, struct iovec *iovector ) { 153static void sendiovecdata( const int64 s, int iovec_entries, struct iovec *iovector ) {
192 struct http_data *h = io_getcookie( s ); 154 struct http_data *h = io_getcookie( s );
193 char *header; 155 char *header;
@@ -343,9 +305,11 @@ LOG_TO_STDERR( "sync: %d.%d.%d.%d\n", h->ip[0], h->ip[1], h->ip[2], h->ip[3] );
343 } 305 }
344 306
345 if( mode == SYNC_OUT ) { 307 if( mode == SYNC_OUT ) {
346 char *reply; 308 /* Pass this task to the worker thread */
347 if( !( reply_size = return_changeset_for_tracker( &reply ) ) ) HTTPERROR_500; 309 h->flag |= STRUCT_HTTP_FLAG_WAITINGFORTASK;
348 return sendmmapdata( s, reply, reply_size ); 310 sync_deliver( s );
311 io_dontwantread( s );
312 return;
349 } 313 }
350 314
351 /* Simple but proof for now */ 315 /* Simple but proof for now */
@@ -789,8 +753,8 @@ static void server_mainloop( ) {
789 } 753 }
790 754
791 /* See if we need to move our pools */ 755 /* See if we need to move our pools */
792 if( g_now != ot_last_clean_time ) { 756 if( NOW != ot_last_clean_time ) {
793 ot_last_clean_time = g_now; 757 ot_last_clean_time = NOW;
794 clean_all_torrents(); 758 clean_all_torrents();
795 } 759 }
796 } 760 }
@@ -881,7 +845,8 @@ int main( int argc, char **argv ) {
881 if( trackerlogic_init( serverdir ) == -1 ) 845 if( trackerlogic_init( serverdir ) == -1 )
882 panic( "Logic not started" ); 846 panic( "Logic not started" );
883 847
884 g_now = ot_start_time = ot_last_clean_time = time( NULL ); 848 g_now = ot_start_time = time( NULL );
849 ot_last_clean_time = NOW;
885 alarm(5); 850 alarm(5);
886 851
887 server_mainloop( ); 852 server_mainloop( );