diff options
| -rw-r--r-- | Makefile | 4 | ||||
| -rw-r--r-- | opentracker.c | 49 |
2 files changed, 16 insertions, 37 deletions
| @@ -1,6 +1,6 @@ | |||
| 1 | CC?=gcc | 1 | CC?=gcc |
| 2 | CFLAGS+=-I../libowfat -Wall -pipe -O2 | 2 | CFLAGS+=-I../libowfat -Wall -pipe -Os |
| 3 | LDFLAGS+=-L../libowfat/ -lowfat -s -lm | 3 | LDFLAGS+=-L../libowfat/ -lowfat -s |
| 4 | 4 | ||
| 5 | HEADERS=trackerlogic.h scan_urlencoded_query.h | 5 | HEADERS=trackerlogic.h scan_urlencoded_query.h |
| 6 | SOURCES=opentracker.c trackerlogic.c scan_urlencoded_query.c | 6 | SOURCES=opentracker.c trackerlogic.c scan_urlencoded_query.c |
diff --git a/opentracker.c b/opentracker.c index 83c340c..a0316cf 100644 --- a/opentracker.c +++ b/opentracker.c | |||
| @@ -38,8 +38,6 @@ static void panic(const char* routine) { | |||
| 38 | struct http_data { | 38 | struct http_data { |
| 39 | array r; | 39 | array r; |
| 40 | io_batch iob; | 40 | io_batch iob; |
| 41 | char* hdrbuf; | ||
| 42 | int hlen; | ||
| 43 | unsigned long ip; | 41 | unsigned long ip; |
| 44 | }; | 42 | }; |
| 45 | 43 | ||
| @@ -61,28 +59,13 @@ int header_complete(struct http_data* r) | |||
| 61 | return 0; | 59 | return 0; |
| 62 | } | 60 | } |
| 63 | 61 | ||
| 64 | void httperror(struct http_data* r,const char* title,const char* message) | 62 | void httperror(struct http_data* h,const char* title,const char* message) |
| 65 | { | 63 | { |
| 66 | char* c; | 64 | char* c = (char*)malloc(strlen(message)+strlen(title)+200); |
| 67 | c=r->hdrbuf=(char*)malloc(strlen(message)+strlen(title)+200); | 65 | if( !c) iob_addbuf(&h->iob, "HTTP/1.0 500 internal error\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\nout of memory\n", 90); |
| 68 | 66 | else iob_addbuf_free( &h->iob, c, | |
| 69 | if (!c) | 67 | sprintf( c, "HTTP/1.0 %s\r\nContent-Type: text/html\r\nConnection: close\r\nContent-Length: %ld\r\n\r\n<title>%s</title>\n", |
| 70 | { | 68 | title, strlen(message)+strlen(title)+16-4,title+4) ); |
| 71 | r->hdrbuf="HTTP/1.0 500 internal error\r\nContent-Type: text/plain\r\nConnection: close\r\n\r\nout of memory\n"; | ||
| 72 | r->hlen=strlen(r->hdrbuf); | ||
| 73 | } | ||
| 74 | else | ||
| 75 | { | ||
| 76 | c+=fmt_str(c,"HTTP/1.0 "); | ||
| 77 | c+=fmt_str(c,title); | ||
| 78 | c+=fmt_str(c,"\r\nContent-Type: text/html\r\nConnection: close\r\nContent-Length: "); | ||
| 79 | c+=fmt_ulong(c,strlen(message)+strlen(title)+16-4); | ||
| 80 | c+=fmt_str(c,"\r\n\r\n<title>"); | ||
| 81 | c+=fmt_str(c,title+4); | ||
| 82 | c+=fmt_str(c,"</title>\n"); | ||
| 83 | r->hlen=c - r->hdrbuf; | ||
| 84 | } | ||
| 85 | iob_addbuf(&r->iob,r->hdrbuf,r->hlen); | ||
| 86 | } | 69 | } |
| 87 | 70 | ||
| 88 | // bestimmten http parameter auslesen und adresse zurueckgeben | 71 | // bestimmten http parameter auslesen und adresse zurueckgeben |
| @@ -279,7 +262,7 @@ e500: | |||
| 279 | reply = malloc( numwant*6+128 ); // peerlist + seeder, peers and lametta n*6+81 a.t.m. | 262 | reply = malloc( numwant*6+128 ); // peerlist + seeder, peers and lametta n*6+81 a.t.m. |
| 280 | if( reply ) | 263 | if( reply ) |
| 281 | reply_size = return_peers_for_torrent( torrent, numwant, reply ); | 264 | reply_size = return_peers_for_torrent( torrent, numwant, reply ); |
| 282 | if( !reply || ( reply_size < 0 ) ) { | 265 | if( !reply || ( reply_size <= 0 ) ) { |
| 283 | if( reply ) free( reply ); | 266 | if( reply ) free( reply ); |
| 284 | goto e500; | 267 | goto e500; |
| 285 | } | 268 | } |
| @@ -301,12 +284,9 @@ e404: | |||
| 301 | goto bailout; | 284 | goto bailout; |
| 302 | } | 285 | } |
| 303 | 286 | ||
| 304 | c=h->hdrbuf=(char*)malloc(80); | 287 | c=(char*)malloc(80); |
| 305 | c+=fmt_str(c,"HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\nContent-Length: "); | 288 | iob_addbuf_free( &h->iob, c, sprintf( c, "HTTP/1.0 200 OK\r\nContent-Type: text/plain\r\nContent-Length: %ld\r\n\r\n", (long)reply_size )); |
| 306 | c+=fmt_ulonglong(c, reply_size ); | 289 | if( reply && reply_size ) iob_addbuf_free(&h->iob, reply, reply_size ); |
| 307 | c+=fmt_str(c,"\r\n\r\n"); | ||
| 308 | iob_addbuf(&h->iob,h->hdrbuf,c - h->hdrbuf); | ||
| 309 | if( reply && reply_size ) iob_addbuf_free(&h->iob,reply, reply_size ); | ||
| 310 | 290 | ||
| 311 | bailout: | 291 | bailout: |
| 312 | io_dontwantread(s); | 292 | io_dontwantread(s); |
| @@ -388,7 +368,7 @@ int main() | |||
| 388 | { | 368 | { |
| 389 | array_reset(&h->r); | 369 | array_reset(&h->r); |
| 390 | iob_reset(&h->iob); | 370 | iob_reset(&h->iob); |
| 391 | free(h->hdrbuf); h->hdrbuf=0; | 371 | free(h); |
| 392 | } | 372 | } |
| 393 | io_close(i); | 373 | io_close(i); |
| 394 | } | 374 | } |
| @@ -421,15 +401,14 @@ emerge: | |||
| 421 | struct http_data* h=io_getcookie(i); | 401 | struct http_data* h=io_getcookie(i); |
| 422 | 402 | ||
| 423 | int64 r=iob_send(i,&h->iob); | 403 | int64 r=iob_send(i,&h->iob); |
| 424 | |||
| 425 | if (r==-1) | 404 | if (r==-1) |
| 426 | io_eagain(i); | 405 | io_eagain(i); |
| 427 | else | 406 | else |
| 428 | if (r<=0) | 407 | if ((r<=0)||(h->iob.bytesleft==0)) |
| 429 | { | 408 | { |
| 430 | array_trunc(&h->r); | 409 | array_reset(&h->r); |
| 431 | iob_reset(&h->iob); | 410 | iob_reset(&h->iob); |
| 432 | free(h->hdrbuf); h->hdrbuf=0; free(h); | 411 | free(h); |
| 433 | io_close(i); | 412 | io_close(i); |
| 434 | } | 413 | } |
| 435 | } | 414 | } |
