X-Git-Url: http://dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Fnet.c;h=405451848f478934e904ca2c7cbb3eab27d126c5;hb=f5dbbe62975d51f5096e1b38c3d982e6af093d8b;hp=647840c1aafbc406e076d5d8eadb6958c8a6d4e5;hpb=d29853b144535b46890f29f5de016e7c8d194452;p=doldaconnect.git diff --git a/daemon/net.c b/daemon/net.c index 647840c..4054518 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; } - new->conncb = NULL; - new->errcb = NULL; - new->readcb = NULL; - new->writecb = NULL; - new->acceptcb = NULL; + CBCHAININIT(new, socket_conn); + CBCHAININIT(new, socket_err); + CBCHAININIT(new, socket_read); + CBCHAININIT(new, socket_write); + CBCHAININIT(new, socket_accept); new->next = sockets; new->prev = NULL; if(sockets != NULL) @@ -240,6 +240,11 @@ 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: @@ -253,12 +258,14 @@ void putsock(struct socket *sk) { sk->outbuf.d.f = buf->next; free(buf->data); + free(buf->addr); free(buf); } while((buf = sk->inbuf.d.f) != NULL) { sk->inbuf.d.f = buf->next; free(buf->data); + free(buf->addr); free(buf); } break; @@ -350,21 +357,18 @@ static void sockrecv(struct socket *sk) { if((errno == EINTR) || (errno == EAGAIN)) return; - if(sk->errcb != NULL) - sk->errcb(sk, errno, sk->data); + CBCHAINDOCB(sk, socket_err, sk, errno); closesock(sk); return; } if(ret == 0) { - if(sk->errcb != NULL) - sk->errcb(sk, 0, sk->data); + CBCHAINDOCB(sk, socket_err, sk, 0); closesock(sk); return; } sk->inbuf.s.datasize += ret; - if(sk->readcb != NULL) - sk->readcb(sk, sk->data); + CBCHAINDOCB(sk, socket_read, sk); break; case SOCK_DGRAM: if(ioctl(sk->fd, SIOCINQ, &inq)) @@ -385,8 +389,7 @@ static void sockrecv(struct socket *sk) free(dbuf); if((errno == EINTR) || (errno == EAGAIN)) return; - if(sk->errcb != NULL) - sk->errcb(sk, errno, sk->data); + CBCHAINDOCB(sk, socket_err, sk, errno); closesock(sk); return; } @@ -401,8 +404,7 @@ static void sockrecv(struct socket *sk) free(dbuf); if(!((sk->family == AF_INET) || (sk->family == AF_INET6))) { - if(sk->errcb != NULL) - sk->errcb(sk, 0, sk->data); + CBCHAINDOCB(sk, socket_err, sk, 0); closesock(sk); } return; @@ -415,8 +417,7 @@ static void sockrecv(struct socket *sk) else sk->inbuf.d.f = dbuf; sk->inbuf.d.l = dbuf; - if(sk->readcb != NULL) - sk->readcb(sk, sk->data); + CBCHAINDOCB(sk, socket_read, sk); break; } } @@ -442,8 +443,7 @@ 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); - if(sk->writecb != NULL) - sk->writecb(sk, sk->data); + CBCHAINDOCB(sk, socket_write, sk); } break; case SOCK_DGRAM: @@ -454,8 +454,7 @@ static void sockflush(struct socket *sk) free(dbuf->data); free(dbuf->addr); free(dbuf); - if(sk->writecb != NULL) - sk->writecb(sk, sk->data); + CBCHAINDOCB(sk, socket_write, sk); break; } } @@ -545,7 +544,7 @@ size_t sockqueuesize(struct socket *sk) * netcslisten() instead. */ -struct socket *netcslistenlocal(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, int (*func)(struct socket *, struct socket *, void *), void *data) { struct socket *sk; int intbuf; @@ -574,12 +573,12 @@ struct socket *netcslistenlocal(int type, struct sockaddr *name, socklen_t namel putsock(sk); return(NULL); } - sk->acceptcb = func; - sk->data = data; + if(func != NULL) + CBREG(sk, socket_accept, func, NULL, data); return(sk); } -struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, void (*func)(struct socket *, struct socket *, void *), void *data) +struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, int (*func)(struct socket *, struct socket *, void *), void *data) { if(confgetint("net", "mode") == 1) { @@ -592,13 +591,13 @@ struct socket *netcslisten(int type, struct sockaddr *name, socklen_t namelen, v return(NULL); } -struct socket *netcstcplisten(int port, int local, void (*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 sockaddr_in addr; #ifdef HAVE_IPV6 struct sockaddr_in6 addr6; #endif - struct socket *(*csfunc)(int, struct sockaddr *, socklen_t, void (*)(struct socket *, struct socket *, void *), void *); + struct socket *(*csfunc)(int, struct sockaddr *, socklen_t, int (*)(struct socket *, struct socket *, void *), void *); struct socket *ret; if(local) @@ -669,7 +668,7 @@ void netdgramconn(struct socket *sk, struct sockaddr *addr, socklen_t addrlen) sk->ignread = 1; } -struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)(struct socket *, int, void *), void *data) +struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, int (*func)(struct socket *, int, void *), void *data) { struct socket *sk; int mode; @@ -689,8 +688,8 @@ struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)( if(errno == EINPROGRESS) { sk->state = SOCK_SYN; - sk->conncb = func; - sk->data = data; + if(func != NULL) + CBREG(sk, socket_conn, func, NULL, data); return(sk); } putsock(sk); @@ -757,10 +756,7 @@ int pollsocks(int timeout) { sslen = sizeof(ss); if((newfd = accept(sk->fd, (struct sockaddr *)&ss, &sslen)) < 0) - { - if(sk->errcb != NULL) - sk->errcb(sk, errno, sk->data); - } + CBCHAINDOCB(sk, socket_err, sk, errno); newsk = newsock(sk->type); newsk->fd = newfd; newsk->family = sk->family; @@ -768,15 +764,13 @@ int pollsocks(int timeout) memcpy(newsk->remote = smalloc(sslen), &ss, sslen); newsk->remotelen = sslen; putsock(newsk); - if(sk->acceptcb != NULL) - sk->acceptcb(sk, newsk, sk->data); + CBCHAINDOCB(sk, socket_accept, sk, newsk); } if(pfds[i].revents & POLLERR) { retlen = sizeof(ret); getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen); - if(sk->errcb != NULL) - sk->errcb(sk, ret, sk->data); + CBCHAINDOCB(sk, socket_err, sk, ret); continue; } break; @@ -785,16 +779,14 @@ int pollsocks(int timeout) { retlen = sizeof(ret); getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen); - if(sk->conncb != NULL) - sk->conncb(sk, ret, sk->data); + CBCHAINDOCB(sk, socket_conn, sk, ret); closesock(sk); continue; } if(pfds[i].revents & (POLLIN | POLLOUT)) { sk->state = SOCK_EST; - if(sk->conncb != NULL) - sk->conncb(sk, 0, sk->data); + CBCHAINDOCB(sk, socket_conn, sk, 0); } break; case SOCK_EST: @@ -802,8 +794,7 @@ int pollsocks(int timeout) { retlen = sizeof(ret); getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen); - if(sk->errcb != NULL) - sk->errcb(sk, ret, sk->data); + CBCHAINDOCB(sk, socket_err, sk, ret); closesock(sk); continue; } @@ -825,8 +816,7 @@ int pollsocks(int timeout) } if(pfds[i].revents & POLLHUP) { - if(sk->errcb != NULL) - sk->errcb(sk, 0, sk->data); + CBCHAINDOCB(sk, socket_err, sk, 0); closesock(sk); unlinksock(sk); continue; @@ -1122,9 +1112,9 @@ int sockgetremotename2(struct socket *sk, struct socket *sk2, struct sockaddr ** flog(LOG_ERR, "using sockgetremotename2 with sockets of differing family: %i %i", sk->family, sk2->family); return(-1); } - if(sockgetlocalname(sk, &name1, &len1)) + if(sockgetremotename(sk, &name1, &len1)) return(-1); - if(sockgetlocalname(sk2, &name2, &len2)) { + if(sockgetremotename(sk2, &name2, &len2)) { free(name1); return(-1); }