smbd: move homes_snum from struct user_struct to struct smbXsrv_session
[gd/samba-autobuild/.git] / source3 / smbd / smbXsrv_session.c
index 2c5b2ffe2fcde98b49bc49cd63d1836986f90365..1bed4ab22e9e8a85117726e9f65f0a541e3dd0eb 100644 (file)
@@ -67,7 +67,7 @@ NTSTATUS smbXsrv_session_global_init(struct messaging_context *msg_ctx)
        /*
         * This contains secret information like session keys!
         */
-       global_path = lock_path("smbXsrv_session_global.tdb");
+       global_path = lock_path(talloc_tos(), "smbXsrv_session_global.tdb");
        if (global_path == NULL) {
                return NT_STATUS_NO_MEMORY;
        }
@@ -89,7 +89,7 @@ NTSTATUS smbXsrv_session_global_init(struct messaging_context *msg_ctx)
                return status;
        }
 
-       db_ctx = db_open_watched(NULL, backend, server_messaging_context());
+       db_ctx = db_open_watched(NULL, &backend, global_messaging_context());
        if (db_ctx == NULL) {
                TALLOC_FREE(backend);
                return NT_STATUS_NO_MEMORY;
@@ -1110,7 +1110,7 @@ static void smb2srv_session_close_previous_check(struct tevent_req *req)
                return;
        }
 
-       status = messaging_send(conn->msg_ctx,
+       status = messaging_send(conn->client->msg_ctx,
                                global->channels[0].server_id,
                                MSG_SMBXSRV_SESSION_CLOSE, &blob);
        TALLOC_FREE(state->db_rec);
@@ -1234,6 +1234,7 @@ NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
        session->idle_time = now;
        session->status = NT_STATUS_MORE_PROCESSING_REQUIRED;
        session->client = conn->client;
+       session->homes_snum = -1;
 
        status = smbXsrv_session_global_allocate(table->global.db_ctx,
                                                 session,
@@ -1321,11 +1322,10 @@ NTSTATUS smbXsrv_session_create(struct smbXsrv_connection *conn,
        }
 
        if (DEBUGLVL(10)) {
-               struct smbXsrv_sessionB session_blob;
-
-               ZERO_STRUCT(session_blob);
-               session_blob.version = SMBXSRV_VERSION_0;
-               session_blob.info.info0 = session;
+               struct smbXsrv_sessionB session_blob = {
+                       .version = SMBXSRV_VERSION_0,
+                       .info.info0 = session,
+               };
 
                DEBUG(10,("smbXsrv_session_create: global_id (0x%08x) stored\n",
                         session->global->session_global_id));
@@ -1362,7 +1362,7 @@ NTSTATUS smbXsrv_session_add_channel(struct smbXsrv_session *session,
        c = &global->channels[global->num_channels];
        ZERO_STRUCTP(c);
 
-       c->server_id = messaging_server_id(conn->msg_ctx);
+       c->server_id = messaging_server_id(conn->client->msg_ctx);
        c->local_address = tsocket_address_string(conn->local_address,
                                                  global->channels);
        if (c->local_address == NULL) {
@@ -1416,11 +1416,10 @@ NTSTATUS smbXsrv_session_update(struct smbXsrv_session *session)
        }
 
        if (DEBUGLVL(10)) {
-               struct smbXsrv_sessionB session_blob;
-
-               ZERO_STRUCT(session_blob);
-               session_blob.version = SMBXSRV_VERSION_0;
-               session_blob.info.info0 = session;
+               struct smbXsrv_sessionB session_blob = {
+                       .version = SMBXSRV_VERSION_0,
+                       .info.info0 = session,
+               };
 
                DEBUG(10,("smbXsrv_session_update: global_id (0x%08x) stored\n",
                          session->global->session_global_id));
@@ -1663,6 +1662,35 @@ NTSTATUS smbXsrv_session_logoff(struct smbXsrv_session *session)
        session->client = NULL;
        session->status = NT_STATUS_USER_SESSION_DELETED;
 
+       if (session->compat) {
+               /*
+                * For SMB2 this is a bit redundant as files are also close
+                * below via smb2srv_tcon_disconnect_all() -> ... ->
+                * smbXsrv_tcon_disconnect() -> close_cnum() ->
+                * file_close_conn().
+                */
+               file_close_user(sconn, session->compat->vuid);
+       }
+
+       if (session->tcon_table != NULL) {
+               /*
+                * Note: We only have a tcon_table for SMB2.
+                */
+               status = smb2srv_tcon_disconnect_all(session);
+               if (!NT_STATUS_IS_OK(status)) {
+                       DEBUG(0, ("smbXsrv_session_logoff(0x%08x): "
+                                 "smb2srv_tcon_disconnect_all() failed: %s\n",
+                                 session->global->session_global_id,
+                                 nt_errstr(status)));
+                       error = status;
+               }
+       }
+
+       if (session->compat) {
+               invalidate_vuid(sconn, session->compat->vuid);
+               session->compat = NULL;
+       }
+
        global_rec = session->global->db_rec;
        session->global->db_rec = NULL;
        if (global_rec == NULL) {
@@ -1722,29 +1750,6 @@ NTSTATUS smbXsrv_session_logoff(struct smbXsrv_session *session)
        }
        session->db_rec = NULL;
 
-       if (session->compat) {
-               file_close_user(sconn, session->compat->vuid);
-       }
-
-       if (session->tcon_table != NULL) {
-               /*
-                * Note: We only have a tcon_table for SMB2.
-                */
-               status = smb2srv_tcon_disconnect_all(session);
-               if (!NT_STATUS_IS_OK(status)) {
-                       DEBUG(0, ("smbXsrv_session_logoff(0x%08x): "
-                                 "smb2srv_tcon_disconnect_all() failed: %s\n",
-                                 session->global->session_global_id,
-                                 nt_errstr(status)));
-                       error = status;
-               }
-       }
-
-       if (session->compat) {
-               invalidate_vuid(sconn, session->compat->vuid);
-               session->compat = NULL;
-       }
-
        return error;
 }
 
@@ -1756,9 +1761,9 @@ struct smbXsrv_session_logoff_all_state {
 static int smbXsrv_session_logoff_all_callback(struct db_record *local_rec,
                                               void *private_data);
 
-NTSTATUS smbXsrv_session_logoff_all(struct smbXsrv_connection *conn)
+NTSTATUS smbXsrv_session_logoff_all(struct smbXsrv_client *client)
 {
-       struct smbXsrv_session_table *table = conn->client->session_table;
+       struct smbXsrv_session_table *table = client->session_table;
        struct smbXsrv_session_logoff_all_state state;
        NTSTATUS status;
        int count = 0;