- add timeouts to connect() for password server connections. This
authorAndrew Tridgell <tridge@samba.org>
Thu, 22 Aug 1996 06:32:03 +0000 (06:32 +0000)
committerAndrew Tridgell <tridge@samba.org>
Thu, 22 Aug 1996 06:32:03 +0000 (06:32 +0000)
makes multiple password servers practical.
(This used to be commit 5c3e8326cc45d3cbd076475e445ce461a2bf7560)

source3/client/client.c
source3/client/clientutil.c
source3/include/local.h
source3/include/proto.h
source3/lib/util.c
source3/nmbd/nmbd.c
source3/smbd/password.c

index 6bd94be7569007e638990d50842fd9c6718e8a35..cc178967a16be7c85cbc0a3f2ef019571aa40983 100644 (file)
@@ -2956,7 +2956,7 @@ static BOOL send_session_request(char *inbuf,char *outbuf)
       putip((char *)&dest_ip,inbuf+4);
 
       close_sockets();
-      Client = open_socket_out(SOCK_STREAM, &dest_ip, port);
+      Client = open_socket_out(SOCK_STREAM, &dest_ip, port, LONG_CONNECT_TIMEOUT);
       if (Client == -1)
         return False;
 
@@ -4025,7 +4025,7 @@ static BOOL open_sockets(int port )
       }
     }
 
-  Client = open_socket_out(SOCK_STREAM, &dest_ip, port);
+  Client = open_socket_out(SOCK_STREAM, &dest_ip, port, LONG_CONNECT_TIMEOUT);
   if (Client == -1)
     return False;
 
index e684d426121044c9bc0cda762986020a13536029..3058f654741ba20a2eacf1753e78a454c9d2b080 100644 (file)
@@ -212,7 +212,7 @@ BOOL cli_send_session_request(char *inbuf, char *outbuf)
       putip((char *)&dest_ip,inbuf+4);
 
       close_sockets();
-      Client = open_socket_out(SOCK_STREAM, &dest_ip, port);
+      Client = open_socket_out(SOCK_STREAM, &dest_ip, port, SHORT_CONNECT_TIMEOUT);
       if (Client == -1)
         return False;
 
@@ -835,7 +835,7 @@ BOOL cli_open_sockets(int port)
       putip((char *)&dest_ip,(char *)hp->h_addr);
     }
 
-  Client = open_socket_out(SOCK_STREAM, &dest_ip, port);
+  Client = open_socket_out(SOCK_STREAM, &dest_ip, port, SHORT_CONNECT_TIMEOUT);
   if (Client == -1)
     return False;
 
index 5a577909e14da66d13cfbaf9b1b2cc3236c72257..3f8572e73dc494ebc9bf7e95c857dca308d776c8 100644 (file)
    by many apps */
 #define KEEP_PASSWORD_SERVER_OPEN 1
 
+/* how long to wait for a socket connect to happen */
+#define LONG_CONNECT_TIMEOUT 30
+#define SHORT_CONNECT_TIMEOUT 5
+
 #endif
index f8685d21ea15dd5e836ee56e62f3bce847b39246..e20238fee4269aa3c3373c88813c4b43602e5a60 100644 (file)
@@ -856,6 +856,7 @@ BOOL strhaslower(char *s);
 int count_chars(char *s,char c);
 void make_dir_struct(char *buf,char *mask,char *fname,unsigned int size,int mode,time_t date);
 void close_low_fds(void);
+int set_blocking(int fd, int set);
 int write_socket(int fd,char *buf,int len);
 int read_udp_socket(int fd,char *buf,int len);
 int read_with_timeout(int fd,char *buf,int mincnt,int maxcnt,long time_out);
@@ -891,7 +892,7 @@ void Abort(void );
 BOOL get_myname(char *my_name,struct in_addr *ip);
 BOOL ip_equal(struct in_addr ip1,struct in_addr ip2);
 int open_socket_in(int type, int port, int dlevel,uint32 socket_addr);
-int open_socket_out(int type, struct in_addr *addr, int port );
+int open_socket_out(int type, struct in_addr *addr, int port ,int timeout);
 int interpret_protocol(char *str,int def);
 int interpret_security(char *str,int def);
 uint32 interpret_addr(char *str);
index 2fedded3292ccb213688bd02d3485bc6ced63d48..e13a4c37e80bf9750757b678b69563e59068143c 100644 (file)
@@ -477,6 +477,12 @@ struct
 #endif
 #ifdef SO_RCVLOWAT
   {"SO_RCVLOWAT",       SOL_SOCKET,    SO_RCVLOWAT,     0,                 OPT_INT},
+#endif
+#ifdef SO_SNDTIMEO
+  {"SO_SNDTIMEO",       SOL_SOCKET,    SO_SNDTIMEO,     0,                 OPT_INT},
+#endif
+#ifdef SO_RCVTIMEO
+  {"SO_RCVTIMEO",       SOL_SOCKET,    SO_RCVTIMEO,     0,                 OPT_INT},
 #endif
   {NULL,0,0,0,0}};
 
