From: Fredrik Tolf Date: Sat, 15 Mar 2008 13:50:04 +0000 (+0100) Subject: Merge branch 'master' of pc18:/srv/git/r/doldaconnect X-Git-Tag: 1.3~32 X-Git-Url: http://git.dolda2000.com/gitweb/?p=doldaconnect.git;a=commitdiff_plain;h=0d86193e5a413ad19f05ce68a3f562c1f7e260ef;hp=9ff482d7e038693439fe7b3e150ccebf099ac024 Merge branch 'master' of pc18:/srv/git/r/doldaconnect --- diff --git a/daemon/client.c b/daemon/client.c index 26b50f3..46766e9 100644 --- a/daemon/client.c +++ b/daemon/client.c @@ -1086,6 +1086,8 @@ static void terminate(void) { if(hashjob != 0) kill(hashjob, SIGHUP); + if(hashwritetimer != NULL) + writehashcache(1); while(shares != NULL) freesharepoint(shares); freecache(shareroot); diff --git a/daemon/fnet-dc.c b/daemon/fnet-dc.c index ebfea28..3dbb81f 100644 --- a/daemon/fnet-dc.c +++ b/daemon/fnet-dc.c @@ -3321,6 +3321,7 @@ static void updatehmlist(void) char *buf, *buf2, numbuf[32]; size_t bufsize, bufdata; int fd, ibuf; + FILE *out; bufdata = 0; buf = smalloc(bufsize = 65536); @@ -3378,27 +3379,28 @@ static void updatehmlist(void) free(hmlistname); hmlistname = NULL; } else { + out = fdopen(fd, "w"); /* * I do not want to implement a good Huffman encoder, and it's not * like Huffman encoding actually yields any impressive results * for DC file lists anyway, so I'll just output a bogus * tree. Implement a good encoder if you want to. */ - write(fd, "HE3\r\0", 5); - write(fd, &bufdata, 4); + fwrite("HE3\r\0", 1, 5, out); + fwrite(&bufdata, 4, 1, out); /* XXX: Endian unsafe */ ibuf = 256; - write(fd, &ibuf, 2); + fwrite(&ibuf, 2, 1, out); ibuf = 8; for(i = 0; i < 256; i++) { - write(fd, &i, 1); - write(fd, &ibuf, 1); + fwrite(&i, 1, 1, out); + fwrite(&ibuf, 1, 1, out); } for(i = 0; i < 256; i++) - write(fd, &i, 1); + fwrite(&i, 1, 1, out); for(buf2 = buf; bufdata > 0;) { - if((ret = write(fd, buf2, bufdata)) < 0) + if((ret = fwrite(buf2, 1, bufdata, out)) < 0) { flog(LOG_WARNING, "could not write file list: %s", strerror(errno)); break; @@ -3406,7 +3408,7 @@ static void updatehmlist(void) bufdata -= ret; buf2 += ret; } - close(fd); + fclose(out); } free(buf); } diff --git a/daemon/net.c b/daemon/net.c index e0d12af..44974f1 100644 --- a/daemon/net.c +++ b/daemon/net.c @@ -28,7 +28,7 @@ #include #include #include -#include +#include #include #include #include @@ -843,61 +843,55 @@ static void acceptunix(struct socket *sk) int pollsocks(int timeout) { - int i, num, ret; + int ret, fd; socklen_t retlen; - int newfd; - struct pollfd *pfds; + int newfd, maxfd; + fd_set rfds, wfds, efds; struct socket *sk, *next, *newsk; struct sockaddr_storage ss; socklen_t sslen; + struct timeval tv; - pfds = smalloc(sizeof(*pfds) * (num = numsocks)); - for(i = 0, sk = sockets; i < num; sk = sk->next) + FD_ZERO(&rfds); + FD_ZERO(&wfds); + FD_ZERO(&efds); + for(maxfd = 0, sk = sockets; sk != NULL; sk = sk->next) { - if(sk->state == SOCK_STL) - { - num--; + if((sk->state == SOCK_STL) || (sk->fd < 0)) continue; - } - pfds[i].fd = sk->fd; - pfds[i].events = 0; if(!sk->ignread) - pfds[i].events |= POLLIN; + FD_SET(sk->fd, &rfds); if((sk->state == SOCK_SYN) || (sockqueuesize(sk) > 0)) - pfds[i].events |= POLLOUT; - pfds[i].revents = 0; - i++; + FD_SET(sk->fd, &wfds); + FD_SET(sk->fd, &efds); + if(sk->fd > maxfd) + maxfd = sk->fd; } - ret = poll(pfds, num, timeout); + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; + ret = select(maxfd + 1, &rfds, &wfds, &efds, (timeout < 0)?NULL:&tv); if(ret < 0) { if(errno != EINTR) { - flog(LOG_CRIT, "pollsocks: poll errored out: %s", strerror(errno)); + flog(LOG_CRIT, "pollsocks: select errored out: %s", strerror(errno)); /* To avoid CPU hogging in case it's bad, which it * probably is. */ sleep(1); } - free(pfds); return(1); } for(sk = sockets; sk != NULL; sk = next) { next = sk->next; - for(i = 0; i < num; i++) - { - if(pfds[i].fd == sk->fd) - break; - } - if(i == num) - continue; + fd = sk->fd; switch(sk->state) { case SOCK_LST: - if(pfds[i].revents & POLLIN) + if(FD_ISSET(fd, &rfds)) { sslen = sizeof(ss); - if((newfd = accept(sk->fd, (struct sockaddr *)&ss, &sslen)) < 0) + if((newfd = accept(fd, (struct sockaddr *)&ss, &sslen)) < 0) { if(sk->errcb != NULL) sk->errcb(sk, errno, sk->data); @@ -914,26 +908,26 @@ int pollsocks(int timeout) sk->acceptcb(sk, newsk, sk->data); putsock(newsk); } - if(pfds[i].revents & POLLERR) + if(FD_ISSET(fd, &efds)) { retlen = sizeof(ret); - getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen); + getsockopt(fd, SOL_SOCKET, SO_ERROR, &ret, &retlen); if(sk->errcb != NULL) sk->errcb(sk, ret, sk->data); continue; } break; case SOCK_SYN: - if(pfds[i].revents & POLLERR) + if(FD_ISSET(fd, &efds)) { retlen = sizeof(ret); - getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen); + getsockopt(fd, SOL_SOCKET, SO_ERROR, &ret, &retlen); if(sk->conncb != NULL) sk->conncb(sk, ret, sk->data); closesock(sk); continue; } - if(pfds[i].revents & (POLLIN | POLLOUT)) + if(FD_ISSET(fd, &rfds) || FD_ISSET(fd, &wfds)) { sk->state = SOCK_EST; if(sk->conncb != NULL) @@ -941,41 +935,25 @@ int pollsocks(int timeout) } break; case SOCK_EST: - if(pfds[i].revents & POLLERR) + if(FD_ISSET(fd, &efds)) { retlen = sizeof(ret); - getsockopt(sk->fd, SOL_SOCKET, SO_ERROR, &ret, &retlen); + getsockopt(fd, SOL_SOCKET, SO_ERROR, &ret, &retlen); if(sk->errcb != NULL) sk->errcb(sk, ret, sk->data); closesock(sk); continue; } - if(pfds[i].revents & POLLIN) + if(FD_ISSET(fd, &rfds)) sockrecv(sk); - if(pfds[i].revents & POLLOUT) + if(FD_ISSET(fd, &wfds)) { if(sockqueuesize(sk) > 0) sockflush(sk); } break; } - if(pfds[i].revents & POLLNVAL) - { - flog(LOG_CRIT, "BUG: stale socket struct on fd %i", sk->fd); - sk->state = SOCK_STL; - unlinksock(sk); - continue; - } - if(pfds[i].revents & POLLHUP) - { - if(sk->errcb != NULL) - sk->errcb(sk, 0, sk->data); - closesock(sk); - unlinksock(sk); - continue; - } } - free(pfds); for(sk = sockets; sk != NULL; sk = next) { next = sk->next;