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;