summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy Allison <jra@samba.org>2006-05-18 19:49:44 +0000
committerGerald (Jerry) Carter <jerry@samba.org>2007-10-10 11:17:08 -0500
commit0648638fef56a65f9389c8a98f66c57663e8c401 (patch)
tree236a1c2aeb0fa8fe2d4b3913e62c222c96124130
parentc60e96c392df858dd22d39d27513486c5c18c3d2 (diff)
downloadsamba-0648638fef56a65f9389c8a98f66c57663e8c401.tar.gz
samba-0648638fef56a65f9389c8a98f66c57663e8c401.tar.bz2
samba-0648638fef56a65f9389c8a98f66c57663e8c401.zip
r15700: Make nmbd udp sockets non-blocking to prevent problem
with select returning true but no data being available. Fix for bug #3779. Jeremy. (This used to be commit e5787cf75b2e7d50f551f34f28d280c27b0aa134)
-rw-r--r--source3/lib/util_sock.c7
-rw-r--r--source3/nmbd/nmbd.c4
-rw-r--r--source3/nmbd/nmbd_responserecordsdb.c2
-rw-r--r--source3/nmbd/nmbd_serverlistdb.c2
-rw-r--r--source3/nmbd/nmbd_subnetdb.c6
-rw-r--r--source3/nmbd/nmbd_workgroupdb.c2
6 files changed, 14 insertions, 9 deletions
diff --git a/source3/lib/util_sock.c b/source3/lib/util_sock.c
index de90b29294..1a73a310b6 100644
--- a/source3/lib/util_sock.c
+++ b/source3/lib/util_sock.c
@@ -278,7 +278,12 @@ ssize_t read_udp_socket(int fd,char *buf,size_t len)
memset((char *)&lastip,'\0',sizeof(lastip));
ret = (ssize_t)sys_recvfrom(fd,buf,len,0,(struct sockaddr *)&sock,&socklen);
if (ret <= 0) {
- DEBUG(2,("read socket failed. ERRNO=%s\n",strerror(errno)));
+ /* Don't print a low debug error for a non-blocking socket. */
+ if (errno == EAGAIN) {
+ DEBUG(10,("read socket returned EAGAIN. ERRNO=%s\n",strerror(errno)));
+ } else {
+ DEBUG(2,("read socket failed. ERRNO=%s\n",strerror(errno)));
+ }
return(0);
}
diff --git a/source3/nmbd/nmbd.c b/source3/nmbd/nmbd.c
index fca17d1ff7..9c8f99df25 100644
--- a/source3/nmbd/nmbd.c
+++ b/source3/nmbd/nmbd.c
@@ -605,6 +605,10 @@ static BOOL open_sockets(BOOL isdaemon, int port)
set_socket_options( ClientNMB, "SO_BROADCAST" );
set_socket_options( ClientDGRAM, "SO_BROADCAST" );
+ /* Ensure we're non-blocking. */
+ set_blocking( ClientNMB, False);
+ set_blocking( ClientDGRAM, False);
+
DEBUG( 3, ( "open_sockets: Broadcast sockets opened.\n" ) );
return( True );
}
diff --git a/source3/nmbd/nmbd_responserecordsdb.c b/source3/nmbd/nmbd_responserecordsdb.c
index a5903ef462..6f22fd906d 100644
--- a/source3/nmbd/nmbd_responserecordsdb.c
+++ b/source3/nmbd/nmbd_responserecordsdb.c
@@ -23,8 +23,6 @@
#include "includes.h"
-extern int ClientNMB;
-
int num_response_packets = 0;
/***************************************************************************
diff --git a/source3/nmbd/nmbd_serverlistdb.c b/source3/nmbd/nmbd_serverlistdb.c
index 52d00e1585..cc762ae8d2 100644
--- a/source3/nmbd/nmbd_serverlistdb.c
+++ b/source3/nmbd/nmbd_serverlistdb.c
@@ -23,8 +23,6 @@
#include "includes.h"
-extern int ClientNMB;
-
int updatecount = 0;
/*******************************************************************
diff --git a/source3/nmbd/nmbd_subnetdb.c b/source3/nmbd/nmbd_subnetdb.c
index b2e1178beb..c3640028d2 100644
--- a/source3/nmbd/nmbd_subnetdb.c
+++ b/source3/nmbd/nmbd_subnetdb.c
@@ -26,8 +26,6 @@
#include "includes.h"
extern struct in_addr loopback_ip;
-extern int ClientNMB;
-extern int ClientDGRAM;
extern int global_nmb_port;
/* This is the broadcast subnets database. */
@@ -118,6 +116,10 @@ static struct subnet_record *make_subnet(const char *name, enum subnet_type type
/* Make sure we can broadcast from these sockets. */
set_socket_options(nmb_sock,"SO_BROADCAST");
set_socket_options(dgram_sock,"SO_BROADCAST");
+
+ /* Set them non-blocking. */
+ set_blocking(nmb_sock, False);
+ set_blocking(dgram_sock, False);
}
subrec = SMB_MALLOC_P(struct subnet_record);
diff --git a/source3/nmbd/nmbd_workgroupdb.c b/source3/nmbd/nmbd_workgroupdb.c
index 335d522031..ca665bdf4f 100644
--- a/source3/nmbd/nmbd_workgroupdb.c
+++ b/source3/nmbd/nmbd_workgroupdb.c
@@ -23,8 +23,6 @@
#include "includes.h"
-extern int ClientNMB;
-
extern uint16 samba_nb_type;
int workgroup_count = 0; /* unique index key: one for each workgroup */