... | ... |
@@ -148,15 +148,15 @@ wk_debug_io(char *iotype, int fd, char *ptr, long int size) |
148 | 148 |
|
149 | 149 |
|
150 | 150 |
wk * |
151 |
-wk_init(int port, sselect *ssel, void (*callback_event)(/*wk *web,int connid, wk_event event, void *userptr*/), wk_action (*callback_http)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), wk_action (*callback_post)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), wk_action (*callback_continuation)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), void *userptr) |
|
151 |
+wk_init(int serverfd, sselect *ssel, void (*callback_event)(/*wk *web,int connid, wk_event event, void *userptr*/), wk_action (*callback_http)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), wk_action (*callback_post)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), wk_action (*callback_continuation)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), void *userptr) |
|
152 | 152 |
{ |
153 | 153 |
_wk *web; |
154 |
- if(ssel==NULL || callback_http==NULL) |
|
154 |
+ if(ssel==NULL || callback_http==NULL || serverfd==-1) |
|
155 | 155 |
return(NULL); |
156 | 156 |
if((web=malloc(sizeof(_wk)))==NULL) |
157 | 157 |
return(NULL); |
158 | 158 |
memset(web,0,sizeof(_wk)); |
159 |
- web->serverfd=-1; |
|
159 |
+ web->serverfd=serverfd; |
|
160 | 160 |
web->callback_event=callback_event; |
161 | 161 |
web->callback_http=callback_http; |
162 | 162 |
web->callback_post=callback_post; |
... | ... |
@@ -164,11 +164,6 @@ wk_init(int port, sselect *ssel, void (*callback_event)(/*wk *web,int connid, wk |
164 | 164 |
web->userptr=userptr; |
165 | 165 |
web->ssel=ssel; |
166 | 166 |
FD_ZERO(&(web->fdset)); |
167 |
- if((web->serverfd=ipv4_server(port))==-1) { |
|
168 |
- wk_free((wk *)web),web=NULL; |
|
169 |
- return(NULL); |
|
170 |
- } |
|
171 |
- sock_setunsafe(web->serverfd); |
|
172 | 167 |
FD_SET(web->serverfd,&(web->fdset)); |
173 | 168 |
sselect_addread(ssel,web->serverfd,NULL); |
174 | 169 |
if(web->callback_event!=NULL) |
... | ... |
@@ -188,11 +183,10 @@ wk_free(wk *paramweb) |
188 | 183 |
return; |
189 | 184 |
if(web->callback_event!=NULL) |
190 | 185 |
web->callback_event((wk *)web,-1,wke_fini,web->userptr); |
191 |
- /* release server fds */ |
|
186 |
+ /* unregister the server fd */ |
|
192 | 187 |
if(web->serverfd!=-1) { |
193 | 188 |
sselect_delread(web->ssel,web->serverfd); |
194 | 189 |
FD_CLR(web->serverfd,&(web->fdset)); |
195 |
- close(web->serverfd),web->serverfd=-1; |
|
196 | 190 |
} |
197 | 191 |
/* release client fds and free clients */ |
198 | 192 |
for(i=0;i<web->usedclientblocks;i++) { |
... | ... |
@@ -44,7 +44,7 @@ typedef enum wk_action { |
44 | 44 |
wkact_continuation, |
45 | 45 |
} wk_action; |
46 | 46 |
|
47 |
-wk *wk_init(int port, sselect *ssel, void (*callback_event)(/*wk *web,int connid, wk_event event, void *userptr*/), wk_action (*callback_http)(/*wk *web,int connid, wk_uri *uri, void *userptr*/),wk_action (*callback_post)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), wk_action (*callback_continuation)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), void *userptr); |
|
47 |
+wk *wk_init(int serverfd, sselect *ssel, void (*callback_event)(/*wk *web,int connid, wk_event event, void *userptr*/), wk_action (*callback_http)(/*wk *web,int connid, wk_uri *uri, void *userptr*/),wk_action (*callback_post)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), wk_action (*callback_continuation)(/*wk *web,int connid, wk_uri *uri, void *userptr*/), void *userptr); |
|
48 | 48 |
void wk_free(wk *web); |
49 | 49 |
|
50 | 50 |
wk_uri *wk_geturi(wk *web, int connid); /* for use in callback_event() when wke_closed */ |
... | ... |
@@ -83,8 +83,8 @@ main(int argc, char *argv[]) |
83 | 83 |
} |
84 | 84 |
if(totalfail!=0) |
85 | 85 |
printf("Failed %i of %i tests.\n",totalfail,total); |
86 |
- else |
|
87 |
- printf("Passed %i of %i tests.\n",total,total); |
|
86 |
+ else |
|
87 |
+ printf("Passed %i of %i tests.\n",total,total); |
|
88 | 88 |
return((totalfail!=0)?1:0); |
89 | 89 |
} |
90 | 90 |
|
... | ... |
@@ -399,6 +399,7 @@ webkernel_basic(test_action action) |
399 | 399 |
int fds[2]; |
400 | 400 |
char buf[128]; |
401 | 401 |
int usedbuf; |
402 |
+ int serverfd; |
|
402 | 403 |
char test_request[]={"\ |
403 | 404 |
GET /test.cgi HTTP/1.0\r\n\ |
404 | 405 |
Host: localhost\r\n\ |
... | ... |
@@ -417,9 +418,10 @@ Connection: keep-alive\r\n\ |
417 | 418 |
check=0; |
418 | 419 |
if((ssel=sselect_init())==NULL) |
419 | 420 |
return(STRING_FAIL ": couln't alloc a sselect structure"); |
420 |
- for(port=19747,off=0,check=0;(web=wk_init(port,ssel,NULL,webkernel_basichttp,NULL,NULL,&check))==NULL;off++,port++) |
|
421 |
+ for(port=19747,off=0,check=0;(serverfd=ipv4_server(port))==-1;off++,port++) |
|
421 | 422 |
; |
422 |
- if(web==NULL) { |
|
423 |
+ sock_setunsafe(serverfd); |
|
424 |
+ if((web=wk_init(serverfd,ssel,NULL,webkernel_basichttp,NULL,NULL,&check))==NULL) { |
|
423 | 425 |
webkernel_basicclose(&client,&ssel,&host,&web); |
424 | 426 |
return(STRING_FAIL ": couln't find a free port to init webkernel"); |
425 | 427 |
} |
... | ... |
@@ -487,6 +489,7 @@ Connection: keep-alive\r\n\ |
487 | 489 |
} |
488 | 490 |
close(client),client=-1; |
489 | 491 |
wk_free(web),web=NULL; |
492 |
+ close(serverfd),serverfd=-1; |
|
490 | 493 |
sselect_free(ssel),ssel=NULL; |
491 | 494 |
free(host),host=NULL; |
492 | 495 |
return(STRING_OK); |
... | ... |
@@ -517,6 +520,7 @@ webkernel_dual(test_action action) |
517 | 520 |
int off; |
518 | 521 |
int check; |
519 | 522 |
sselect *ssel; |
523 |
+ int serverfd; |
|
520 | 524 |
int clients[2]; |
521 | 525 |
int c; |
522 | 526 |
char *host; |
... | ... |
@@ -544,9 +548,10 @@ Connection: keep-alive\r\n\ |
544 | 548 |
check=0; |
545 | 549 |
if((ssel=sselect_init())==NULL) |
546 | 550 |
return(STRING_FAIL ": couln't alloc a sselect structure"); |
547 |
- for(port=19747,off=0;(web=wk_init(port,ssel,NULL,webkernel_basichttp,NULL,NULL,&check))==NULL;off++,port++) |
|
551 |
+ for(port=19747,off=0;(serverfd=ipv4_server(port))==-1;off++,port++) |
|
548 | 552 |
; |
549 |
- if(web==NULL) { |
|
553 |
+ sock_setunsafe(serverfd); |
|
554 |
+ if((web=wk_init(serverfd,ssel,NULL,webkernel_basichttp,NULL,NULL,&check))==NULL) { |
|
550 | 555 |
webkernel_dualclose(clients,sizeof(clients)/sizeof(clients[0]),&ssel,&host,&web); |
551 | 556 |
return(STRING_FAIL ": couln't find a free port to init webkernel"); |
552 | 557 |
} |
... | ... |
@@ -621,6 +626,7 @@ Connection: keep-alive\r\n\ |
621 | 626 |
for(c=0;c<(sizeof(clients)/sizeof(clients[0]));c++) |
622 | 627 |
close(clients[c]),clients[c]=-1; |
623 | 628 |
wk_free(web),web=NULL; |
629 |
+ close(serverfd),serverfd=-1; |
|
624 | 630 |
sselect_free(ssel),ssel=NULL; |
625 | 631 |
free(host),host=NULL; |
626 | 632 |
return(STRING_OK); |