From cab0b442977697b876127cda082b1262ece2714b Mon Sep 17 00:00:00 2001 From: fredrik Date: Tue, 30 Jan 2007 11:12:26 +0000 Subject: [PATCH] Revert to previous socket scheme. git-svn-id: svn+ssh://svn.dolda2000.com/srv/svn/repos/src/doldaconnect@839 959494ce-11ee-0310-bf91-de5d638817bd --- daemon/client.c | 7 +- daemon/filenet.c | 15 +++-- daemon/filenet.h | 2 +- daemon/fnet-adc.c | 18 +++--- daemon/fnet-dc.c | 190 +++++++++++++++++++++++++++--------------------------- daemon/net.c | 80 +++++++++++++---------- daemon/net.h | 17 ++--- daemon/transfer.c | 52 +++++++-------- daemon/ui.c | 42 ++++++------ include/utils.h | 33 +++------- 10 files changed, 218 insertions(+), 238 deletions(-) diff --git a/daemon/client.c b/daemon/client.c index fc2776b..7cdfbe3 100644 --- a/daemon/client.c +++ b/daemon/client.c @@ -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); } diff --git a/daemon/filenet.c b/daemon/filenet.c index 99e094a..be6c5af 100644 --- a/daemon/filenet.c +++ b/daemon/filenet.c @@ -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); } } diff --git a/daemon/filenet.h b/daemon/filenet.h index 5a0caeb..261b1ba 100644 --- a/daemon/filenet.h +++ b/daemon/filenet.h @@ -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); diff --git a/daemon/fnet-adc.c b/daemon/fnet-adc.c index 459ef9a..ecbffe3 100644 --- a/daemon/fnet-adc.c +++ b/daemon/fnet-adc.c @@ -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)); diff --git a/daemon/fnet-dc.c b/daemon/fnet-dc.c index 804bd2c..d45b144 100644 --- a/daemon/fnet-dc.c +++ b/daemon/fnet-dc.c @@ -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"); diff --git a/daemon/net.c b/daemon/net.c index 4054518..2a8fdef 100644 --- a/daemon/net.c +++ b/daemon/net.c @@ -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; diff --git a/daemon/net.h b/daemon/net.h index da96315..7d63981 100644 --- a/daemon/net.h +++ b/daemon/net.h @@ -21,8 +21,6 @@ #include -#include - #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); diff --git a/daemon/transfer.c b/daemon/transfer.c index ab2579d..56b237d 100644 --- a/daemon/transfer.c +++ b/daemon/transfer.c @@ -39,10 +39,6 @@ #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); diff --git a/daemon/ui.c b/daemon/ui.c index 9c89b50..5152808 100644 --- a/daemon/ui.c +++ b/daemon/ui.c @@ -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) diff --git a/include/utils.h b/include/utils.h index 4eada80..5c50dd4 100644 --- a/include/utils.h +++ b/include/utils.h @@ -22,7 +22,6 @@ #include #include #include -#include #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) \ -- 2.11.0