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));

Reply via email to