The special sharename '*' forces unmount of all shares.
****************************************************************************/
-void conn_force_tdis(struct smbd_server_connection *sconn, const char *sharename)
+void conn_force_tdis(
+ struct smbd_server_connection *sconn,
+ bool (*check_fn)(struct connection_struct *conn,
+ void *private_data),
+ void *private_data)
{
- const struct loadparm_substitution *lp_sub =
- loadparm_s3_global_substitution();
connection_struct *conn, *next;
- bool close_all = false;
-
- if (strcmp(sharename, "*") == 0) {
- close_all = true;
- DEBUG(1, ("conn_force_tdis: Forcing close of all shares\n"));
- }
/* SMB1 and SMB 2*/
for (conn = sconn->connections; conn; conn = next) {
}
tcon = conn->tcon;
- if (close_all) {
- do_close = true;
- } else if (strequal(lp_servicename(talloc_tos(), lp_sub, SNUM(conn)),
- sharename)) {
- DEBUG(1, ("conn_force_tdis: Forcing close of "
- "share '%s' (wire_id=0x%08x)\n",
- tcon->global->share_name,
- tcon->global->tcon_wire_id));
- do_close = true;
- }
-
+ do_close = check_fn(conn, private_data);
if (!do_close) {
continue;
}
+ DBG_WARNING("Forcing close of "
+ "share '%s' (wire_id=0x%08x)\n",
+ tcon->global->share_name,
+ tcon->global->tcon_wire_id);
+
if (sconn->using_smb2) {
vuid = conn->vuid;
}
The special sharename '*' forces unmount of all shares.
****************************************************************************/
+struct force_tdis_state {
+ const char *sharename;
+};
+
+static bool force_tdis_check(
+ struct connection_struct *conn,
+ void *private_data)
+{
+ struct force_tdis_state *state = private_data;
+ const struct loadparm_substitution *lp_sub =
+ loadparm_s3_global_substitution();
+ char *servicename = NULL;
+ bool do_close;
+
+ if (strcmp(state->sharename, "*") == 0) {
+ DBG_WARNING("Forcing close of all shares\n");
+ return true;
+ }
+
+ servicename = lp_servicename(talloc_tos(), lp_sub, SNUM(conn));
+ do_close = strequal(servicename, state->sharename);
+
+ TALLOC_FREE(servicename);
+
+ return do_close;
+}
+
void msg_force_tdis(struct messaging_context *msg,
void *private_data,
uint32_t msg_type,
struct server_id server_id,
DATA_BLOB *data)
{
- const char *sharename = (const char *)data->data;
+ struct force_tdis_state state = {
+ .sharename = (const char *)data->data,
+ };
struct smbd_server_connection *sconn =
talloc_get_type_abort(private_data,
struct smbd_server_connection);
return;
}
- conn_force_tdis(sconn, sharename);
+ conn_force_tdis(sconn, force_tdis_check, &state);
}
bool conn_idle_all(struct smbd_server_connection *sconn, time_t t);
void conn_clear_vuid_caches(struct smbd_server_connection *sconn, uint64_t vuid);
void conn_free(connection_struct *conn);
-void conn_force_tdis(struct smbd_server_connection *sconn, const char *sharename);
+void conn_force_tdis(
+ struct smbd_server_connection *sconn,
+ bool (*check_fn)(struct connection_struct *conn,
+ void *private_data),
+ void *private_data);
void msg_force_tdis(struct messaging_context *msg,
void *private_data,
uint32_t msg_type,