]> jfr.im git - irc/DALnet/libd.git/commitdiff
Update listener routines to support up and down methods.
authorepiphani <redacted>
Fri, 15 May 2009 14:35:06 +0000 (10:35 -0400)
committerepiphani <redacted>
Fri, 15 May 2009 14:35:06 +0000 (10:35 -0400)
This avoids a possible race condition between listener creation and configuration.

include/sockeng.h
src/listener.c
src/test.c

index edbc1d58a1dc6608ad1ac04e7b80d05b5bdcd2a6..de0ac4ef72d7b390dee3d7c7c32e525b06cc86e8 100644 (file)
@@ -155,6 +155,8 @@ struct _listener {
        int             (*set_parser)(Listener *, int (*)(Client *, char *, int));
        int             (*set_onconnect)(Listener *, int (*)(Client *));
        int             (*set_onclose)(Listener *, void (*)(Client *, int));
+       int             (*up)(Listener *);
+       int             (*down)(Listener *);
 
        int             (*packeter)(Client *, char *, int);
        int             (*parser)(Client *, char *, int);
index 95f5156c7f41b5d027b58aa9b0a10a63e0a8fbab..513043091ae74e8193e92c8e6bd4ff604b48b5e3 100644 (file)
@@ -233,6 +233,28 @@ out_err:
        return -1;
 }
 
+static int listener_up(Listener *l)
+{
+       if(!l->packeter || !l->parser)
+               return RET_INVAL;
+
+       if(l->addr.type == TYPE_IPV6) {
+               if(create_tcp6_listener(l))
+                       return RET_INVAL;
+               return RET_OK;
+       } else if(create_tcp4_listener(l))
+               return RET_INVAL;
+       return RET_OK;
+}
+
+static int listener_down(Listener *l)
+{
+       mfd_del(l->sockeng, &l->fdp);
+       close(l->fdp.fd);
+       l->fdp.fd = -1;
+       return RET_OK;
+}
+
 int create_listener(SockEng *s, unsigned short port, ipvx *address, Listener **l)
 {
        Listener *new;
@@ -265,21 +287,12 @@ int create_listener(SockEng *s, unsigned short port, ipvx *address, Listener **l
        new->set_parser = listener_setparser;
        new->set_onconnect = listener_setonconnect;
        new->set_onclose = listener_setonclose;
+       new->up = listener_up;
+       new->down = listener_down;
 
-       /* FIXME:  egg problem possible here.. must fix */
        new->packeter = NULL;
        new->parser = NULL;
 
-       if(address && address->type == TYPE_IPV6) {
-               if(create_tcp6_listener(new)) {
-                       free(new);
-                       return RET_INVAL;
-               }
-       } else if(create_tcp4_listener(new)) {
-               free(new);
-               return RET_INVAL;
-       }
-
        *l = new;
 
        return RET_OK;
index 3a6eac0772c4a2aa3063d3ace41ba84c81edd719..7555d9fc499419c89672cc7e0bb973e407988367 100644 (file)
@@ -42,6 +42,10 @@ int main(int argc, char *argv[])
                l1->set_packeter(l1, client_packet_thingy);
                l1->set_parser(l1, client_echo_parser);
                l1->set_onclose(l1, client_disconnecty);
+               if(l1->up(l1)) {
+                       printf("no listener create(2)\n");
+                       return -1;
+               }
        }
        while(1) {
                if(s->poll(s, 1)) {