Revert to previous socket scheme.
authorfredrik <fredrik@959494ce-11ee-0310-bf91-de5d638817bd>
Tue, 30 Jan 2007 11:12:26 +0000 (11:12 +0000)
committerfredrik <fredrik@959494ce-11ee-0310-bf91-de5d638817bd>
Tue, 30 Jan 2007 11:12:26 +0000 (11:12 +0000)
git-svn-id: svn+ssh://svn.dolda2000.com/srv/svn/repos/src/doldaconnect@839 959494ce-11ee-0310-bf91-de5d638817bd

daemon/client.c
daemon/filenet.c
daemon/filenet.h
daemon/fnet-adc.c
daemon/fnet-dc.c
daemon/net.c
daemon/net.h
daemon/transfer.c
daemon/ui.c
include/utils.h

index fc2776b..7cdfbe3 100644 (file)
@@ -408,7 +408,7 @@ static void writehashcache(int now)
     fclose(stream);
 }
 
-static int hashread(struct socket *sk, void *uudata)
+static void hashread(struct socket *sk, void *uudata)
 {
     static char *hashbuf;
     static size_t hashbufsize = 0, hashbufdata = 0;
@@ -422,7 +422,7 @@ static int hashread(struct socket *sk, void *uudata)
     struct hashcache *hc;
     
     if((buf = sockgetinbuf(sk, &bufsize)) == NULL)
-       return(0);
+       return;
     bufcat(hashbuf, buf, bufsize);
     free(buf);
     while((lp = memchr(hashbuf, '\n', hashbufdata)) != NULL)
@@ -464,7 +464,6 @@ static int hashread(struct socket *sk, void *uudata)
        }
        memmove(hashbuf, lp, hashbufdata -= (lp - hashbuf));
     }
-    return(0);
 }
 
 static void hashexit(pid_t pid, int status, struct socket *outsock)
@@ -543,7 +542,7 @@ static int hashfile(char *path)
     close(fd);
     close(pfd[1]);
     outsock = wrapsock(pfd[0]);
-    CBREG(outsock, socket_read, hashread, NULL, NULL);
+    outsock->readcb = hashread;
     childcallback(hashjob, (void (*)(pid_t, int, void *))hashexit, outsock);
     return(0);
 }
index 99e094a..be6c5af 100644 (file)
@@ -67,18 +67,22 @@ void killfnetnode(struct fnetnode *fn)
     if(fn->sk != NULL)
     {
        fn->sk->close = 1;
+       if(fn->sk->data == fn)
+       {
+           fn->sk->data = NULL;
+           putfnetnode(fn);
+       }
        putsock(fn->sk);
        fn->sk = NULL;
     }
 }
 
-struct fnetnode *getfnetnode(struct fnetnode *fn)
+void getfnetnode(struct fnetnode *fn)
 {
     fn->refcount++;
 #ifdef DEBUG
     fprintf(stderr, "getfnetnode on id %i at %p, refcount=%i\n", fn->id, fn, fn->refcount);
 #endif
-    return(fn);
 }
 
 void putfnetnode(struct fnetnode *fn)
@@ -159,20 +163,19 @@ void unlinkfnetnode(struct fnetnode *fn)
     putfnetnode(fn);
 }
 
-static int conncb(struct socket *sk, int err, struct fnetnode *data)
+static void conncb(struct socket *sk, int err, struct fnetnode *data)
 {
     if(err != 0)
     {
        killfnetnode(data);
        putfnetnode(data);
-       return(1);
+       return;
     }
     data->sk = sk;
     fnetsetstate(data, FNN_HS);
     socksettos(sk, confgetint("fnet", "fntos"));
     data->fnet->connect(data);
     putfnetnode(data);
-    return(1);
 }
 
 static void resolvecb(struct sockaddr *addr, int addrlen, struct fnetnode *data)
@@ -182,7 +185,7 @@ static void resolvecb(struct sockaddr *addr, int addrlen, struct fnetnode *data)
        killfnetnode(data);
        putfnetnode(data);
     } else {
-       netcsconn(addr, addrlen, (int (*)(struct socket *, int, void *))conncb, data);
+       netcsconn(addr, addrlen, (void (*)(struct socket *, int, void *))conncb, data);
     }
 }
 
index 5a0caeb..261b1ba 100644 (file)
@@ -127,7 +127,7 @@ struct fnet *findfnet(wchar_t *name);
 struct fnetnode *fnetinitconnect(wchar_t *name, wchar_t *owner, char *addr, struct wcspair *args);
 void linkfnetnode(struct fnetnode *fn);
 void unlinkfnetnode(struct fnetnode *fn);
-struct fnetnode *getfnetnode(struct fnetnode *fn);
+void getfnetnode(struct fnetnode *fn);
 void putfnetnode(struct fnetnode *fn);
 void killfnetnode(struct fnetnode *fn);
 struct fnetpeer *fnetaddpeer(struct fnetnode *fn, wchar_t *id, wchar_t *nick);
index 459ef9a..ecbffe3 100644 (file)
@@ -286,7 +286,7 @@ static void dispatch(struct qcmd *qcmd, struct fnetnode *fn)
     flog(LOG_DEBUG, "unknown adc command: %ls", qcmd->args[0]);
 }
 
-static int hubread(struct socket *sk, struct fnetnode *fn)
+static void hubread(struct socket *sk, struct fnetnode *fn)
 {
     int ret;
     struct adchub *hub;
@@ -296,7 +296,7 @@ static int hubread(struct socket *sk, struct fnetnode *fn)
     
     hub = fn->data;
     if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
-       return(0);
+       return;
     if(hub->inbufdata > 1024)
        hub->inbufdata = 0;
     bufcat(hub->inbuf, newbuf, datalen);
@@ -321,14 +321,14 @@ static int hubread(struct socket *sk, struct fnetnode *fn)
            if(errno == EILSEQ) {
                flog(LOG_DEBUG, "adc fnetnode %i sent illegal utf-8 sequence", fn->id);
                killfnetnode(fn);
-               return(0);
+               return;
            } else if(errno == EINVAL) {
                break;
            } else if(errno == E2BIG) {
                /* continue; */
            } else {
                flog(LOG_WARNING, "bug? iconv returned unexpected error: %s", strerror(errno));
-               return(0);
+               return;
            }
        }
     }
@@ -337,21 +337,21 @@ static int hubread(struct socket *sk, struct fnetnode *fn)
        newqcmd(&hub->queue, parseadc(hub->cb));
        memmove(hub->cb, p, (hub->cbdata -= (p - hub->cb)) * sizeof(*(hub->cb)));
     }
