]> git.ipfire.org Git - thirdparty/samba.git/commitdiff
smbd: Move sharename check of conn_force_tdis() into a callback
authorVolker Lendecke <vl@samba.org>
Mon, 13 Jan 2020 14:37:25 +0000 (15:37 +0100)
committerJeremy Allison <jra@samba.org>
Wed, 15 Jan 2020 21:25:34 +0000 (21:25 +0000)
Next commit will have an additional check

Signed-off-by: Volker Lendecke <vl@samba.org>
Reviewed-by: Jeremy Allison <jra@samba.org>
source3/smbd/conn_idle.c
source3/smbd/conn_msg.c
source3/smbd/proto.h

index 078a0ed691702aefbb7116e57c6b6b3ce3073f6a..cd12e3f12665978eef12014626f725660b98c637 100644 (file)
@@ -81,17 +81,13 @@ bool conn_idle_all(struct smbd_server_connection *sconn, time_t t)
  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) {
@@ -107,21 +103,16 @@ void conn_force_tdis(struct smbd_server_connection *sconn, const char *sharename
                }
                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;
                }
index b4d563dbb99f36344e0838bc1ea75ba8a5f3ddea..3d27121b7432cfc137a25b2390eb2f24dfe02e56 100644 (file)
  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);
@@ -46,5 +75,5 @@ void msg_force_tdis(struct messaging_context *msg,
                return;
        }
 
-       conn_force_tdis(sconn, sharename);
+       conn_force_tdis(sconn, force_tdis_check, &state);
 }
index 4b1960b0c14004b1b3afaf1a9a8e1ecdfb1e3191..88becd7df7287f2d878a22bd0b0c81950cb00d8a 100644 (file)
@@ -154,7 +154,11 @@ connection_struct *conn_new(struct smbd_server_connection *sconn);
 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,