r23502: Restore exit-on-idle. Small refactoring for clarity. Exit if
[sfrench/samba-autobuild/.git] / source / smbd / server.c
index 98b9fb86263dbcd10d147fb67986059382defaf8..532de36bf8b80f79fd3ff659070fc9bd180eda1e 100644 (file)
@@ -315,6 +315,16 @@ static BOOL allowable_number_of_smbd_processes(void)
        return num_children < max_processes;
 }
 
+/****************************************************************************
+ Are we idle enough that we could safely exit?
+****************************************************************************/
+
+static BOOL smbd_is_idle(void)
+{
+       /* Currently we define "idle" as having no client connections. */
+       return count_all_current_connections() == 0;
+}
+
 /****************************************************************************
  Open the socket communication.
 ****************************************************************************/
@@ -414,10 +424,22 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
                                         &r_fds, &w_fds, &idle_timeout,
                                         &maxfd);
 
-               num = sys_select(maxfd+1,&r_fds,&w_fds,NULL,
-                                timeval_is_zero(&idle_timeout) ?
-                                NULL : &idle_timeout);
-               
+               if (timeval_is_zero(&idle_timeout)) {
+                       num = sys_select(maxfd + 1, &r_fds, &w_fds,
+                                       NULL, NULL);
+               } else {
+                       num = sys_select(maxfd + 1, &r_fds, &w_fds,
+                                       NULL, &idle_timeout);
+
+                       /* If the idle timeout fired and we are idle, exit
+                        * gracefully. We expect to be running under a process
+                        * controller that will restart us if necessry.
+                        */
+                       if (num == 0 && smbd_is_idle()) {
+                               exit_server_cleanly("idle timeout");
+                       }
+               }
+
                if (num == -1 && errno == EINTR) {
                        if (got_sig_term) {
                                exit_server_cleanly(NULL);
@@ -438,19 +460,6 @@ static BOOL open_sockets_smbd(enum smb_server_mode server_mode, const char *smb_
                        continue;
                }
 
-#if 0
-               Deactivated for now, this needs to become a timed event
-               vl
-
-               /* If the idle timeout fired and we don't have any connected
-                * users, exit gracefully. We should be running under a process
-                * controller that will restart us if necessry.
-                */
-               if (num == 0 && count_all_current_connections() == 0) {
-                       exit_server_cleanly("idle timeout");
-               }
-#endif
-
                /* check if we need to reload services */
                check_reload(time(NULL));