X-Git-Url: http://git.dolda2000.com/gitweb/?a=blobdiff_plain;f=daemon%2Fnet.c;h=121050cf4eba6bfe11d89a1393adfff3c84e1388;hb=8d7a1e880011bbb660895f022a9f250f3cfda391;hp=a9238cbcf5cd61e5ea855ca5ac21a928c7be6c5d;hpb=b2e73d7b835172abbc5e217b75faaa2daec2110d;p=doldaconnect.git diff --git a/daemon/net.c b/daemon/net.c index a9238cb..121050c 100644 --- a/daemon/net.c +++ b/daemon/net.c @@ -361,12 +361,15 @@ void getsock(struct socket *sk) static void sockdebug(int level, struct socket *sk, char *format, ...) { va_list args; + char *tb; - if((sk->dbgnm == NULL) || (level < sk->dbglvl)) + if((sk->dbgnm == NULL) || (level > sk->dbglvl)) return; va_start(args, format); - vfprintf(stderr, format, args); + tb = vsprintf2(format, args); va_end(args); + fprintf(stderr, "%s: %s\n", sk->dbgnm, tb); + free(tb); } void socksetdebug(struct socket *sk, int level, char *nm, ...) @@ -382,6 +385,7 @@ void socksetdebug(struct socket *sk, int level, char *nm, ...) free(tb); sk->dbglvl = level; sk->back->dbglvl = level; + sockdebug(1, sk, "enabled debugging"); } static void freesock(struct socket *sk) @@ -514,7 +518,7 @@ void *sockgetinbuf(struct socket *sk, size_t *size) sk->buf.s.bufsize = sk->buf.s.datasize = 0; sockread(sk); } - sockdebug(2, sk, "read %ji bytes", *size); + sockdebug(2, sk, "read %zi bytes", *size); return(buf); } @@ -524,7 +528,7 @@ void sockqueue(struct socket *sk, void *data, size_t size) struct sockaddr *remote; socklen_t remotelen; - sockdebug(2, sk, "queued %ji bytes", size); + sockdebug(2, sk, "queued %zi bytes", size); if(size == 0) return; if(sk->state == SOCK_STL) @@ -999,6 +1003,8 @@ struct socket *netcsconn(struct sockaddr *addr, socklen_t addrlen, void (*func)( memcpy(sk->ufd->d.s.remote = smalloc(addrlen), addr, sk->ufd->d.s.remotelen = addrlen); sk->back->conncb = func; sk->back->data = data; + getsock(sk->back); + putsock(sk); if(!connect(sk->ufd->fd, addr, addrlen)) { sksetstate(sk, SOCK_EST); @@ -1070,10 +1076,18 @@ static void runbatches(void) static void cleansocks(void) { struct ufd *ufd, *next; + int dead; for(ufd = ufds; ufd != NULL; ufd = next) { next = ufd->next; - if(ufd->sk && ((ufd->fd < 0) || (sockgetdatalen(ufd->sk) == 0))) { + if(ufd->sk) { + dead = (ufd->fd < 0); + if(ufd->sk->state == SOCK_STL) + dead = 1; + if((ufd->sk->state == SOCK_EST) && (sockgetdatalen(ufd->sk) == 0)) + dead = 1; + if(!dead) + continue; if(ufd->sk->eos == 1) { ufd->sk->eos = 2; closeufd(ufd);