-    return(0);
 }
 
-static int huberr(struct socket *sk, int err, struct fnetnode *fn)
+static void huberr(struct socket *sk, int err, struct fnetnode *fn)
 {
     killfnetnode(fn);
-    return(0);
 }
 
 static void hubconnect(struct fnetnode *fn)
 {
     struct adchub *hub;
     
-    CBREG(fn->sk, socket_read, (int (*)(struct socket *, void *))hubread, (void (*)(void *))putfnetnode, fn);
-    CBREG(fn->sk, socket_err, (int (*)(struct socket *, int, void *))huberr, (void (*)(void *))putfnetnode, fn);
+    fn->sk->readcb = (void (*)(struct socket *, void *))hubread;
+    fn->sk->errcb = (void (*)(struct socket *, int, void *))huberr;
+    fn->sk->data = fn;
+    getfnetnode(fn);
     
     hub = smalloc(sizeof(*hub));
     memset(hub, 0, sizeof(*hub));
index 804bd2c..d45b144 100644 (file)
@@ -160,13 +160,11 @@ static char *xmllistname = NULL;
 static char *xmlbz2listname = NULL;
 static struct timer *listwritetimer = NULL;
 
-static int peerconnect(struct socket *sk, int err, struct fnetnode *fn);
-static int peerread(struct socket *sk, struct dcpeer *peer);
-static int peererror(struct socket *sk, int err, struct dcpeer *peer);
+static void peerconnect(struct socket *sk, int err, struct fnetnode *fn);
 static void freedcpeer(struct dcpeer *peer);
-static void transread(struct dcpeer *peer);
-static void transerr(struct dcpeer *peer);
-static int transwrite(struct socket *sk, struct dcpeer *peer);
+static void transread(struct socket *sk, struct dcpeer *peer);
+static void transerr(struct socket *sk, int err, struct dcpeer *peer);
+static void transwrite(struct socket *sk, struct dcpeer *peer);
 static void updatehmlist(void);
 static void updatexmllist(void);
 static void updatexmlbz2list(void);
@@ -1302,7 +1300,7 @@ static void cmd_connecttome(struct socket *sk, struct fnetnode *fn, char *cmd, c
     addr.sin_port = htons(atoi(p));
     if(!inet_aton(args, &addr.sin_addr))
        return;
-    newsk = netcsconn((struct sockaddr *)&addr, sizeof(addr), (int (*)(struct socket *, int, void *))peerconnect, fn);
+    newsk = netcsconn((struct sockaddr *)&addr, sizeof(addr), (void (*)(struct socket *, int, void *))peerconnect, fn);
     getfnetnode(fn);
     hubhandleaction(sk, fn, cmd, args);
 }
@@ -1635,6 +1633,8 @@ static void startdl(struct dcpeer *peer)
        canceltimer(peer->timeout);
     peer->state = PEER_TRNS;
     transferstartdl(peer->transfer, peer->sk);
+    peer->sk->readcb = (void (*)(struct socket *, void *))transread;
+    peer->sk->errcb = (void (*)(struct socket *, int, void *))transerr;
 }
 
 static void startul(struct dcpeer *peer)
@@ -1643,7 +1643,7 @@ static void startul(struct dcpeer *peer)
        canceltimer(peer->timeout);
     peer->state = PEER_TRNS;
     transferstartul(peer->transfer, peer->sk);
-    CBREG(peer->sk, socket_write, (int (*)(struct socket *, void *))transwrite, NULL, peer);
+    peer->sk->writecb = (void (*)(struct socket *, void *))transwrite;
 }
 
 static void cmd_filelength(struct socket *sk, struct dcpeer *peer, char *cmd, char *args)
@@ -2215,7 +2215,12 @@ static void cmd_adcsnd(struct socket *sk, struct dcpeer *peer, char *cmd, char *
            goto out;
        }
        startdl(peer);
