diff options
author | Jeremy Allison <jra@samba.org> | 2006-05-18 19:49:44 +0000 |
---|---|---|
committer | Gerald (Jerry) Carter <jerry@samba.org> | 2007-10-10 11:17:08 -0500 |
commit | 0648638fef56a65f9389c8a98f66c57663e8c401 (patch) | |
tree | 236a1c2aeb0fa8fe2d4b3913e62c222c96124130 | |
parent | c60e96c392df858dd22d39d27513486c5c18c3d2 (diff) | |
download | samba-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.c | 7 | ||||
-rw-r--r-- | source3/nmbd/nmbd.c | 4 | ||||
-rw-r--r-- | source3/nmbd/nmbd_responserecordsdb.c | 2 | ||||
-rw-r--r-- | source3/nmbd/nmbd_serverlistdb.c | 2 | ||||
-rw-r--r-- | source3/nmbd/nmbd_subnetdb.c | 6 | ||||
-rw-r--r-- | source3/nmbd/nmbd_workgroupdb.c | 2 |
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 */ |