diff options
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | opentracker.c | 37 | ||||
| -rw-r--r-- | scan_urlencoded_query.c | 32 | ||||
| -rw-r--r-- | scan_urlencoded_query.h | 2 |
4 files changed, 33 insertions, 40 deletions
| @@ -2,7 +2,7 @@ CC?=gcc | |||
| 2 | CFLAGS+=-I../libowfat -Wall -O2 -pipe | 2 | CFLAGS+=-I../libowfat -Wall -O2 -pipe |
| 3 | LDFLAGS+=-L../libowfat/ -lowfat -s | 3 | LDFLAGS+=-L../libowfat/ -lowfat -s |
| 4 | 4 | ||
| 5 | SOURCES=opentracker.c trackerlogic.c | 5 | SOURCES=opentracker.c trackerlogic.c scan_urlencoded_query.c |
| 6 | 6 | ||
| 7 | opentracker: $(SOURCES) | 7 | opentracker: $(SOURCES) |
| 8 | $(CC) $(SOURCES) -o opentracker $(CFLAGS) $(LDFLAGS) | 8 | $(CC) $(SOURCES) -o opentracker $(CFLAGS) $(LDFLAGS) |
diff --git a/opentracker.c b/opentracker.c index 4a421cc..c420d6f 100644 --- a/opentracker.c +++ b/opentracker.c | |||
| @@ -14,6 +14,9 @@ | |||
| 14 | #include <stdlib.h> | 14 | #include <stdlib.h> |
| 15 | #include <errno.h> | 15 | #include <errno.h> |
| 16 | 16 | ||
| 17 | #include "trackerlogic.h" | ||
| 18 | #include "scan_urlencoded_query.h" | ||
| 19 | |||
| 17 | static void carp(const char* routine) { | 20 | static void carp(const char* routine) { |
| 18 | buffer_puts(buffer_2,routine); | 21 | buffer_puts(buffer_2,routine); |
| 19 | buffer_puts(buffer_2,": "); | 22 | buffer_puts(buffer_2,": "); |
| @@ -112,9 +115,7 @@ e400: | |||
| 112 | } | 115 | } |
| 113 | else | 116 | else |
| 114 | { | 117 | { |
| 115 | char *d; | 118 | char *d, *data; |
| 116 | int64 fd; | ||
| 117 | struct stat s; | ||
| 118 | 119 | ||
| 119 | // expect 'GET /uri?nnbjhg HTTP/1.*' | 120 | // expect 'GET /uri?nnbjhg HTTP/1.*' |
| 120 | c+=4; | 121 | c+=4; |
| @@ -130,19 +131,18 @@ e400: | |||
| 130 | switch( scan_urlencoded_query( &c, data, SCAN_PATH ) ) { | 131 | switch( scan_urlencoded_query( &c, data, SCAN_PATH ) ) { |
| 131 | case 6: /* scrape ? */ | 132 | case 6: /* scrape ? */ |
| 132 | if (!byte_diff(c,6,"scrape")) | 133 | if (!byte_diff(c,6,"scrape")) |
| 133 | goto 404; | 134 | goto e404; |
| 134 | break; | 135 | break; |
| 135 | case 9: | 136 | case 9: |
| 136 | if( !byte_diff(c,8,"announce")) | 137 | if( !byte_diff(c,8,"announce")) |
| 137 | goto 404; | 138 | goto e404; |
| 138 | else { | 139 | else { |
| 139 | // info_hash, left, port, numwant, compact | 140 | // info_hash, left, port, numwant, compact |
| 140 | struct ot_peer peer; | 141 | struct ot_peer peer; |
| 141 | ot_hash hash; | 142 | byte_copy( peer.ip, 4, h->ip ); |
| 142 | byte_copy( peer.ip, h->ip, 4); | ||
| 143 | peer.port = 6881; | 143 | peer.port = 6881; |
| 144 | 144 | ||
| 145 | while( NOCHAMSCANNEN ) { | 145 | while( 1 ) { |
| 146 | data = c; | 146 | data = c; |
| 147 | switch( scan_urlencoded_query( &c, data, SCAN_SEARCHPATH_PARAM ) ) { | 147 | switch( scan_urlencoded_query( &c, data, SCAN_SEARCHPATH_PARAM ) ) { |
| 148 | case -1: /* error */ | 148 | case -1: /* error */ |
| @@ -150,20 +150,21 @@ e400: | |||
| 150 | goto e404; | 150 | goto e404; |
| 151 | case 4: | 151 | case 4: |
| 152 | if(!byte_diff(c,4,"port")) | 152 | if(!byte_diff(c,4,"port")) |
| 153 | /* scan int */ | 153 | /* scan int */ c; |
| 154 | else if(!byte_diff(c,4,"left")) | 154 | else if(!byte_diff(c,4,"left")) |
| 155 | /* scan int */ | 155 | /* scan int */ c; |
| 156 | break; | 156 | break; |
| 157 | case 7: | 157 | case 7: |
| 158 | if(!byte_diff(c,7,"numwant")) | 158 | if(!byte_diff(c,7,"numwant")) |
| 159 | /* scan int */ | 159 | /* scan int */ c; |
| 160 | else if(!byte_diff(c,7,"compact")) | 160 | else if(!byte_diff(c,7,"compact")) |
| 161 | /* scan flag */ | 161 | /* scan flag */ c; |
| 162 | break; | 162 | break; |
| 163 | case 9: /* info_hash */ | 163 | case 9: /* info_hash */ |
| 164 | if(!byte_diff(c,9,"info_hash")) | 164 | if(!byte_diff(c,9,"info_hash")) c; |
| 165 | /* scan 20 bytes */ | 165 | /* scan 20 bytes */ |
| 166 | break; | 166 | break; |
| 167 | } | ||
| 167 | } | 168 | } |
| 168 | } | 169 | } |
| 169 | break; | 170 | break; |
| @@ -176,13 +177,13 @@ e400: | |||
| 176 | c+=fmt_str(c,"HTTP/1.1 Coming Up\r\nContent-Type: text/plain"); | 177 | c+=fmt_str(c,"HTTP/1.1 Coming Up\r\nContent-Type: text/plain"); |
| 177 | c+=fmt_str(c,"\r\nContent-Length: "); | 178 | c+=fmt_str(c,"\r\nContent-Length: "); |
| 178 | /* ANSWER SIZE*/ | 179 | /* ANSWER SIZE*/ |
| 179 | c+=fmt_ulonglong(c,s.st_size); | 180 | c+=fmt_ulonglong(c, 100 ); |
| 180 | c+=fmt_str(c,"\r\nLast-Modified: "); | 181 | c+=fmt_str(c,"\r\nLast-Modified: "); |
| 181 | /* MODIFY DATE */ | 182 | /* MODIFY DATE |
| 182 | c+=fmt_httpdate(c,s.st_mtime); | 183 | c+=fmt_httpdate(c,s.st_mtime); */ |
| 183 | c+=fmt_str(c,"\r\nConnection: close\r\n\r\n"); | 184 | c+=fmt_str(c,"\r\nConnection: close\r\n\r\n"); |
| 184 | iob_addbuf(&h->iob,h->hdrbuf,c - h->hdrbuf); | 185 | iob_addbuf(&h->iob,h->hdrbuf,c - h->hdrbuf); |
| 185 | iob_addbuf(&h->iob,tracker_answer, tzracker_answer_size); | 186 | iob_addbuf(&h->iob,tracker_answer, tracker_answer_size); |
| 186 | } | 187 | } |
| 187 | e404: | 188 | e404: |
| 188 | io_dontwantread(s); | 189 | io_dontwantread(s); |
| @@ -227,7 +228,7 @@ int main() | |||
| 227 | if (h) | 228 | if (h) |
| 228 | { | 229 | { |
| 229 | byte_zero(h,sizeof(struct http_data)); | 230 | byte_zero(h,sizeof(struct http_data)); |
| 230 | byte_copy(h->ip,ip,sizeof(ip)); | 231 | byte_copy(h->ip,sizeof(ip),ip); |
| 231 | io_setcookie(n,h); | 232 | io_setcookie(n,h); |
| 232 | } else | 233 | } else |
| 233 | io_close(n); | 234 | io_close(n); |
diff --git a/scan_urlencoded_query.c b/scan_urlencoded_query.c index 7aeabab..6ba7808 100644 --- a/scan_urlencoded_query.c +++ b/scan_urlencoded_query.c | |||
| @@ -1,13 +1,5 @@ | |||
| 1 | #include "scan.h" | 1 | #include "scan.h" |
| 2 | 2 | #include "scan_urlencoded_query.h" | |
| 3 | #define BREAK_AT_QUESTIONMARK (1<<0) | ||
| 4 | #define BREAK_AT_WHITESPACE (1<<1) | ||
| 5 | #define BREAK_AT_AMPERSAND (1<<2) | ||
| 6 | #define BREAK_AT_EQUALSIGN (1<<3) | ||
| 7 | |||
| 8 | #define SCAN_PATH ( BREAK_AT_QUESTIONMARK | BREAK_AT_WHITESPACE ) | ||
| 9 | #define SCAN_SEARCHPATH_PARAM ( BREAK_AT_EQUALSIGN ) | ||
| 10 | #define SCAN_SEARCHPATH_VALUE ( BREAK_AT_AMPERSAND | BREAK_AT_WHITESPACE ) | ||
| 11 | 3 | ||
| 12 | // Idea is to do a in place replacement or guarantee at least | 4 | // Idea is to do a in place replacement or guarantee at least |
| 13 | // strlen( string ) bytes in deststring | 5 | // strlen( string ) bytes in deststring |
| @@ -17,19 +9,19 @@ | |||
| 17 | // we add '%' to the matrix to not stop at encoded chars. | 9 | // we add '%' to the matrix to not stop at encoded chars. |
| 18 | 10 | ||
| 19 | static const unsigned char reserved_matrix[] = { 0xA2, 0x63, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0x87, 0xFE, 0xFF, 0xFF, 0x47}; | 11 | static const unsigned char reserved_matrix[] = { 0xA2, 0x63, 0xFF, 0x03, 0xFE, 0xFF, 0xFF, 0x87, 0xFE, 0xFF, 0xFF, 0x47}; |
| 20 | inline int is_unreserved( unsigned char c ) const { | 12 | inline int is_unreserved( unsigned char c ) { |
| 21 | if( ( c <= 32 ) || ( c >= 127 ) ) return 0; return 1&(reserved_matrix[(c-32)>>3]>>(c&7)); | 13 | if( ( c <= 32 ) || ( c >= 127 ) ) return 0; return 1&(reserved_matrix[(c-32)>>3]>>(c&7)); |
| 22 | } | 14 | } |
| 23 | 15 | ||
| 24 | size_t scan_urlencoded_query(char **string, char *deststring, int flags) { | 16 | size_t scan_urlencoded_query(char **string, char *deststring, int flags) { |
| 25 | register const unsigned char* s=*(const unsigned char*) string; | 17 | register const unsigned char* s=*(const unsigned char**) string; |
| 26 | const unsigned char *d = deststring; | 18 | unsigned char *d = (unsigned char*)deststring; |
| 27 | register unsigned char b, c; | 19 | register unsigned char b, c; |
| 28 | 20 | ||
| 29 | while ( is_unreserved( c = *s++) ) { | 21 | while ( is_unreserved( c = *s++) ) { |
| 30 | if (c=='%') { | 22 | if (c=='%') { |
| 31 | if( ( c = scan_fromhex(*s++) ) < 0 ) return -1; | 23 | if( ( c = scan_fromhex(*s++) ) == 0xff ) return -1; |
| 32 | if( ( b = scan_fromhex(*s++) ) < 0 ) return -1; | 24 | if( ( b = scan_fromhex(*s++) ) == 0xff ) return -1; |
| 33 | c=(c<<4)|b; | 25 | c=(c<<4)|b; |
| 34 | } | 26 | } |
| 35 | *d++ = c; | 27 | *d++ = c; |
| @@ -37,21 +29,21 @@ size_t scan_urlencoded_query(char **string, char *deststring, int flags) { | |||
| 37 | 29 | ||
| 38 | switch( c ) { | 30 | switch( c ) { |
| 39 | case 0: case '\r': case '\n': case ' ': | 31 | case 0: case '\r': case '\n': case ' ': |
| 40 | if ( flags & BREAK_AT_WHITESPACE == 0 ) return -1; | 32 | if ( ( flags & BREAK_AT_WHITESPACE ) == 0 ) return -1; |
| 41 | break; | 33 | break; |
| 42 | case '?': | 34 | case '?': |
| 43 | if ( flags & BREAK_AT_QUESTIONMARK == 0 ) return -1; | 35 | if ( ( flags & BREAK_AT_QUESTIONMARK ) == 0 ) return -1; |
| 44 | break; | 36 | break; |
| 45 | case '=': | 37 | case '=': |
| 46 | if ( flags & BREAK_AT_EQUALSIGN == 0 ) return -1; | 38 | if ( ( flags & BREAK_AT_EQUALSIGN ) == 0 ) return -1; |
| 47 | break; | 39 | break; |
| 48 | case '&': | 40 | case '&': |
| 49 | if ( flags & BREAK_AT_AMPERSAND == 0 ) return -1; | 41 | if ( ( flags & BREAK_AT_AMPERSAND ) == 0 ) return -1; |
| 50 | break; | 42 | break; |
| 51 | default: | 43 | default: |
| 52 | return -1; | 44 | return -1; |
| 53 | } | 45 | } |
| 54 | 46 | ||
| 55 | *string = s; | 47 | *string = (char *)s; |
| 56 | return d - deststring; | 48 | return d - (unsigned char*)deststring; |
| 57 | } | 49 | } |
diff --git a/scan_urlencoded_query.h b/scan_urlencoded_query.h index 379bc32..03ed730 100644 --- a/scan_urlencoded_query.h +++ b/scan_urlencoded_query.h | |||
| @@ -1,4 +1,4 @@ | |||
| 1 | #ifdef __SCAN_URLENCODED_QUERY_H__ | 1 | #ifndef __SCAN_URLENCODED_QUERY_H__ |
| 2 | #define __SCAN_URLENCODED_QUERY_H__ | 2 | #define __SCAN_URLENCODED_QUERY_H__ |
| 3 | 3 | ||
| 4 | #define BREAK_AT_QUESTIONMARK (1<<0) | 4 | #define BREAK_AT_QUESTIONMARK (1<<0) |