-       transread(peer);
+       if(peer->inbufdata > 0)
+       {
+           sockpushdata(sk, peer->inbuf, peer->inbufdata);
+           peer->inbufdata = 0;
+           transread(sk, peer);
+       }
     } else {
        /* We certainly didn't request this...*/
        freedcpeer(peer);
@@ -2243,7 +2248,12 @@ static void cmd_sending(struct socket *sk, struct dcpeer *peer, char *cmd, char
        return;
     }
     startdl(peer);
-    transread(peer);
+    if(peer->inbufdata > 0)
+    {
+       sockpushdata(sk, peer->inbuf, peer->inbufdata);
+       peer->inbufdata = 0;
+       transread(sk, peer);
+    }
 }
 
 /*
@@ -2592,7 +2602,7 @@ static struct command peercmds[] =
 
 static void dctransdetach(struct transfer *transfer, struct dcpeer *peer)
 {
-    CBUNREG(transfer, trans_filterout, trresumecb, peer);
+    CBUNREG(transfer, trans_filterout, peer);
     if(peer->freeing)
        return;
     peer->transfer = NULL;
@@ -2667,7 +2677,7 @@ static void dctransgotdata(struct transfer *transfer, struct dcpeer *peer)
                    transfersetstate(transfer, TRNS_HS);
                    socksettos(peer->sk, confgetint("fnet", "fnptos"));
                    transfer->flags.b.minislot = 0;
-                   CBUNREG(peer->sk, socket_write, transwrite, peer);
+                   peer->sk->writecb = NULL;
                }
            }
        }
@@ -2686,22 +2696,22 @@ static void dcwantdata(struct transfer *transfer, struct dcpeer *peer)
        peer->sk->ignread = 0;
 }
 
-static void transread(struct dcpeer *peer)
+static void transread(struct socket *sk, struct dcpeer *peer)
 {
-    size_t num;
+    void *buf;
+    size_t bufsize;
     struct transfer *transfer;
     
+    if((buf = sockgetinbuf(sk, &bufsize)) == NULL)
+       return;
     if(peer->transfer == NULL)
     {
+       free(buf);
        freedcpeer(peer);
        return;
     }
-    if(peer->inbufsize > peer->transfer->size - peer->transfer->curpos)
-       num = peer->transfer->size - peer->transfer->curpos;
-    else
-       num = peer->inbufsize;
-    transferputdata(peer->transfer, peer->inbuf, num);
-    memmove(peer->inbuf, peer->inbuf + num, peer->inbufsize -= num);
+    transferputdata(peer->transfer, buf, bufsize);
+    free(buf);
     if(peer->transfer->curpos >= peer->transfer->size)
     {
        transfer = peer->transfer;
@@ -2710,33 +2720,35 @@ static void transread(struct dcpeer *peer)
        return;
     }
     if(transferdatasize(peer->transfer) > 65535)
-       peer->sk->ignread = 1;
+       sk->ignread = 1;
 }
 
-static void transerr(struct dcpeer *peer)
+static void transerr(struct socket *sk, int err, struct dcpeer *peer)
 {
     struct transfer *transfer;
 
     if((transfer = peer->transfer) == NULL)
+    {
+       freedcpeer(peer);
        return;
+    }
     transferdetach(transfer);
     transferendofdata(transfer);
 }
 
-static int transwrite(struct socket *sk, struct dcpeer *peer)
+static void transwrite(struct socket *sk, struct dcpeer *peer)
 {
     if((peer->state != PEER_TRNS) && (peer->state != PEER_SYNC))
-       return(1);
+       return;
     if(peer->transfer == NULL)
     {
        freedcpeer(peer);
-       return(1);
+       return;
     }
     dctransgotdata(peer->transfer, peer);
-    return(0);
 }
 
-static int udpread(struct socket *sk, void *data)
+static void udpread(struct socket *sk, void *data)
 {
     char *buf, *p, *p2, *hashbuf;
     size_t buflen, hashlen;
@@ -2750,7 +2762,7 @@ static int udpread(struct socket *sk, void *data)
     struct hash *hash;
     
     if((buf = sockgetinbuf(sk, &buflen)) == NULL)
-       return(0);
+       return;
     buf = srealloc(buf, buflen + 1);
     buf[buflen] = 0;
     if(!strncmp(buf, "$SR ", 4))
@@ -2760,7 +2772,7 @@ static int udpread(struct socket *sk, void *data)
        if((p2 = strchr(p, ' ')) == NULL)
        {
            free(buf);
-           return(0);
+           return;
        }
        *p2 = 0;
        p = p2 + 1;
@@ -2768,14 +2780,14 @@ static int udpread(struct socket *sk, void *data)
        if((p2 = strchr(p, 5)) == NULL)
        {
            free(buf);
-           return(0);
+           return;
        }
        *p2 = 0;
        p = p2 + 1;
        if((p2 = strchr(p, ' ')) == NULL)
        {
            free(buf);
-           return(0);
+           return;
        }
        *p2 = 0;
        size = atoi(p);
@@ -2783,7 +2795,7 @@ static int udpread(struct socket *sk, void *data)
        if((p2 = strchr(p, '/')) == NULL)
        {
            free(buf);
-           return(0);
+           return;
        }
        *p2 = 0;
        slots = atoi(p);
@@ -2791,34 +2803,34 @@ static int udpread(struct socket *sk, void *data)
        if((p2 = strchr(p, 5)) == NULL)
        {
            free(buf);
-           return(0);
+           return;
        }
        p = p2 + 1;
        hubname = p;
        if((p2 = strstr(p, " (")) == NULL)
        {
            free(buf);
-           return(0);
+           return;
        }
        *p2 = 0;
        p = p2 + 2;
        if((p2 = strchr(p, ':')) == NULL)
        {
            free(buf);
-           return(0);
+           return;
        }
        *(p2++) = 0;
        hubaddr.sin_family = AF_INET;
        if(!inet_aton(p, &hubaddr.sin_addr))
        {
            free(buf);
-           return(0);
+           return;
        }
        p = p2;
        if((p2 = strchr(p, ')')) == NULL)
        {
            free(buf);
-           return(0);
+           return;
        }
        *p2 = 0;
        hubaddr.sin_port = htons(atoi(p));
@@ -2826,7 +2838,7 @@ static int udpread(struct socket *sk, void *data)
        if((wfile = icmbstowcs(filename, DCCHARSET)) == NULL)
        {
            free(buf);
-           return(0);
+           return;
        }
        myfn = NULL;
        hash = NULL;
@@ -2873,7 +2885,7 @@ static int udpread(struct socket *sk, void *data)
        if((wnick = icmbstowcs(nick, (hub == NULL)?DCCHARSET:(hub->charset))) == NULL)
        {
            free(buf);
-           return(0);
+           return;
        }
        sr = newsrchres(&dcnet, wfile, wnick);
        if(sr->peernick != NULL)
@@ -2891,7 +2903,6 @@ static int udpread(struct socket *sk, void *data)
        freesrchres(sr);
     }
     free(buf);
-    return(0);
 }
 
 static void hubread(struct socket *sk, struct fnetnode *fn)
@@ -3033,9 +3044,11 @@ static void freedcpeer(struct dcpeer *peer)
     }
     if(peer->timeout != NULL)
        canceltimer(peer->timeout);
-    /* XXX: Unregister transwrite from peer->sk->socket_write? */
-    CBUNREG(peer->sk, socket_read, peerread, peer);
-    CBUNREG(peer->sk, socket_err, peererror, peer);
+    if(peer->sk->data == peer)
+       peer->sk->data = NULL;
+    peer->sk->readcb = NULL;
+    peer->sk->writecb = NULL;
+    peer->sk->errcb = NULL;
     putsock(peer->sk);
     endcompress(peer);
     if(peer->supports != NULL)
@@ -3064,9 +3077,11 @@ static void freedcpeer(struct dcpeer *peer)
 
 static void hubconnect(struct fnetnode *fn)
 {
-    CBREG(fn->sk, socket_read, (int (*)(struct socket *, void *))hubread, (void (*)(void *))putfnetnode, getfnetnode(fn));
-    CBREG(fn->sk, socket_err, (int (*)(struct socket *, int, void *))huberr, (void (*)(void *))putfnetnode, getfnetnode(fn));
+    fn->sk->readcb = (void (*)(struct socket *, void *))hubread;
+    fn->sk->errcb = (void (*)(struct socket *, int, void *))huberr;
+    getfnetnode(fn);
     fn->data = newdchub(fn);
+    fn->sk->data = fn;
     return;
 }
 
@@ -3076,10 +3091,10 @@ static void hubdestroy(struct fnetnode *fn)
     struct qcommand *qcmd;
     
     hub = (struct dchub *)fn->data;
-    if(fn->sk != NULL)
+    if((fn->sk != NULL) && (fn->sk->data == fn))
     {
-       CBUNREG(fn->sk, socket_read, hubread, fn);
-       CBUNREG(fn->sk, socket_err, huberr, fn);
+       fn->sk->data = NULL;
+       putfnetnode(fn);
     }
     if(hub == NULL)
        return;
