source: vendor/current/source3/smbd/conn_idle.c

Last change on this file was 988, checked in by Silvan Scherrer, 9 years ago

Samba Server: update vendor to version 4.4.3

File size: 3.9 KB
Line 
1/*
2 Unix SMB/CIFS implementation.
3 Manage connections_struct structures
4 Copyright (C) Andrew Tridgell 1998
5 Copyright (C) Alexander Bokovoy 2002
6 Copyright (C) Jeremy Allison 2010
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>.
20*/
21
22#include "includes.h"
23#include "smbd/smbd.h"
24#include "smbd/globals.h"
25#include "rpc_server/rpc_pipes.h"
26
27/****************************************************************************
28 Update last used timestamps.
29****************************************************************************/
30
31static void conn_lastused_update(struct smbd_server_connection *sconn,time_t t)
32{
33 struct connection_struct *conn;
34
35 for (conn=sconn->connections; conn; conn=conn->next) {
36 /* Update if connection wasn't idle. */
37 if (conn->lastused != conn->lastused_count) {
38 conn->lastused = t;
39 conn->lastused_count = t;
40 }
41 }
42}
43
44/****************************************************************************
45 Idle inactive connections.
46****************************************************************************/
47
48bool conn_idle_all(struct smbd_server_connection *sconn, time_t t)
49{
50 int deadtime = lp_deadtime()*60;
51 struct connection_struct *conn;
52
53 conn_lastused_update(sconn, t);
54
55 if (deadtime <= 0) {
56 deadtime = DEFAULT_SMBD_TIMEOUT;
57 }
58
59 for (conn=sconn->connections;conn;conn=conn->next) {
60 time_t age = t - conn->lastused;
61
62 /* close dirptrs on connections that are idle */
63 if (age > DPTR_IDLE_TIMEOUT) {
64 dptr_idlecnum(conn);
65 }
66
67 if (conn->num_files_open > 0 || age < deadtime) {
68 return false;
69 }
70 }
71
72 /*
73 * Check all pipes for any open handles. We cannot
74 * idle with a handle open.
75 */
76 if (check_open_pipes()) {
77 return false;
78 }
79
80 return true;
81}
82
83/****************************************************************************
84 Forcibly unmount a share.
85 All instances of the parameter 'sharename' share are unmounted.
86 The special sharename '*' forces unmount of all shares.
87****************************************************************************/
88
89void conn_force_tdis(struct smbd_server_connection *sconn, const char *sharename)
90{
91 connection_struct *conn, *next;
92 bool close_all = false;
93
94 if (strcmp(sharename, "*") == 0) {
95 close_all = true;
96 DEBUG(1, ("conn_force_tdis: Forcing close of all shares\n"));
97 }
98
99 /* SMB1 and SMB 2*/
100 for (conn = sconn->connections; conn; conn = next) {
101 struct smbXsrv_tcon *tcon;
102 bool do_close = false;
103 NTSTATUS status;
104 uint64_t vuid = UID_FIELD_INVALID;
105
106 next = conn->next;
107
108 if (conn->tcon == NULL) {
109 continue;
110 }
111 tcon = conn->tcon;
112
113 if (close_all) {
114 do_close = true;
115 } else if (strequal(lp_servicename(talloc_tos(), SNUM(conn)),
116 sharename)) {
117 DEBUG(1, ("conn_force_tdis: Forcing close of "
118 "share '%s' (wire_id=0x%08x)\n",
119 tcon->global->share_name,
120 tcon->global->tcon_wire_id));
121 do_close = true;
122 }
123
124 if (!do_close) {
125 continue;
126 }
127
128 if (sconn->using_smb2) {
129 vuid = conn->vuid;
130 }
131
132 conn = NULL;
133 status = smbXsrv_tcon_disconnect(tcon, vuid);
134 if (!NT_STATUS_IS_OK(status)) {
135 DEBUG(0, ("conn_force_tdis: "
136 "smbXsrv_tcon_disconnect() of share '%s' "
137 "(wire_id=0x%08x) failed: %s\n",
138 tcon->global->share_name,
139 tcon->global->tcon_wire_id,
140 nt_errstr(status)));
141 }
142
143 TALLOC_FREE(tcon);
144 }
145
146 change_to_root_user();
147 reload_services(sconn, conn_snum_used, true);
148}
Note: See TracBrowser for help on using the repository browser.