@@ -1655,6 +1661,35 @@ void close_low_fds(void)
   }
 }
 
+/****************************************************************************
+Set a fd into blocking/nonblocking mode. Uses POSIX O_NONBLOCK if available,
+else
+if SYSV use O_NDELAY
+if BSD use FNDELAY
+****************************************************************************/
+int set_blocking(int fd, int set)
+{
+  int val;
+#ifdef O_NONBLOCK
+#define FLAG_TO_SET O_NONBLOCK
+#else
+#ifdef SYSV
+#define FLAG_TO_SET O_NDELAY
+#else /* BSD */
+#define FLAG_TO_SET FNDELAY
+#endif
+#endif
+
+  if((val = fcntl(fd, F_GETFL, 0)) == -1)
+       return -1;
+  if(set) /* Turn blocking on - ie. clear nonblock flag */
+       val &= ~FLAG_TO_SET;
+  else
+    val |= FLAG_TO_SET;
+  return fcntl( fd, F_SETFL, val);
+#undef FLAG_TO_SET
+}
+
 
 /****************************************************************************
 write to a socket
@@ -2813,10 +2848,12 @@ int open_socket_in(int type, int port, int dlevel,uint32 socket_addr)
 /****************************************************************************
   create an outgoing socket
   **************************************************************************/
-int open_socket_out(int type, struct in_addr *addr, int port )
+int open_socket_out(int type, struct in_addr *addr, int port ,int timeout)
 {
   struct sockaddr_in sock_out;
-  int res;
+  int res,ret;
+  int connect_loop = 250; /* 250 milliseconds */
+  int loops = (timeout * 1000) / connect_loop;
 
   /* create a socket to write to */
   res = socket(PF_INET, type, 0);
@@ -2831,15 +2868,35 @@ int open_socket_out(int type, struct in_addr *addr, int port )
   sock_out.sin_port = htons( port );
   sock_out.sin_family = PF_INET;
 
+  /* set it non-blocking */
+  set_blocking(res,0);
+
   DEBUG(3,("Connecting to %s at port %d\n",inet_ntoa(*addr),port));
   
   /* and connect it to the destination */
-  if (connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out))<0) {
-    DEBUG(0,("connect error: %s\n",strerror(errno))); 
-    close(res); 
-    return(-1);
+connect_again:
+  ret = connect(res,(struct sockaddr *)&sock_out,sizeof(sock_out));
+
+  if (ret < 0 && errno == EINPROGRESS && loops--) {
+    msleep(connect_loop);
+    goto connect_again;
   }
 
+  if (ret < 0 && errno == EINPROGRESS) {
+      DEBUG(2,("timeout connecting to %s:%d\n",inet_ntoa(*addr),port));
+      close(res);
+      return -1;
+  }
+
+  if (ret < 0) {
+    DEBUG(2,("error connecting to %s:%d (%s)\n",
+            inet_ntoa(*addr),port,strerror(errno)));
+    return -1;
+  }
+
+  /* set it blocking again */
+  set_blocking(res,1);
+
   return res;
 }
 
index 097e4f794a53d3552d57a448461e63844f185867..5b3fd19491de9a013fb639778ccdc2d2d1cdf6e8 100644 (file)
@@ -357,17 +357,22 @@ static BOOL open_sockets(BOOL isdaemon, int port)
 ****************************************************************************/
 static BOOL init_structs()
 {
-  if (!get_myname(myhostname,NULL))
-    return(False);
+  extern fstring local_machine;
+  char *p;
 
   if (! *myname) {
-    char *p;
     strcpy(myname,myhostname);
     p = strchr(myname,'.');
     if (p) *p = 0;
   }
   strupper(myname);
 
+  strcpy(local_machine,myname);
+  trim_string(local_machine," "," ");
+  p = strchr(local_machine,' ');
+  if (p) *p = 0;
+  strlower(local_machine);
+
   return True;
 }
 
@@ -479,11 +484,15 @@ static void usage(char *pname)
   DEBUG(1,("%s netbios nameserver version %s started\n",timestring(),VERSION));
   DEBUG(1,("Copyright Andrew Tridgell 1994\n"));
 
+  get_myname(myhostname,NULL);
+
   if (!reload_services(False))
     return(-1);        
 
   init_structs();
 
+  reload_services(True);
+
   set_samba_nb_type();
 
   if (!is_daemon && !is_a_socket(0)) {
index a5f597682f646cbb815789895809c9f1eab19ca7..fd3ff4fd179c031892992435087c9103e81d6d19 100644 (file)
@@ -1287,7 +1287,7 @@ BOOL server_cryptkey(char *buf)
       continue;
     }
 
-    password_client = open_socket_out(SOCK_STREAM, &dest_ip, port);
+    password_client = open_socket_out(SOCK_STREAM, &dest_ip, port, SHORT_CONNECT_TIMEOUT);
     if (password_client >= 0) {
       DEBUG(3,("connected to password server %s\n",p));
       StrnCpy(pserver,p,sizeof(pserver)-1);