@@ -3125,61 +3140,48 @@ static struct fnet dcnet =
     .filebasename = dcbasename
 };
 
-static void cmdread(struct dcpeer *peer)
+static void peerread(struct socket *sk, struct dcpeer *peer)
 {
-    char *p;
-    struct command *cmd;
-
-    p = peer->inbuf;
-    while((peer->inbufdata > 0) && (p = memchr(peer->inbuf, '|', peer->inbufdata)) != NULL)
-    {
-       *(p++) = 0;
-       newqcmd(&peer->queue, peer->inbuf);
-       for(cmd = peercmds; cmd->handler != NULL; cmd++)
-       {
-           if(!memcmp(peer->inbuf, cmd->name, strlen(cmd->name)) && ((peer->inbuf[strlen(cmd->name)] == ' ') || (peer->inbuf[strlen(cmd->name)] == '|')))
-               break;
-       }
-       memmove(peer->inbuf, p, peer->inbufdata -= p - peer->inbuf);
-       if(cmd->stop)
-       {
-           peer->state = PEER_STOP;
-           break;
-       }
-    }
-}
-
-static int peerread(struct socket *sk, struct dcpeer *peer)
-{
-    char *newbuf;
+    char *newbuf, *p;
     size_t datalen;
+    struct command *cmd;
 
     if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
-       return(0);
+       return;
     sizebuf2(peer->inbuf, peer->inbufdata + datalen, 1);
     memcpy(peer->inbuf + peer->inbufdata, newbuf, datalen);
     free(newbuf);
     peer->inbufdata += datalen;
     if(peer->state == PEER_CMD)
     {
-       cmdread(peer);
-    } else if(peer->state == PEER_TRNS) {
-       transread(peer);
+       p = peer->inbuf;
+       while((peer->inbufdata > 0) && (p = memchr(peer->inbuf, '|', peer->inbufdata)) != NULL)
+       {
+           *(p++) = 0;
+           newqcmd(&peer->queue, peer->inbuf);
+           for(cmd = peercmds; cmd->handler != NULL; cmd++)
+           {
+               if(!memcmp(peer->inbuf, cmd->name, strlen(cmd->name)) && ((peer->inbuf[strlen(cmd->name)] == ' ') || (peer->inbuf[strlen(cmd->name)] == '|')))
+                   break;
+           }
+           memmove(peer->inbuf, p, peer->inbufdata -= p - peer->inbuf);
+           if(cmd->stop)
+           {
+               peer->state = PEER_STOP;
+               break;
+           }
+       }
     } else if(peer->state == PEER_TTHL) {
        handletthl(peer);
     }
-    return(0);
 }
 
-static int peererror(struct socket *sk, int err, struct dcpeer *peer)
+static void peererror(struct socket *sk, int err, struct dcpeer *peer)
 {
-    if(peer->state == PEER_TRNS)
-       transerr(peer);
     freedcpeer(peer);
-    return(0);
 }
 
-static int peerconnect(struct socket *sk, int err, struct fnetnode *fn)
+static void peerconnect(struct socket *sk, int err, struct fnetnode *fn)
 {
     struct dcpeer *peer;
     struct dchub *hub;
@@ -3188,34 +3190,34 @@ static int peerconnect(struct socket *sk, int err, struct fnetnode *fn)
     {
        putfnetnode(fn);
        putsock(sk);
-       return(1);
+       return;
     }
     hub = fn->data;
     peer = newdcpeer(sk);
     peer->fn = fn;
     peer->accepted = 0;
     peer->dcppemu = hub->dcppemu;
-    CBREG(sk, socket_read, (int (*)(struct socket *, void *))peerread, NULL, peer);
-    CBREG(sk, socket_err, (int (*)(struct socket *, int, void *))peererror, NULL, peer);
+    sk->readcb = (void (*)(struct socket *, void *))peerread;
+    sk->errcb = (void (*)(struct socket *, int, void *))peererror;
+    sk->data = peer;
     socksettos(sk, confgetint("fnet", "fnptos"));
     putsock(sk);
     peer->timeout = timercallback(ntime() + 180, (void (*)(int, void *))peertimeout, peer);
     sendmynick(peer);
     sendpeerlock(peer);
-    return(1);
 }
 
-static int peeraccept(struct socket *sk, struct socket *newsk, void *data)
+static void peeraccept(struct socket *sk, struct socket *newsk, void *data)
 {
     struct dcpeer *peer;
     
     peer = newdcpeer(newsk);
     peer->accepted = 1;
-    CBREG(sk, socket_read, (int (*)(struct socket *, void *))peerread, NULL, peer);
-    CBREG(sk, socket_err, (int (*)(struct socket *, int, void *))peererror, NULL, peer);
+    newsk->readcb = (void (*)(struct socket *, void *))peerread;
+    newsk->errcb = (void (*)(struct socket *, int, void *))peererror;
+    newsk->data = peer;
     socksettos(newsk, confgetint("fnet", "fnptos"));
     peer->timeout = timercallback(ntime() + 180, (void (*)(int, void *))peertimeout, peer);
-    return(0);
 }
 
 static void updatehmlist(void)
@@ -3633,7 +3635,7 @@ static int updateudpport(struct configvar *var, void *uudata)
        flog(LOG_WARNING, "could not create new DC UDP socket, reverting to old: %s", strerror(errno));
        return(0);
     }
-    CBREG(newsock, socket_read, udpread, NULL, NULL);
+    newsock->readcb = udpread;
     if(udpsock != NULL)
        putsock(udpsock);
     udpsock = newsock;
@@ -3675,7 +3677,7 @@ static int init(int hup)
            flog(LOG_CRIT, "could not create DC UDP socket: %s", strerror(errno));
            return(1);
        }
-       CBREG(udpsock, socket_read, udpread, NULL, NULL);
+       udpsock->readcb = udpread;
        addr.sin_port = htons(confgetint("dc", "tcpport"));
        if((tcpsock = netcslisten(SOCK_STREAM, (struct sockaddr *)&addr, sizeof(addr), peeraccept, NULL)) == NULL)
            flog(LOG_INFO, "could not listen to a remote address, going into passive mode");
index 4054518..2a8fdef 100644 (file)
@@ -174,11 +174,11 @@ static struct socket *newsock(int type)
        new->inbuf.d.f = new->inbuf.d.l = NULL;
        break;
     }
