mirror of
				git://erdgeist.org/opentracker
				synced 2025-11-01 02:13:24 +08:00 
			
		
		
		
	Started to implement glue
This commit is contained in:
		
							parent
							
								
									e31f00dac1
								
							
						
					
					
						commit
						1c1fd9fe4a
					
				| @ -31,7 +31,6 @@ struct http_data { | |||||||
|   io_batch iob; |   io_batch iob; | ||||||
|   char* hdrbuf; |   char* hdrbuf; | ||||||
|   int hlen; |   int hlen; | ||||||
|   int keepalive; |  | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| int header_complete(struct http_data* r) { | int header_complete(struct http_data* r) { | ||||||
| @ -58,9 +57,7 @@ void httperror(struct http_data* r,const char* title,const char* message) { | |||||||
|   } else { |   } else { | ||||||
|     c+=fmt_str(c,"HTTP/1.0 "); |     c+=fmt_str(c,"HTTP/1.0 "); | ||||||
|     c+=fmt_str(c,title); |     c+=fmt_str(c,title); | ||||||
|     c+=fmt_str(c,"\r\nContent-Type: text/html\r\nConnection: "); |     c+=fmt_str(c,"\r\nContent-Type: text/html\r\nConnection: close\r\nContent-Length: "); | ||||||
|     c+=fmt_str(c,r->keepalive?"keep-alive":"close"); |  | ||||||
|     c+=fmt_str(c,"\r\nContent-Length: "); |  | ||||||
|     c+=fmt_ulong(c,strlen(message)+strlen(title)+16-4); |     c+=fmt_ulong(c,strlen(message)+strlen(title)+16-4); | ||||||
|     c+=fmt_str(c,"\r\n\r\n<title>"); |     c+=fmt_str(c,"\r\n\r\n<title>"); | ||||||
|     c+=fmt_str(c,title+4); |     c+=fmt_str(c,title+4); | ||||||
| @ -70,48 +67,6 @@ void httperror(struct http_data* r,const char* title,const char* message) { | |||||||
|   iob_addbuf(&r->iob,r->hdrbuf,r->hlen); |   iob_addbuf(&r->iob,r->hdrbuf,r->hlen); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| static struct mimeentry { const char* name, *type; } mimetab[] = { |  | ||||||
|   { "html",	"text/html" }, |  | ||||||
|   { "css",	"text/css" }, |  | ||||||
|   { "dvi",	"application/x-dvi" }, |  | ||||||
|   { "ps",	"application/postscript" }, |  | ||||||
|   { "pdf",	"application/pdf" }, |  | ||||||
|   { "gif",	"image/gif" }, |  | ||||||
|   { "png",	"image/png" }, |  | ||||||
|   { "jpeg",	"image/jpeg" }, |  | ||||||
|   { "jpg",	"image/jpeg" }, |  | ||||||
|   { "mpeg",	"video/mpeg" }, |  | ||||||
|   { "mpg",	"video/mpeg" }, |  | ||||||
|   { "avi",	"video/x-msvideo" }, |  | ||||||
|   { "mov",	"video/quicktime" }, |  | ||||||
|   { "qt",	"video/quicktime" }, |  | ||||||
|   { "mp3",	"audio/mpeg" }, |  | ||||||
|   { "ogg",	"audio/x-oggvorbis" }, |  | ||||||
|   { "wav",	"audio/x-wav" }, |  | ||||||
|   { "pac",	"application/x-ns-proxy-autoconfig" }, |  | ||||||
|   { "sig",	"application/pgp-signature" }, |  | ||||||
|   { "torrent",	"application/x-bittorrent" }, |  | ||||||
|   { "class",	"application/octet-stream" }, |  | ||||||
|   { "js",	"application/x-javascript" }, |  | ||||||
|   { "tar",	"application/x-tar" }, |  | ||||||
|   { "zip",	"application/zip" }, |  | ||||||
|   { "dtd",	"text/xml" }, |  | ||||||
|   { "xml",	"text/xml" }, |  | ||||||
|   { "xbm",	"image/x-xbitmap" }, |  | ||||||
|   { "xpm",	"image/x-xpixmap" }, |  | ||||||
|   { "xwd",	"image/x-xwindowdump" }, |  | ||||||
|   { 0,0 } }; |  | ||||||
| 
 |  | ||||||
| const char* mimetype(const char* filename) { |  | ||||||
|   int i,e=str_rchr(filename,'.'); |  | ||||||
|   if (filename[e]==0) return "text/plain"; |  | ||||||
|   ++e; |  | ||||||
|   for (i=0; mimetab[i].name; ++i) |  | ||||||
|     if (str_equal(mimetab[i].name,filename+e)) |  | ||||||
|       return mimetab[i].type; |  | ||||||
|   return "application/octet-stream"; |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| const char* http_header(struct http_data* r,const char* h) { | const char* http_header(struct http_data* r,const char* h) { | ||||||
|   long i; |   long i; | ||||||
|   long l=array_bytes(&r->r); |   long l=array_bytes(&r->r); | ||||||
| @ -128,7 +83,6 @@ const char* http_header(struct http_data* r,const char* h) { | |||||||
| 
 | 
 | ||||||
| void httpresponse(struct http_data* h,int64 s) { | void httpresponse(struct http_data* h,int64 s) { | ||||||
|   char* c; |   char* c; | ||||||
|   const char* m; |  | ||||||
|   array_cat0(&h->r); |   array_cat0(&h->r); | ||||||
|   c=array_start(&h->r); |   c=array_start(&h->r); | ||||||
|   if (byte_diff(c,4,"GET ")) { |   if (byte_diff(c,4,"GET ")) { | ||||||
| @ -152,28 +106,15 @@ e404: | |||||||
| 	io_close(fd); | 	io_close(fd); | ||||||
| 	goto e404; | 	goto e404; | ||||||
|       } |       } | ||||||
|       if ((m=http_header(h,"Connection"))) { |  | ||||||
| 	if (str_equal(m,"keep-alive")) |  | ||||||
| 	  h->keepalive=1; |  | ||||||
| 	else |  | ||||||
| 	  h->keepalive=0; |  | ||||||
|       } else { |  | ||||||
| 	if (byte_equal(d+1,8,"HTTP/1.0")) |  | ||||||
| 	  h->keepalive=0; |  | ||||||
| 	else |  | ||||||
| 	  h->keepalive=1; |  | ||||||
|       } |  | ||||||
|       m=mimetype(c); |  | ||||||
|       c=h->hdrbuf=(char*)malloc(500); |       c=h->hdrbuf=(char*)malloc(500); | ||||||
|       c+=fmt_str(c,"HTTP/1.1 Coming Up\r\nContent-Type: "); |       c+=fmt_str(c,"HTTP/1.1 Coming Up\r\nContent-Type: text/plain"); | ||||||
|       c+=fmt_str(c,m); |  | ||||||
|       c+=fmt_str(c,"\r\nContent-Length: "); |       c+=fmt_str(c,"\r\nContent-Length: "); | ||||||
|  | /* ANSWER SIZE*/ | ||||||
|       c+=fmt_ulonglong(c,s.st_size); |       c+=fmt_ulonglong(c,s.st_size); | ||||||
|       c+=fmt_str(c,"\r\nLast-Modified: "); |       c+=fmt_str(c,"\r\nLast-Modified: "); | ||||||
|  | /* MODIFY DATE */ | ||||||
|       c+=fmt_httpdate(c,s.st_mtime); |       c+=fmt_httpdate(c,s.st_mtime); | ||||||
|       c+=fmt_str(c,"\r\nConnection: "); |       c+=fmt_str(c,"\r\nConnection: close\r\n\r\n"); | ||||||
|       c+=fmt_str(c,h->keepalive?"keep-alive":"close"); |  | ||||||
|       c+=fmt_str(c,"\r\n\r\n"); |  | ||||||
|       iob_addbuf(&h->iob,h->hdrbuf,c - h->hdrbuf); |       iob_addbuf(&h->iob,h->hdrbuf,c - h->hdrbuf); | ||||||
|       iob_addfile(&h->iob,fd,0,s.st_size); |       iob_addfile(&h->iob,fd,0,s.st_size); | ||||||
|     } |     } | ||||||
| @ -201,14 +142,6 @@ int main() { | |||||||
|       if (i==s) { |       if (i==s) { | ||||||
| 	int n; | 	int n; | ||||||
| 	while ((n=socket_accept6(s,ip,&port,&scope_id))!=-1) { | 	while ((n=socket_accept6(s,ip,&port,&scope_id))!=-1) { | ||||||
| 	  char buf[IP6_FMT]; |  | ||||||
| 	  buffer_puts(buffer_2,"accepted new connection from "); |  | ||||||
| 	  buffer_put(buffer_2,buf,fmt_ip6(buf,ip)); |  | ||||||
| 	  buffer_puts(buffer_2,":"); |  | ||||||
| 	  buffer_putulong(buffer_2,port); |  | ||||||
| 	  buffer_puts(buffer_2," (fd "); |  | ||||||
| 	  buffer_putulong(buffer_2,n); |  | ||||||
| 	  buffer_puts(buffer_2,")"); |  | ||||||
| 	  if (io_fd(n)) { | 	  if (io_fd(n)) { | ||||||
| 	    struct http_data* h=(struct http_data*)malloc(sizeof(struct http_data)); | 	    struct http_data* h=(struct http_data*)malloc(sizeof(struct http_data)); | ||||||
| 	    io_wantread(n); | 	    io_wantread(n); | ||||||
| @ -217,10 +150,8 @@ int main() { | |||||||
| 	      io_setcookie(n,h); | 	      io_setcookie(n,h); | ||||||
| 	    } else | 	    } else | ||||||
| 	      io_close(n); | 	      io_close(n); | ||||||
| 	  } else { | 	  } else | ||||||
| 	    buffer_puts(buffer_2,", but io_fd failed."); |  | ||||||
| 	    io_close(n); | 	    io_close(n); | ||||||
| 	  } |  | ||||||
| 	  buffer_putnlflush(buffer_2); | 	  buffer_putnlflush(buffer_2); | ||||||
| 	} | 	} | ||||||
| 	if (errno==EAGAIN) | 	if (errno==EAGAIN) | ||||||
| @ -237,11 +168,6 @@ int main() { | |||||||
| 	    iob_reset(&h->iob); | 	    iob_reset(&h->iob); | ||||||
| 	    free(h->hdrbuf); h->hdrbuf=0; | 	    free(h->hdrbuf); h->hdrbuf=0; | ||||||
| 	  } | 	  } | ||||||
| 	  buffer_puts(buffer_2,"io_tryread("); |  | ||||||
| 	  buffer_putulong(buffer_2,i); |  | ||||||
| 	  buffer_puts(buffer_2,"): "); |  | ||||||
| 	  buffer_puterror(buffer_2); |  | ||||||
| 	  buffer_putnlflush(buffer_2); |  | ||||||
| 	  io_close(i); | 	  io_close(i); | ||||||
| 	} else if (l==0) { | 	} else if (l==0) { | ||||||
| 	  if (h) { | 	  if (h) { | ||||||
| @ -249,12 +175,8 @@ int main() { | |||||||
| 	    iob_reset(&h->iob); | 	    iob_reset(&h->iob); | ||||||
| 	    free(h->hdrbuf); h->hdrbuf=0; | 	    free(h->hdrbuf); h->hdrbuf=0; | ||||||
| 	  } | 	  } | ||||||
| 	  buffer_puts(buffer_2,"eof on fd #"); |  | ||||||
| 	  buffer_putulong(buffer_2,i); |  | ||||||
| 	  buffer_putnlflush(buffer_2); |  | ||||||
| 	  io_close(i); | 	  io_close(i); | ||||||
| 	} else if (l>0) { | 	} else if (l>0) { | ||||||
| buffer_puts(buffer_2,"Garr"); |  | ||||||
| 	  array_catb(&h->r,buf,l); | 	  array_catb(&h->r,buf,l); | ||||||
| 	  if (array_failed(&h->r)) { | 	  if (array_failed(&h->r)) { | ||||||
| 	    httperror(h,"500 Server Error","request too long."); | 	    httperror(h,"500 Server Error","request too long."); | ||||||
| @ -272,16 +194,11 @@ emerge: | |||||||
|     while ((i=io_canwrite())!=-1) { |     while ((i=io_canwrite())!=-1) { | ||||||
|       struct http_data* h=io_getcookie(i); |       struct http_data* h=io_getcookie(i); | ||||||
|       int64 r=iob_send(i,&h->iob); |       int64 r=iob_send(i,&h->iob); | ||||||
| /*      printf("iob_send returned %lld\n",r); */ |  | ||||||
|       if (r==-1) io_eagain(i); else |       if (r==-1) io_eagain(i); else | ||||||
|       if (r<=0) { |       if (r<=0) { | ||||||
| 	array_trunc(&h->r); | 	array_trunc(&h->r); | ||||||
| 	iob_reset(&h->iob); | 	iob_reset(&h->iob); | ||||||
| 	free(h->hdrbuf); h->hdrbuf=0; | 	free(h->hdrbuf); h->hdrbuf=0; | ||||||
| 	if (h->keepalive) { |  | ||||||
| 	  io_dontwantwrite(i); |  | ||||||
| 	  io_wantread(i); |  | ||||||
| 	} else |  | ||||||
|         io_close(i); |         io_close(i); | ||||||
|       } |       } | ||||||
|     } |     } | ||||||
|  | |||||||
| @ -250,10 +250,13 @@ void count_peers_and_seeds( ot_peer peer_list, unsigned long *peers, unsigned lo | |||||||
|     } while( compare_ip_port( peer_list + *peers, peer_list + *peers - 1 ) < 0 ); |     } while( compare_ip_port( peer_list + *peers, peer_list + *peers - 1 ) < 0 ); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int init_logic( ) { | int init_logic( char *directory ) { | ||||||
|   glob_t globber; |   glob_t globber; | ||||||
|   int i; |   int i; | ||||||
| 
 | 
 | ||||||
|  |   if( directory ) | ||||||
|  |    chdir( directory ); | ||||||
|  | 
 | ||||||
|   scratch_space    = map_file( "" ); |   scratch_space    = map_file( "" ); | ||||||
|   torrents_list    = map_file( "" ); |   torrents_list    = map_file( "" ); | ||||||
|   torrents_count   = 0; |   torrents_count   = 0; | ||||||
|  | |||||||
| @ -57,4 +57,15 @@ void *binary_search( const void *key, const void *base, | |||||||
|                      int (*compar) (const void *, const void *), |                      int (*compar) (const void *, const void *), | ||||||
|                      int *exactmatch ); |                      int *exactmatch ); | ||||||
| 
 | 
 | ||||||
|  | //
 | ||||||
|  | // Exported functions
 | ||||||
|  | //
 | ||||||
|  | 
 | ||||||
|  | int  init_logic( char *chdir_directory ); | ||||||
|  | void deinit_logic( ); | ||||||
|  | 
 | ||||||
|  | ot_torrent add_peer_to_torrent( ot_hash hash, ot_peer peer ); | ||||||
|  | void return_peers_for_torrent( ot_torrent torrent, unsigned long amount, char *reply ); | ||||||
|  | void heal_torrent( ot_torrent torrent ); | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user
	 erdgeist
						erdgeist