Module Name: src Committed By: pooka Date: Sun Sep 6 17:02:36 UTC 2009
Modified Files: src/dist/smbfs/lib/smb: nbns_rq.c Log Message: Don't use select() to wait for a single socket, just set SO_RECVTIMEO. To generate a diff of this commit: cvs rdiff -u -r1.5 -r1.6 src/dist/smbfs/lib/smb/nbns_rq.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/dist/smbfs/lib/smb/nbns_rq.c diff -u src/dist/smbfs/lib/smb/nbns_rq.c:1.5 src/dist/smbfs/lib/smb/nbns_rq.c:1.6 --- src/dist/smbfs/lib/smb/nbns_rq.c:1.5 Wed Aug 13 01:13:42 2003 +++ src/dist/smbfs/lib/smb/nbns_rq.c Sun Sep 6 17:02:36 2009 @@ -33,7 +33,7 @@ */ #include <sys/cdefs.h> -__RCSID("$NetBSD: nbns_rq.c,v 1.5 2003/08/13 01:13:42 christos Exp $"); +__RCSID("$NetBSD: nbns_rq.c,v 1.6 2009/09/06 17:02:36 pooka Exp $"); #include <sys/param.h> #include <sys/socket.h> @@ -259,32 +259,18 @@ { struct mbdata *mbp = &rqp->nr_rp; void *rpdata = mtod(mbp->mb_top, void *); - fd_set rd, wr, ex; - struct timeval tv; struct sockaddr_in sender; int s = rqp->nr_fd; int n, len; - FD_ZERO(&rd); - FD_ZERO(&wr); - FD_ZERO(&ex); - FD_SET(s, &rd); - - tv.tv_sec = rqp->nr_nbd->nb_timo; - tv.tv_usec = 0; - - n = select(s + 1, &rd, &wr, &ex, &tv); - if (n == -1) - return -1; - if (n == 0) - return ETIMEDOUT; - if (FD_ISSET(s, &rd) == 0) - return ETIMEDOUT; len = sizeof(sender); n = recvfrom(s, rpdata, mbp->mb_top->m_maxlen, 0, (struct sockaddr*)&sender, &len); - if (n < 0) + if (n < 0) { + if (errno == EAGAIN) + return ETIMEDOUT; return errno; + } mbp->mb_top->m_len = mbp->mb_count = n; rqp->nr_sender = sender; return 0; @@ -294,6 +280,7 @@ nbns_rq_opensocket(struct nbns_rq *rqp) { struct sockaddr_in locaddr; + struct timeval tv; int opt, s; s = rqp->nr_fd = socket(AF_INET, SOCK_DGRAM, 0); @@ -303,6 +290,10 @@ opt = 1; if (setsockopt(s, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt)) < 0) return errno; + tv.tv_sec = rqp->nr_nbd->nb_timo; + tv.tv_usec = 0; + if (setsockopt(s, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) + return errno; if (rqp->nr_if == NULL) return NBERROR(NBERR_NOBCASTIFS); bzero(&locaddr, sizeof(locaddr));