-    CBCHAININIT(new, socket_conn);
-    CBCHAININIT(new, socket_err);
-    CBCHAININIT(new, socket_read);
-    CBCHAININIT(new, socket_write);
-    CBCHAININIT(new, socket_accept);
+    new->conncb = NULL;
+    new->errcb = NULL;
+    new->readcb = NULL;
+    new->writecb = NULL;
+    new->acceptcb = NULL;
     new->next = sockets;
     new->prev = NULL;
     if(sockets != NULL)
@@ -240,11 +240,6 @@ void putsock(struct socket *sk)
     
     if(--(sk->refcount) == 0)
     {
-       CBCHAINFREE(sk, socket_conn);
-       CBCHAINFREE(sk, socket_err);
-       CBCHAINFREE(sk, socket_read);
-       CBCHAINFREE(sk, socket_write);
-       CBCHAINFREE(sk, socket_accept);
        switch(sk->type)
        {
        case SOCK_STREAM:
@@ -357,18 +352,21 @@ static void sockrecv(struct socket *sk)
        {
            if((errno == EINTR) || (errno == EAGAIN))
                return;
-           CBCHAINDOCB(sk, socket_err, sk, errno);
+           if(sk->errcb != NULL)
+               sk->errcb(sk, errno, sk->data);
            closesock(sk);
            return;
        }
        if(ret == 0)
        {
-           CBCHAINDOCB(sk, socket_err, sk, 0);
+           if(sk->errcb != NULL)
+               sk->errcb(sk, 0, sk->data);
            closesock(sk);
            return;
        }
        sk->inbuf.s.datasize += ret;
-       CBCHAINDOCB(sk, socket_read, sk);
+       if(sk->readcb != NULL)
+           sk->readcb(sk, sk->data);
        break;
     case SOCK_DGRAM:
        if(ioctl(sk->fd, SIOCINQ, &inq))
@@ -389,7 +387,8 @@ static void sockrecv(struct socket *sk)
            free(dbuf);
            if((errno == EINTR) || (errno == EAGAIN))
                return;
-           CBCHAINDOCB(sk, socket_err, sk, errno);
+           if(sk->errcb != NULL)
+               sk->errcb(sk, errno, sk->data);
            closesock(sk);
            return;
        }
@@ -404,7 +403,8 @@ static void sockrecv(struct socket *sk)
            free(dbuf);
            if(!((sk->family == AF_INET) || (sk->family == AF_INET6)))
            {
-               CBCHAINDOCB(sk, socket_err, sk, 0);
+               if(sk->errcb != NULL)
+                   sk->errcb(sk, 0, sk->data);
                closesock(sk);
            }
            return;
@@ -417,7 +417,8 @@ static void sockrecv(struct socket *sk)
        else
            sk->inbuf.d.f = dbuf;
        sk->inbuf.d.l = dbuf;
-       CBCHAINDOCB(sk, socket_read, sk);
+       if(sk->readcb != NULL)
+           sk->readcb(sk, sk->data);
        break;
     }
 }
@@ -443,7 +444,8 @@ static void sockflush(struct socket *sk)
        if(ret > 0)
        {
            memmove(sk->outbuf.s.buf, ((char *)sk->outbuf.s.buf) + ret, sk->outbuf.s.datasize -= ret);
-           CBCHAINDOCB(sk, socket_write, sk);
+           if(sk->writecb != NULL)
+               sk->writecb(sk, sk->data);
        }
        break;
     case SOCK_DGRAM:
@@ -454,7 +456,8 @@ static void sockflush(struct socket *sk)
        free(dbuf->data);
        free(dbuf->addr);
        free(dbuf);
-       CBCHAINDOCB(sk, socket_write, sk);
+       if(sk->writecb != NULL)
+           sk->writecb(sk, sk->data);
        break;
     }
 }
@@ -544,7 +547,7 @@ size_t sockqueuesize(struct socket *sk)
  * netcslisten() instead.
 */
 
-struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, int (*func)(struct socket *, struct socket *, void *), void *data)
+struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data)
 {
     struct socket *sk;
     int intbuf;
@@ -573,12 +576,12 @@ struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namel
        putsock(sk);
        return(NULL);
     }
-    if(func != NULL)
-       CBREG(sk, socket_accept, func, NULL, data);
+    sk->acceptcb = func;
+    sk->data = data;
     return(sk);
 }
 
-struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, int (*func)(struct socket *, struct socket *, void *), void *data)
+struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data)
 {
     if(confgetint("net", "mode") == 1)
     {
@@ -591,13 +594,13 @@ struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, i
     return(NULL);
 }
 
-struct socket *netcstcplisten(int port, int local, int (*func)(struct socket *, struct socket *, void *), void *data)
+struct socket *netcstcplisten(int port, int local, void (*func)(struct socket *, struct socket *, void *), void *data)
 {
     struct sockaddr_in addr;
 #ifdef HAVE_IPV6
     struct sockaddr_in6 addr6;
 #endif
-    struct socket *(*csfunc)(int, struct sockaddr *, socklen_t, int (*)(struct socket *, struct socket *, void *), void *);
+    struct socket *(*csfunc)(int, struct sockaddr *, socklen_t, void (*)(struct socket *, struct socket *, void *), void *);
     struct socket *ret;
     
     if(local)
@@ -668,7 +671,7 @@ void netdgramconn(struct socket *sk, struct sockaddr *addr, socklen_t addrlen)
     sk->ignread = 1;
 }
 
-struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, int (*func)(struct socket *, int, void *), void *data)
+struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)(struct socket *, int, void *), void *data)
 {
     struct socket *sk;
     int mode;
@@ -688,8 +691,8 @@ struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, int (*func)(s
        if(errno == EINPROGRESS)
        {
            sk->state = SOCK_SYN;
-           if(func != NULL)
-               CBREG(sk, socket_conn, func, NULL, data);
+           sk->conncb = func;
+           sk->data = data;
            return(sk);
        }
        putsock(sk);
@@ -756,7 +759,10 @@ int pollsocks(int timeout)
            {
                sslen = sizeof(ss);
                if((newfd = accept(sk->fd, (struct sockaddr *)&ss, &sslen)) < 0)
-                   CBCHAINDOCB(sk, socket_err, sk, errno);
+               {
+                   if(sk->errcb != NULL)
+                       sk->errcb(sk, errno, sk->data);
+               }
                newsk = newsock(sk->type);
                newsk->fd = newfd;
                newsk->family = sk->family;
@@ -764,13 +770,15 @@ int pollsocks(int timeout)
                memcpy(newsk->remote = smalloc(sslen), &ss, sslen);
                newsk->remotelen = sslen;
                putsock(newsk);
-               CBCHAINDOCB(sk, socket_accept, sk, newsk);
+               if(sk->acceptcb != NULL)
+                   sk->acceptcb(sk, newsk, sk->data);
            }
            if(pfds[i].revents & POLLERR)
            {
                retlen = sizeof(ret);
                getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
-               CBCHAINDOCB(sk, socket_err, sk, ret);
+               if(sk->errcb != NULL)
+                   sk->errcb(sk, ret, sk->data);
                continue;
            }
            break;
@@ -779,14 +787,16 @@ int pollsocks(int timeout)
            {
                retlen = sizeof(ret);
                getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
-               CBCHAINDOCB(sk, socket_conn, sk, ret);
+               if(sk->conncb != NULL)
+                   sk->conncb(sk, ret, sk->data);
                closesock(sk);
                continue;
            }
            if(pfds[i].revents & (POLLIN | POLLOUT))
            {
                sk->state = SOCK_EST;
-               CBCHAINDOCB(sk, socket_conn, sk, 0);
+               if(sk->conncb != NULL)
+                   sk->conncb(sk, 0, sk->data);
            }
            break;
        case SOCK_EST:
@@ -794,7 +804,8 @@ int pollsocks(int timeout)
            {
                retlen = sizeof(ret);
                getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen);
-               CBCHAINDOCB(sk, socket_err, sk, ret);
+               if(sk->errcb != NULL)
+                   sk->errcb(sk, ret, sk->data);
                closesock(sk);
                continue;
            }
@@ -816,7 +827,8 @@ int pollsocks(int timeout)
        }
        if(pfds[i].revents & POLLHUP)
        {
-           CBCHAINDOCB(sk, socket_err, sk, 0);
+           if(sk->errcb != NULL)
+               sk->errcb(sk, 0, sk->data);
            closesock(sk);
            unlinksock(sk);
            continue;
index da96315..7d63981 100644 (file)
@@ -21,8 +21,6 @@
 
 #include <sys/socket.h>
 
-#include <utils.h>
-
 #define SOCK_LST 0 /* Listening */
 #define SOCK_SYN 1 /* Connecting */
 #define SOCK_EST 2 /* Established */
@@ -82,27 +80,20 @@ struct socket
            size_t datasize;
        } s;
     } inbuf;
