summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source3/smbd/conn.c27
-rw-r--r--source3/smbd/process.c21
-rw-r--r--source3/smbd/server.c40
3 files changed, 45 insertions, 43 deletions
diff --git a/source3/smbd/conn.c b/source3/smbd/conn.c
index 2d4020af39..388cd004f9 100644
--- a/source3/smbd/conn.c
+++ b/source3/smbd/conn.c
@@ -191,14 +191,14 @@ BOOL conn_idle_all(time_t t)
{
int deadtime = lp_deadtime()*60;
pipes_struct *plist = NULL;
- BOOL allidle = True;
- connection_struct *conn, *next;
+ connection_struct *conn;
if (deadtime <= 0)
deadtime = DEFAULT_SMBD_TIMEOUT;
- for (conn=Connections;conn;conn=next) {
- next=conn->next;
+ for (conn=Connections;conn;conn=conn->next) {
+
+ time_t age = t - conn->lastused;
/* Update if connection wasn't idle. */
if (conn->lastused != conn->lastused_count) {
@@ -207,12 +207,12 @@ BOOL conn_idle_all(time_t t)
}
/* close dirptrs on connections that are idle */
- if ((t-conn->lastused) > DPTR_IDLE_TIMEOUT) {
+ if (age > DPTR_IDLE_TIMEOUT) {
dptr_idlecnum(conn);
}
- if (conn->num_files_open > 0 || (t-conn->lastused)<deadtime) {
- allidle = False;
+ if (conn->num_files_open > 0 || age < deadtime) {
+ return False;
}
}
@@ -221,11 +221,14 @@ BOOL conn_idle_all(time_t t)
* idle with a handle open.
*/
- for (plist = get_first_internal_pipe(); plist; plist = get_next_internal_pipe(plist))
- if (plist->pipe_handles && plist->pipe_handles->count)
- allidle = False;
+ for (plist = get_first_internal_pipe(); plist;
+ plist = get_next_internal_pipe(plist)) {
+ if (plist->pipe_handles && plist->pipe_handles->count) {
+ return False;
+ }
+ }
- return allidle;
+ return True;
}
/****************************************************************************
@@ -303,6 +306,8 @@ void conn_free(connection_struct *conn)
DLIST_REMOVE(Connections, conn);
bitmap_clear(bmap, conn->cnum);
+
+ SMB_ASSERT(num_open > 0);
num_open--;
conn_free_internal(conn);
diff --git a/source3/smbd/process.c b/source3/smbd/process.c
index 76af8f2054..6497dfa97b 100644
--- a/source3/smbd/process.c
+++ b/source3/smbd/process.c
@@ -1328,9 +1328,7 @@ void check_reload(time_t t)
static BOOL timeout_processing(int *select_timeout,
time_t *last_timeout_processing_time)
{
- static time_t last_idle_closed_check = 0;
time_t t;
- BOOL allidle = True;
if (smb_read_error == READ_EOF) {
DEBUG(3,("timeout_processing: End of file from client (client has disconnected).\n"));
@@ -1350,31 +1348,12 @@ static BOOL timeout_processing(int *select_timeout,
*last_timeout_processing_time = t = time(NULL);
- if(last_idle_closed_check == 0)
- last_idle_closed_check = t;
-
/* become root again if waiting */
change_to_root_user();
/* check if we need to reload services */
check_reload(t);
- /* automatic timeout if all connections are closed */
- if (conn_num_open()==0 && (t - last_idle_closed_check) >= IDLE_CLOSED_TIMEOUT) {
- DEBUG( 2, ( "Closing idle connection\n" ) );
- return False;
- } else {
- last_idle_closed_check = t;
- }
-
- /* check for connection timeouts */
- allidle = conn_idle_all(t);
-
- if (allidle && conn_num_open()>0) {
- DEBUG(2,("Closing idle connection 2.\n"));
- return False;
- }
-
if(global_machine_password_needs_changing &&
/* for ADS we need to do a regular ADS password change, not a domain
password change */
diff --git a/source3/smbd/server.c b/source3/smbd/server.c
index 0d4953e5b8..3f4313ce7f 100644
--- a/source3/smbd/server.c
+++ b/source3/smbd/server.c
@@ -826,6 +826,22 @@ static BOOL keepalive_fn(const struct timeval *now, void *private_data)
return True;
}
+/*
+ * Do the recurring check if we're idle
+ */
+static BOOL deadtime_fn(const struct timeval *now, void *private_data)
+{
+ if ((conn_num_open() == 0)
+ || (conn_idle_all(now->tv_sec))) {
+ DEBUG( 2, ( "Closing idle connection\n" ) );
+ message_send_pid(procid_self(), MSG_SHUTDOWN, NULL, 0, False);
+ return False;
+ }
+
+ return True;
+}
+
+
/****************************************************************************
main program.
****************************************************************************/
@@ -1119,18 +1135,20 @@ extern void build_options(BOOL screen);
/* register our message handlers */
message_register(MSG_SMB_FORCE_TDIS, msg_force_tdis, NULL);
- if (lp_keepalive() != 0) {
- struct timeval interval;
-
- interval.tv_sec = lp_keepalive();
- interval.tv_usec = 0;
+ if ((lp_keepalive() != 0)
+ && !(event_add_idle(smbd_event_context(), NULL,
+ timeval_set(lp_keepalive(), 0),
+ "keepalive", keepalive_fn,
+ NULL))) {
+ DEBUG(0, ("Could not add keepalive event\n"));
+ exit(1);
+ }
- if (!(event_add_idle(smbd_event_context(), NULL,
- interval, "keepalive", keepalive_fn,
- NULL))) {
- DEBUG(0, ("Could not add keepalive event\n"));
- exit(1);
- }
+ if (!(event_add_idle(smbd_event_context(), NULL,
+ timeval_set(IDLE_CLOSED_TIMEOUT, 0),
+ "deadtime", deadtime_fn, NULL))) {
+ DEBUG(0, ("Could not add deadtime event\n"));
+ exit(1);
}
smbd_process();