/* Read initial access list */ static void accesslist_readfile( int foo ) { FILE * accesslist_filehandle; ot_hash infohash; char inbuf[512]; foo = foo; accesslist_filehandle = fopen( accesslist_filename, "r" ); /* Free accesslist vector in trackerlogic.c*/ accesslist_reset(); if( accesslist_filehandle == NULL ) { fprintf( stderr, "Warning: Can't open accesslist file: %s (but will try to create it later, if necessary and possible).", accesslist_filename ); return; } /* We do ignore anything that is not of the form "^[:xdigit:]{40}[^:xdigit:].*" */ while( fgets( inbuf, sizeof(inbuf), accesslist_filehandle ) ) { int i; for( i=0; i<20; ++i ) { int eger = 16 * scan_fromhex( inbuf[ 2*i ] ) + scan_fromhex( inbuf[ 1 + 2*i ] ); if( eger < 0 ) continue; infohash[i] = eger; } if( scan_fromhex( inbuf[ 40 ] ) >= 0 ) continue; /* Append accesslist to accesslist vector */ accesslist_addentry( &infohash ); } fclose( accesslist_filehandle ); }
static void getip(int interface) { int fd; struct cmsghdr* x; memset(&mysa4,0,sizeof(mysa4)); memset(&mysa6,0,sizeof(mysa6)); for (x=CMSG_FIRSTHDR(&mh); x; x=CMSG_NXTHDR(&mh,x)) if (x->cmsg_level==SOL_IP && x->cmsg_type==IP_PKTINFO) { mysa4.sin_addr=((struct in_pktinfo*)(CMSG_DATA(x)))->ipi_spec_dst; #ifdef DEBUG printf("found IP %x\n",mysa4.sin_addr.s_addr); #endif } fd=open("/proc/net/if_inet6",O_RDONLY); if (fd!=-1) { char buf[1024]; /* increase as necessary */ int i,j,len; len=read(fd,buf,sizeof buf); if (len>0) { int ok; char* c=buf; char* max=buf+len; ok=0; /* "fec000000000000102c09ffffe53fc52 01 40 40 00 eth0" */ while (c<max) { int a,b; for (i=0; i<16; ++i) { a=scan_fromhex(c[i*2]); b=scan_fromhex(c[i*2+1]); if (a<0 || b<0) goto kaputt; mysa6.sin6_addr.s6_addr[i]=(a<<4)+b; } ok=1; a=scan_fromhex(c[33]); b=scan_fromhex(c[34]); c+=32; if (a<0 || b<0) goto kaputt; if ((a<<4)+b == interface) { ok=1; goto kaputt; } while (c<max && *c!='\n') ++c; ++c; } kaputt: if (!ok) memset(&mysa6,0,sizeof(mysa6)); } close(fd); } }
size_t scan_hexdump(const char *src,char *dest,size_t *destlen) { register const unsigned char* s=(const unsigned char*) src; size_t written=0,i; for (i=0; s[i]; ++i) { int j=scan_fromhex(s[i]); if (j<0) break; dest[written]=j<<4; j=scan_fromhex(s[i+1]); if (j<0) break; dest[written]|=j; ++i; ++written; } *destlen=written; return i; }
size_t scan_ip6_flat(const char* s, char ip[16]) { size_t i; for(i = 0; i < 16; i++) { int tmp; tmp = scan_fromhex((unsigned char)*s++); if(tmp < 0) return 0; ip[i] = (char)(tmp << 4); tmp = scan_fromhex((unsigned char)*s++); if(tmp < 0) return 0; ip[i] = ip[i] | (char)tmp; } return 32; }
unsigned int scan_xlonglong(const char* src,unsigned long long* dest) { register const char *tmp=src; register long long l=0; register unsigned char c; while ((c=scan_fromhex(*tmp))<16) { l=(l<<4)+c; ++tmp; } *dest=l; return tmp-src; }
size_t scan_xshort(const char* src,unsigned short* dest) { register const char *tmp=src; register unsigned short l=0; register unsigned char c; while ((l>>(sizeof(l)*8-4))==0 && (c=(unsigned char)scan_fromhex((unsigned char)*tmp))<16) { l=(unsigned short)((l<<4)+c); ++tmp; } *dest=l; return (size_t)(tmp-src); }
size_t scan_xlongn(const char *src,size_t n,unsigned long *dest) { register const char *tmp=src; register unsigned long l=0; register unsigned char c; while (n-->0 && (l>>(sizeof(l)*8-4))==0 && (c=(unsigned char)scan_fromhex((unsigned char)*tmp))<16) { l=(l<<4)+c; ++tmp; } *dest=l; return (size_t)(tmp-src); }
size_t scan_ldapescape(const char *src,char *dest,size_t *destlen) { register const unsigned char* s=(const unsigned char*) src; size_t written=0,i; for (i=0; s[i]; ++i) { if (s[i]=='\\') { unsigned char c; int j=scan_fromhex(s[i+1]); if (j<0) break; c=j<<4; j=scan_fromhex(s[i+2]); if (j<0) break; if (dest) dest[written]=c|j; i+=2; } else { if (dest) dest[written]=s[i]; } ++written; } if (destlen) *destlen=written; return i; }
unsigned long scan_cescape(const char *src,char *dest,unsigned long *destlen) { register const unsigned char* s=(const unsigned char*) src; unsigned long written=0,i; char c; for (i=0; s[i]; ++i) { if ((c=s[i])=='\\') { switch (s[i+1]) { case 'a': c='\a'; break; case 'b': c='\b'; break; case 'e': c=0x1b; break; case 'f': c='\f'; break; case 'n': c='\n'; break; case 'r': c='\r'; break; case 't': c='\t'; break; case 'v': c='\v'; case '\\': break; case 'x': { unsigned char a,b; a=scan_fromhex(s[i+2]); b=scan_fromhex(s[i+3]); if (a<16 && b<16) { c=(a<<4)+b; i+=2; } } break; default: --i; } ++i; } dest[written]=c; ++written; } *destlen=written; return i; }
size_t scan_jsonescape(const char *src,char *dest,size_t *destlen) { register const unsigned char* s=(const unsigned char*) src; size_t written=0,i; char c; unsigned int prev,cur,todo; prev=cur=(unsigned int)-1; for (i=0; s[i]; ++i) { if ((c=s[i])=='\\') { switch (s[i+1]) { case '\\': if (prev!=(unsigned int)-1) return 0; // lead surrogate not followed by tail surrogate // c='\\'; // c already is backslash break; case 'u': { size_t j; for (cur=j=0; j<4; ++j) { char x=scan_fromhex(s[i+2+j]); if (x<0) return 0; // not hex -> invalid input cur=(cur<<4) | x; } if (cur>=0xd800 && cur<=0xdbff) { // utf-16 surrogate pair; needs to be followed by another // surrogate. We need to read both and convert to UTF-8 if (prev!=(unsigned int)-1) return 0; // two lead surrogates prev=cur; i+=5; // we want i to go up by 6, 1 is done by the for loop continue; // write nothing! } else if (cur>=0xdc00 && cur<=0xdfff) { todo=(cur&0x3ff) | ((prev&0x3ff) << 10) | 0x100000; } else todo=cur; written+=fmt_utf8(dest?dest+written:dest,todo); i+=5; prev=-1; continue; } default: if (prev!=(unsigned int)-1) return 0; // lead surrogate not followed by tail surrogate c=s[i+1]; break; } ++i; } if (dest) dest[written]=c; ++written; } *destlen=written; return i; }
int main(int argc,char* argv[]) { char buf[1024]; size_t l; unsigned char c; printf("%d\n",(c=scan_fromhex('.'))); (void)argc; (void)argv; assert(fmt_jsonescape(buf,"foo\nbar\\",8)==14 && byte_equal(buf,14,"foo\\u000abar\\\\")); memset(buf,0,sizeof(buf)); assert(scan_jsonescape("foo\\u000abar\\\\",buf,&l)==14 && l==8 && byte_equal(buf,8,"foo\nbar\\")); memset(buf,0,sizeof(buf)); /* example from the json spec: G clef U+1D11E encoded using UTF-16 surrogates*/ assert(scan_jsonescape("\\uD834\\uDD1Exyz",buf,&l)==15 && l==7 && byte_equal(buf,7,"\xf4\x8d\x84\x9exyz")); /* 1D11E -> 0001 1101 0001 0001 1110 -> ______00 __011101 __000100 __011110 as utf8: 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx 11110000 10011101 10000100 10011110 f 0 9 d 8 4 9 e */ #if 0 static size_t x; x=23; atomic_add(&x,3); printf("%u\n",x); printf("%u\n",atomic_add_return(&x,-3)); printf("%u\n",compare_and_swap(&x,26,17)); printf("%u\n",compare_and_swap(&x,23,17)); #endif #if 0 atomic_add(&x,3); printf("%u\n",x); x=23; atomic_add(&x,3); assert(x==26); atomic_or(&x,1); assert(x==27); atomic_and(&x,-2); assert(x==26); #endif #if 0 iarray a; char* c; iarray_init(&a,sizeof(io_entry)); printf("15 -> %p\n",c=iarray_allocate(&a,15)); printf("23 -> %p\n",c=iarray_allocate(&a,23)); printf("1234567 -> %p\n",c=iarray_allocate(&a,1234567)); printf("23 -> %p\n",iarray_get(&a,23)); #endif #if 0 io_batch* b=iob_new(1234); int64 fd=open("t.c",0); iob_addbuf(b,"fnord",5); iob_addfile_close(b,fd,0,7365); iob_write(1,b,writecb); #endif #if 0 char dest[1024]; unsigned long len; scan_urlencoded2("libstdc++.tar.gz",dest,&len); buffer_putmflush(buffer_1,dest,"\n"); #endif #if 0 static stralloc sa; stralloc_copym(&sa,"foo ","bar ","baz.\n"); write(1,sa.s,sa.len); #endif #if 0 buffer_putmflush(buffer_1,"foo ","bar ","baz.\n"); #endif #if 0 char* c="fnord"; int fd=open_read(c); errmsg_iam(argv[0]); carp("could not open file `",c,"'"); diesys(23,"could not open file `",c,"'"); #endif #if 0 errmsg_warn("could not open file `",c,"'",0); errmsg_warnsys("could not open file `",c,"'",0); #endif #if 0 char buf[100]="/usr/bin/sh"; int len=str_len(buf); assert(byte_rchr(buf,len,'/')==8); assert(byte_rchr(buf,len,'@')==len); assert(byte_rchr(buf,len,'h')==len-1); printf("%d\n",byte_rchr("x",1,'x')); #endif #if 0 char buf[IP6_FMT+100]; int i; char ip[16]; uint32 scope_id; char* s="fec0::1:220:e0ff:fe69:ad92%eth0/64"; char blubip[16]="\0\0\0\0\0\0\0\0\0\0\xff\xff\x7f\0\0\001"; i=scan_ip6if(s,ip,&scope_id); assert(s[i]=='/'); buffer_put(buffer_1,buf,fmt_ip6if(buf,ip,scope_id)); buffer_putnlflush(buffer_1); buffer_put(buffer_1,buf,fmt_ip6ifc(buf,blubip,scope_id)); buffer_putnlflush(buffer_1); scan_ip6("2001:7d0:0:f015:0:0:0:1",ip); buffer_put(buffer_1,buf,fmt_ip6(buf,ip)); buffer_putnlflush(buffer_1); #endif #if 0 char buf[100]; int i; printf("%d\n",i=fmt_pad(buf,"fnord",5,7,10)); buf[i]=0; puts(buf); #endif #if 0 char ip[16]; char buf[32]; printf("%d (expect 2)\n",scan_ip6("::",ip)); printf("%d (expect 3)\n",scan_ip6("::1",ip)); printf("%d (expect 16)\n",scan_ip6("fec0:0:0:ffff::1/0",ip)); printf("%.*s\n",fmt_ip6(buf,ip),buf); #endif #if 0 static stralloc s,t; stralloc_copys(&s,"fnord"); stralloc_copys(&t,"abc"); printf("%d\n",stralloc_diff(&s,&t)); stralloc_copys(&t,"fnor"); printf("%d\n",stralloc_diff(&s,&t)); stralloc_copys(&t,"fnord"); printf("%d\n",stralloc_diff(&s,&t)); stralloc_copys(&t,"fnordh"); printf("%d\n",stralloc_diff(&s,&t)); stralloc_copys(&t,"hausen"); printf("%d\n",stralloc_diff(&s,&t)); #endif #if 0 static stralloc s; stralloc_copys(&s,"fnord"); printf("%d\n",stralloc_diffs(&s,"abc")); printf("%d\n",stralloc_diffs(&s,"fnor")); printf("%d\n",stralloc_diffs(&s,"fnord")); printf("%d\n",stralloc_diffs(&s,"fnordh")); printf("%d\n",stralloc_diffs(&s,"hausen")); #endif #if 0 printf("%d\n",case_starts("fnordhausen","FnOrD")); printf("%d\n",case_starts("fnordhausen","blah")); #endif #if 0 char buf[]="FnOrD"; case_lowers(buf); puts(buf); #endif #if 0 char buf[100]="foo bar baz"; printf("%d (expect 7)\n",byte_rchr(buf,11,' ')); #endif #if 0 unsigned long size; char* buf=mmap_read(argv[1],&size); if (buf) { unsigned int x=fmt_yenc(0,buf,size); unsigned int y; char* tmp=malloc(x+1); y=fmt_yenc(tmp,buf,size); write(1,tmp,x); } #endif #if 0 char buf[100]; char buf2[100]; unsigned int len,len2; buf[fmt_yenc(buf,"http://localhost/~fefe",22)]=0; buffer_puts(buffer_1,buf); buffer_putsflush(buffer_1,"\n"); if ((buf[len2=scan_yenc(buf,buf2,&len)])!='\n') { buffer_putsflush(buffer_2,"parse error!\n"); return 1; } buffer_put(buffer_1,buf2,len2); buffer_putsflush(buffer_1,"\n"); return 0; #endif #if 0 char buf[100]; char buf2[100]; unsigned int len,len2; buf[fmt_base64(buf,"foo:bar",7)]=0; buffer_puts(buffer_1,buf); buffer_putsflush(buffer_1,"\n"); if ((buf[len2=scan_base64(buf,buf2,&len)])!=0) { buffer_putsflush(buffer_2,"parse error!\n"); return 1; } buffer_put(buffer_1,buf2,len2); buffer_putsflush(buffer_1,"\n"); return 0; #endif #if 0 unsigned long size; char* buf=mmap_read(argv[1],&size); if (buf) { unsigned int x=fmt_uuencoded(0,buf,size); unsigned int y; char* tmp=malloc(x+1); y=fmt_uuencoded(tmp,buf,size); write(1,tmp,x); } #endif #if 0 char buf[]="00000000000000000000000000000001"; char ip[16]; if (scan_ip6_flat(buf,ip) != str_len(buf)) buffer_putsflush(buffer_2,"parse error!\n"); #endif #if 0 int fd=open_read("t.c"); buffer b; char buf[1024]; char line[20]; int i; buffer_init(&b,read,fd,buf,1024); i=buffer_getline(&b,line,19); buffer_puts(buffer_1,"getline returned "); buffer_putulong(buffer_1,i); buffer_puts(buffer_1,"\n"); buffer_puts(buffer_1,line); buffer_flush(buffer_1); #endif #if 0 buffer_putulong(buffer_1,23); // buffer_putspace(buffer_1); buffer_putsflush(buffer_1,"\n"); // buffer_flush(buffer_1); #endif #if 0 long a,b,c; char buf[4096]; char buf2[4096]; memcpy(buf,buf2,4096); byte_copy(buf,4096,buf2); rdtscl(a); memcpy(buf,buf2,4096); rdtscl(b); byte_copy(buf,4096,buf2); rdtscl(c); printf("memcpy: %d - byte_copy: %d\n",b-a,c-b); #endif #if 0 char ip[16]; int i; if ((i=scan_ip6(argv[1],ip))) { char buf[128]; buf[fmt_ip6(buf,ip)]=0; puts(buf); } #endif #if 0 char buf[100]; strcpy(buf,"foobarbaz"); buf[fmt_fill(buf,3,5,100)]=0; printf("\"%s\"\n",buf); #endif #if 0 unsigned long len; char *c=mmap_read("/etc/passwd",&len); printf("got map %p of len %lu\n",c,len); #endif #if 0 char c; printf("%d\n",buffer_getc(buffer_0,&c)); printf("%c\n",c); #endif #if 0 char buf[100]="01234567890123456789012345678901234567890123456789"; long a,b,c; #endif #if 0 buf[ip4_fmt(buf,ip4loopback)]=0; buffer_puts(buffer_1small,buf); buffer_flush(buffer_1small); #endif #if 0 buf[0]=0; buf[fmt_8long(buf,0)]=0; puts(buf); rdtscl(a); c=str_len(buf); rdtscl(b); /*byte_zero_djb(buf,j); */ // printf("\n%lu %d\n",b-a,c); #endif #if 0 buffer_puts(buffer_1small,"hello, world\n"); buffer_flush(buffer_1small); #endif #if 0 int s=socket_tcp4(); char ip[4]={127,0,0,1}; int t=socket_connect4(s,ip,80); #endif #if 0 char buf[100]="foo bar baz fnord "; char buf2[100]="foo braz fnord"; long a,b,c; long i=0,j=0,k=0; double d; uint32 l,m,n; stralloc sa={0}; stralloc_copys(&sa,"fnord"); stralloc_catlong0(&sa,-23,5); stralloc_append(&sa,"\n"); printf("%d %d\n",str_equal("fnord","fnord1"),str_equal("fnord1","fnord")); write(1,sa.s,sa.len); printf("%d %d\n",stralloc_starts(&sa,"fnord"),stralloc_starts(&sa,"fnord\na")); l=0xdeadbeef; uint32_pack_big((char*)&m,l); uint32_unpack_big((char*)&m,&n); printf("%x %x %x\n",l,m,n); rdtscl(a); /* i=scan_double("3.1415",&d); */ rdtscl(b); /*byte_zero_djb(buf,j); */ rdtscl(c); printf("%lu %lu\n",b-a,c-b); #endif #if 0 size_t size; char* buf=mmap_read(argv[1],&size); if (buf) { unsigned int x=fmt_urlencoded2(0,buf,size,"x"); unsigned int y; char* tmp=malloc(x+1); y=fmt_urlencoded2(tmp,buf,size,"x"); write(1,tmp,x); } #endif #if 0 printf("%d %d\n",strcmp("foo","bar"),str_diff("foo","bar")); printf("%d %d\n",strcmp("foo","\xfcar"),str_diff("foo","\xfcar")); #endif #if 0 { int16 a; int32 b; int64 c; assert(imult16(4,10000,&a)==0); assert(imult16(-4,10000,&a)==0); assert(imult16(5,10,&a)==1 && a==50); assert(imult16(-3,10000,&a)==1 && a==-30000); assert(imult32(0x40000000,2,&b)==0); assert(imult32(0x3fffffff,2,&b)==1 && b==0x7ffffffe); assert(imult64(0x4000000000000000ll,2,&c)==0); assert(imult64(0x3fffffffffffffffll,2,&c)==1 && c==0x7ffffffffffffffell); } #endif #if 0 stralloc a; printf("%d\n",stralloc_copym(&a,"fnord",", ","foo")); #endif return 0; }