-    /*
     void (*conncb)(struct socket *sk, int err, void *data);
     void (*errcb)(struct socket *sk, int err, void *data);
     void (*readcb)(struct socket *sk, void *data);
     void (*writecb)(struct socket *sk, void *data);
     void (*acceptcb)(struct socket *sk, struct socket *newsk, void *data);
     void *data;
-    */
-    CBCHAIN(socket_conn, struct socket *sk, int err);
-    CBCHAIN(socket_err, struct socket *sk, int err);
-    CBCHAIN(socket_read, struct socket *sk);
-    CBCHAIN(socket_write, struct socket *sk);
-    CBCHAIN(socket_accept, struct socket *sk, struct socket *newsk);
 };
 
 void putsock(struct socket *sk);
 void getsock(struct socket *sk);
-struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, int (*func)(struct socket *, struct socket *, void *), void *data);
-struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, int (*func)(struct socket *, struct socket *, void *), void *data);
-struct socket *netcstcplisten(int port, int local, int (*func)(struct socket *, struct socket *, void *), void *data);
-struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, int (*func)(struct socket *, int, void *), void *data);
+struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data);
+struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data);
+struct socket *netcstcplisten(int port, int local, void (*func)(struct socket *, struct socket *, void *), void *data);
+struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)(struct socket *, int, void *), void *data);
 int pollsocks(int timeout);
 void sockqueue(struct socket *sk, void *data, size_t size);
 size_t sockqueuesize(struct socket *sk);
index ab2579d..56b237d 100644 (file)
 #include "client.h"
 
 static void killfilter(struct transfer *transfer);
-static int transferread(struct socket *sk, struct transfer *transfer);
-static int transferwrite(struct socket *sk, struct transfer *transfer);
-static int transfererr(struct socket *sk, int errno, struct transfer *transfer);
-static int filterread(struct socket *sk, struct transfer *transfer);
 
 unsigned long long bytesupload = 0;
 unsigned long long bytesdownload = 0;
@@ -88,14 +84,16 @@ void freetransfer(struct transfer *transfer)
        free(transfer->exitstatus);
     if(transfer->localend != NULL)
     {
-       CBUNREG(transfer->localend, socket_read, transferread, transfer);
-       CBUNREG(transfer->localend, socket_write, transferwrite, transfer);
-       CBUNREG(transfer->localend, socket_err, transfererr, transfer);
+       transfer->localend->readcb = NULL;
+       transfer->localend->writecb = NULL;
+       transfer->localend->errcb = NULL;
        putsock(transfer->localend);
     }
     if(transfer->filterout != NULL)
     {
-       CBUNREG(transfer->filterout, socket_read, filterread, transfer);
+       transfer->filterout->readcb = NULL;
+       transfer->filterout->writecb = NULL;
+       transfer->filterout->errcb = NULL;
        putsock(transfer->filterout);
     }
     if(transfer->fn != NULL)
@@ -233,27 +231,24 @@ static void transexpire(int cancelled, struct transfer *transfer)
        transfer->timeout = 0;
 }
 
-static int transferread(struct socket *sk, struct transfer *transfer)
+static void transferread(struct socket *sk, struct transfer *transfer)
 {
     if(sockgetdatalen(sk) >= 65536)
        sk->ignread = 1;
     if((transfer->iface != NULL) && (transfer->iface->gotdata != NULL))
        transfer->iface->gotdata(transfer, transfer->ifacedata);
-    return(0);
 }
 
-static int transferwrite(struct socket *sk, struct transfer *transfer)
+static void transferwrite(struct socket *sk, struct transfer *transfer)
 {
     if((transfer->iface != NULL) && (transfer->iface->wantdata != NULL))
        transfer->iface->wantdata(transfer, transfer->ifacedata);
-    return(0);
 }
 
-static int transfererr(struct socket *sk, int errno, struct transfer *transfer)
+static void transfererr(struct socket *sk, int errno, struct transfer *transfer)
 {
     if((transfer->iface != NULL) && (transfer->iface->endofdata != NULL))
        transfer->iface->endofdata(transfer, transfer->ifacedata);
-    return(0);
 }
 
 void transferputdata(struct transfer *transfer, void *buf, size_t size)
