IGNORE add smbXsrv_session_global_lookup"
authorStefan Metzmacher <metze@samba.org>
Fri, 13 Apr 2012 11:57:41 +0000 (13:57 +0200)
committerStefan Metzmacher <metze@samba.org>
Wed, 16 May 2012 06:10:16 +0000 (08:10 +0200)
source3/smbd/smbXsrv_session.c

index 7043122f6a861c55d7b50599a6d79aad824e8467..cedf20d332fc2eb040b6790adc69218fbc4303e8 100644 (file)
@@ -622,6 +622,80 @@ static NTSTATUS smbXsrv_session_global_store(struct smbXsrv_connection *sconn,
        return NT_STATUS_OK;
 }
 
+struct smbXsrv_session_global_fetch_state {
+       TALLOC_CTX *mem_ctx;
+       struct smbXsrv_session_global0 *session;
+       NTSTATUS status;
+};
+
+static void smbXsrv_session_global_fetch_parser(TDB_DATA key, TDB_DATA data,
+                                              void *private_data)
+{
+       struct smbXsrv_session_global_fetch_state *state =
+               (struct smbXsrv_session_global_fetch_state *)private_data;
+       struct smbXsrv_session_globalB global_blob;
+       DATA_BLOB blob = data_blob_const(data.dptr, data.dsize);
+       enum ndr_err_code ndr_err;
+
+       ndr_err = ndr_pull_struct_blob_all(&blob, state->mem_ctx, &global_blob,
+                       (ndr_pull_flags_fn_t)ndr_pull_smbXsrv_session_globalB);
+       if (!NDR_ERR_CODE_IS_SUCCESS(ndr_err)) {
+               //status = ndr_err_code;
+               state->status = NT_STATUS_INVALID_USER_BUFFER;
+               //TODO status = map
+               return;
+       }
+
+       if (global_blob.version != 0) {
+               state->status = NT_STATUS_INTERNAL_DB_CORRUPTION;
+               //TODO status = map
+               return;
+       }
+
+       state->session = talloc_move(state->mem_ctx, &global_blob.info.info0);
+       state->status = NT_STATUS_OK;
+       return;
+}
+
+static NTSTATUS smbXsrv_session_global_lookup(struct smbXsrv_session_table *table,
+                                             uint32_t session_global_id,
+                                             TALLOC_CTX *mem_ctx,
+                                             struct smbXsrv_session_global0 **_session)
+{
+       struct smbXsrv_session_global_fetch_state state = {
+               .mem_ctx = mem_ctx,
+               .session = NULL,
+               .status = NT_STATUS_INTERNAL_ERROR,
+       };
+       TDB_DATA key;
+       uint8_t key_buf[sizeof(uint32_t)];
+       NTSTATUS status;
+
+       *_session = NULL;
+
+       if (table->global.db_ctx == NULL) {
+               return NT_STATUS_INTERNAL_ERROR;
+       }
+
+       /* TODO: key as string */
+       RSIVAL(key_buf, 0, session_global_id);
+       key = make_tdb_data(key_buf, sizeof(key_buf));
+
+       status = dbwrap_parse_record(table->global.db_ctx, key,
+                                    smbXsrv_session_global_fetch_parser, &state);
+       if (NT_STATUS_EQUAL(status, NT_STATUS_NOT_FOUND)) {
+               return NT_STATUS_USER_SESSION_DELETED;
+       } else if (!NT_STATUS_IS_OK(status)) {
+               return status;
+       }
+       if (!NT_STATUS_IS_OK(state.status)) {
+               return state.status;
+       }
+
+       *_session = state.session;
+       return NT_STATUS_OK;
+}
+
 static int smbXsrv_session_destructor(struct smbXsrv_session *session)
 {
        struct smbXsrv_session_table *table;