Browse code

webkernel: make wk_init expect a server fd instead of a port number

Dario Rodriguez authored on 15/07/2014 11:03:21
Showing 3 changed files
... ...
@@ -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);