@@ -270,9 +265,9 @@ void transferendofdata(struct transfer *transfer)
     if(transfer->curpos >= transfer->size)
     {
        transfersetstate(transfer, TRNS_DONE);
-       CBUNREG(transfer->localend, socket_read, transferread, transfer);
-       CBUNREG(transfer->localend, socket_write, transferwrite, transfer);
-       CBUNREG(transfer->localend, socket_err, transfererr, transfer);
+       transfer->localend->readcb = NULL;
+       transfer->localend->writecb = NULL;
+       transfer->localend->errcb = NULL;
        putsock(transfer->localend);
        transfer->localend = NULL;
     } else {
@@ -334,9 +329,10 @@ void transfersetlocalend(struct transfer *transfer, struct socket *sk)
     if(transfer->localend != NULL)
        putsock(transfer->localend);
     getsock(transfer->localend = sk);
-    CBREG(sk, socket_read, (int (*)(struct socket *, void *))transferread, NULL, transfer);
-    CBREG(sk, socket_write, (int (*)(struct socket *, void *))transferwrite, NULL, transfer);
-    CBREG(sk, socket_err, (int (*)(struct socket *, int, void *))transfererr, NULL, transfer);
+    sk->data = transfer;
+    sk->readcb = (void (*)(struct socket *, void *))transferread;
+    sk->writecb = (void (*)(struct socket *, void *))transferwrite;
+    sk->errcb = (void (*)(struct socket *, int, void *))transfererr;
 }
 
 static int tryreq(struct transfer *transfer)
@@ -512,15 +508,15 @@ static void killfilter(struct transfer *transfer)
     }
     if(transfer->localend)
     {
-       CBUNREG(transfer->localend, socket_read, transferread, transfer);
-       CBUNREG(transfer->localend, socket_write, transferwrite, transfer);
-       CBUNREG(transfer->localend, socket_err, transfererr, transfer);
+       transfer->localend->readcb = NULL;
+       transfer->localend->writecb = NULL;
+       transfer->localend->errcb = NULL;
        putsock(transfer->localend);
        transfer->localend = NULL;
     }
     if(transfer->filterout)
     {
-       CBUNREG(transfer->filterout, socket_read, filterread, transfer);
+       transfer->filterout->readcb = NULL;
        putsock(transfer->filterout);
        transfer->filterout = NULL;
     }
@@ -595,14 +591,14 @@ static void handletranscmd(struct transfer *transfer, wchar_t *cmd, wchar_t *arg
     }
 }
 
-static int filterread(struct socket *sk, struct transfer *transfer)
+static void filterread(struct socket *sk, struct transfer *transfer)
 {
     char *buf, *p, *p2;
     size_t bufsize;
     wchar_t *cmd, *arg;
     
     if((buf = sockgetinbuf(sk, &bufsize)) == NULL)
-       return(0);
+       return;
     bufcat(transfer->filterbuf, buf, bufsize);
     free(buf);
     while((p = memchr(transfer->filterbuf, '\n', transfer->filterbufdata)) != NULL)
@@ -628,7 +624,6 @@ static int filterread(struct socket *sk, struct transfer *transfer)
        }
        memmove(transfer->filterbuf, p, transfer->filterbufdata -= (p - transfer->filterbuf));
     }
-    return(0);
 }
 
 static void filterexit(pid_t pid, int status, void *data)
@@ -765,7 +760,8 @@ int forkfilter(struct transfer *transfer)
     transfer->filter = pid;
     transfersetlocalend(transfer, insock);
     getsock(transfer->filterout = outsock);
-    CBREG(outsock, socket_read, (int (*)(struct socket *, void *))filterread, NULL, transfer);
+    outsock->data = transfer;
+    outsock->readcb = (void (*)(struct socket *, void *))filterread;
     putsock(insock);
     putsock(outsock);
     free(filtername);
index 9c89b50..5152808 100644 (file)
@@ -159,8 +159,6 @@ struct uidata
     size_t cwsize, cwdata;
 };
 
-static int uiread(struct socket *sk, struct uidata *data);
-static int uierror(struct socket *sk, int err, struct uidata *data);
 static int srcheta(struct search *srch, void *uudata);
 static int srchcommit(struct search *srch, void *uudata);
 static int srchres(struct search *srch, struct srchres *sr, void *uudata);
@@ -1056,19 +1054,18 @@ static void cmd_cansrch(struct socket *sk, struct uidata *data, int argc, wchar_
     sq(sk, 0, L"200", L"Search cancelled", NULL);
 }
 
-static int fcmdread(struct socket *sk, struct uidata *data)
+static void fcmdread(struct socket *sk, struct uidata *data)
 {
     char *buf;
     size_t bufsize;
     
     if((buf = sockgetinbuf(sk, &bufsize)) == NULL)
-       return(0);
+       return;
     bufcat(data->fcmdbuf, buf, bufsize);
     free(buf);
-    return(0);
 }
 
-static int fcmderr(struct socket *sk, int err, struct uidata *data)
+static void fcmderr(struct socket *sk, int err, struct uidata *data)
 {
     wchar_t *wbuf, *p, *p2;
     
@@ -1085,7 +1082,7 @@ static int fcmderr(struct socket *sk, int err, struct uidata *data)
        }
        data->fcmdbufsize = data->fcmdbufdata = 0;
        sq(data->sk, 0, L"505", L"An error occurred on the pipe to the filtercmd", L"%%s", strerror(err), NULL);
-       return(0);
+       return;
     }
     putsock(data->fcmdsk);
     data->fcmdsk = NULL;
@@ -1103,7 +1100,7 @@ static int fcmderr(struct socket *sk, int err, struct uidata *data)
     if(wbuf == NULL)
     {
        sq(data->sk, 0, L"504", L"Filtercmd sent data which could not be converted from the local charset", NULL);
-       return(0);
+       return;
     }
     p = wbuf;
     for(p2 = wcschr(p, L'\n'); p2 != NULL; p2 = wcschr(p, L'\n'))
@@ -1120,7 +1117,6 @@ static int fcmderr(struct socket *sk, int err, struct uidata *data)
        sq(data->sk, 0, L"200", L"%%ls", p, NULL);
     }
     free(wbuf);
-    return(0);
 }
 
 static void cmd_filtercmd(struct socket *sk, struct uidata *data, int argc, wchar_t **argv)
@@ -1186,8 +1182,9 @@ static void cmd_filtercmd(struct socket *sk, struct uidata *data, int argc, wcha
        data->fcmdbuf = NULL;
     }
     data->fcmdbufsize = data->fcmdbufdata = 0;
-    CBREG(data->fcmdsk, socket_read, (int (*)(struct socket *, void *))fcmdread, NULL, data);
-    CBREG(data->fcmdsk, socket_err, (int (*)(struct socket *, int, void *))fcmderr, NULL, data);
+    data->fcmdsk->data = data;
+    data->fcmdsk->readcb = (void (*)(struct socket *, void *))fcmdread;
+    data->fcmdsk->errcb = (void (*)(struct socket *, int, void *))fcmderr;
 }
 
 static void cmd_lstrarg(struct socket *sk, struct uidata *data, int argc, wchar_t **argv)
@@ -1514,8 +1511,8 @@ static void freeuidata(struct uidata *data)
        data->prev->next = data->next;
     if(data == actives)
        actives = data->next;
-    CBUNREG(data->sk, socket_read, uiread, data);
-    CBUNREG(data->sk, socket_err, uierror, data);
+    data->sk->readcb = NULL;
+    data->sk->errcb = NULL;
     putsock(data->sk);
     while((qcmd = unlinkqcmd(data)) != NULL)
        freequeuecmd(qcmd);
@@ -1593,7 +1590,7 @@ static struct uidata *newuidata(struct socket *sk)
     return(data);
 }
 
-static int uiread(struct socket *sk, struct uidata *data)
+static void uiread(struct socket *sk, struct uidata *data)
 {
     int ret, done;
     char *newbuf;
@@ -1605,7 +1602,7 @@ static int uiread(struct socket *sk, struct uidata *data)
     if(data->indata > 1024)
        data->indata = 0;
     if((newbuf = sockgetinbuf(sk, &datalen)) == NULL)
-       return(0);
+       return;
     sizebuf(&data->inbuf, &data->inbufsize, data->indata + datalen, 1, 1);
     memcpy(data->inbuf + data->indata, newbuf, datalen);
     free(newbuf);
@@ -1758,29 +1755,26 @@ static int uiread(struct socket *sk, struct uidata *data)
            break;
        }
     }
-    return(0);
 }
 
-static int uierror(struct socket *sk, int err, struct uidata *data)
+static void uierror(struct socket *sk, int err, struct uidata *data)
 {
     if(err)
        flog(LOG_WARNING, "error occurred on UI socket: %s", strerror(err));
     freeuidata(data);
-    return(0);
 }
 
-static int uiaccept(struct socket *sk, struct socket *newsk, void *data)
+static void uiaccept(struct socket *sk, struct socket *newsk, void *data)
 {
     struct uidata *uidata;
     
-    uidata = newuidata(newsk);
+    newsk->data = uidata = newuidata(newsk);
     socksettos(newsk, confgetint("ui", "uitos"));
     if(uidata == NULL)
-       return(0);
-    CBREG(newsk, socket_err, (int (*)(struct socket *, int, void *))uierror, NULL, uidata);
-    CBREG(newsk, socket_read, (int (*)(struct socket *, void *))uiread, NULL, uidata);
+       return;
+    newsk->errcb = (void (*)(struct socket *, int, void *))uierror;
+    newsk->readcb = (void (*)(struct socket *, void *))uiread;
     queuecmd(uidata, &commands[0], 0, NULL);
-    return(0);
 }
 
 static int srcheta(struct search *srch, void *uudata)
index 4eada80..5c50dd4 100644 (file)
@@ -22,7 +22,6 @@
 #include <stdarg.h>
 #include <stdlib.h>
 #include <malloc.h>
-#include <assert.h>
 #ifdef DAEMON
 #include "log.h"
 #endif
@@ -55,7 +54,6 @@ struct cbchain_ ## name { \
     int (*func)(args, void *data); \
     void (*destroy)(void *data); \
     void *data; \
-    int running, free; \
 } * name
 
 #define GCBCHAIN(name, args...) \
@@ -131,7 +129,6 @@ do { \
 do { \
     struct cbchain_ ## name *__new_cb__; \
     __new_cb__ = smalloc(sizeof(*__new_cb__)); \
-    __new_cb__->running = __new_cb__->free = 0; \
     __new_cb__->func = funca; \
     __new_cb__->destroy = destroya; \
     __new_cb__->data = dataa; \
@@ -143,12 +140,11 @@ do { \
     (obj)->name = __new_cb__; \
 } while(0)
 
-#define CBUNREG(obj, name, funca, dataa) \
-({ \
+#define CBUNREG(obj, name, dataa) \
+do { \
     struct cbchain_ ## name *__cur__; \
-    int __found__ = 0; \
     for(__cur__ = (obj)->name; __cur__ != NULL; __cur__ = __cur__->next) { \
-        if(((void *)(__cur__->func) == (void *)(funca)) && (__cur__->data == (void *)(dataa))) { \
+        if(__cur__->data == (dataa)) { \
             if(__cur__->destroy != NULL) \
                 __cur__->destroy(__cur__->data); \
             if(__cur__->prev != NULL) \
@@ -158,11 +154,10 @@ do { \
             if(__cur__ == (obj)->name) \
                 (obj)->name = __cur__->next; \
             free(__cur__); \
-            __found__ = 1; \
             break; \
         } \
     } \
-__found__;})
+} while(0)
 
 #define GCBREG(name, funca, dataa) \
 do { \
@@ -185,30 +180,18 @@ do { \
     struct cbchain_ ## name *__cur__; \
     while((__cur__ = (obj)->name) != NULL) { \
         (obj)->name = __cur__->next; \
-        if(__cur__->running) { \
-            __cur__->free = 1; \
-        } else { \
-            if(__cur__->destroy != NULL) \
-                __cur__->destroy(__cur__->data); \
-            free(__cur__); \
-       } \
+        if(__cur__->destroy != NULL) \
+            __cur__->destroy(__cur__->data); \
+        free(__cur__); \
     } \
 } while(0)
 
 #define CBCHAINDOCB(obj, name, args...) \
 do { \
     struct cbchain_ ## name *__cur__, *__next__; \
-    int __res__; \
     for(__cur__ = (obj)->name; __cur__ != NULL; __cur__ = __next__) { \
         __next__ = __cur__->next; \
-        __cur__->running = 1; \
-        __res__ = __cur__->func(args, __cur__->data); \
-        __cur__->running = 0; \
-        if(__cur__->free) { \
-            free(__cur__); \
-            break; \
-        } \
-        if(__res__) { \
+        if(__cur__->func(args, __cur__->data)) { \
             if(__cur__->next != NULL) \
                 __cur__->next->prev = __cur__->prev; \
             if(__cur__->prev != NULL) \