From: Ralph Boehme Date: Thu, 2 Jan 2020 10:42:05 +0000 (+0100) Subject: smbd: add smbXsrv_session_local_traverse() X-Git-Tag: ldb-2.1.0~30 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=18b43aeb5747f0982e4296960f23986a5f536960;p=thirdparty%2Fsamba.git smbd: add smbXsrv_session_local_traverse() Signed-off-by: Ralph Boehme Reviewed-by: Jeremy Allison --- diff --git a/source3/smbd/globals.h b/source3/smbd/globals.h index 57300dd02ae..72edd28b68c 100644 --- a/source3/smbd/globals.h +++ b/source3/smbd/globals.h @@ -586,6 +586,11 @@ NTSTATUS smb2srv_session_lookup_client(struct smbXsrv_client *client, NTSTATUS get_valid_smbXsrv_session(struct smbXsrv_client *client, uint64_t session_wire_id, struct smbXsrv_session **session); +NTSTATUS smbXsrv_session_local_traverse( + struct smbXsrv_client *client, + int (*caller_cb)(struct smbXsrv_session *session, + void *caller_data), + void *caller_data); struct smbXsrv_session_global0; NTSTATUS smbXsrv_session_global_traverse( int (*fn)(struct smbXsrv_session_global0 *, void *), diff --git a/source3/smbd/smbXsrv_session.c b/source3/smbd/smbXsrv_session.c index b2d36d380be..77c285d741b 100644 --- a/source3/smbd/smbXsrv_session.c +++ b/source3/smbd/smbXsrv_session.c @@ -1830,6 +1830,77 @@ static int smbXsrv_session_logoff_all_callback(struct db_record *local_rec, return 0; } +struct smbXsrv_session_local_trav_state { + NTSTATUS status; + int (*caller_cb)(struct smbXsrv_session *session, + void *caller_data); + void *caller_data; +}; + +static int smbXsrv_session_local_traverse_cb(struct db_record *local_rec, + void *private_data); + +NTSTATUS smbXsrv_session_local_traverse( + struct smbXsrv_client *client, + int (*caller_cb)(struct smbXsrv_session *session, + void *caller_data), + void *caller_data) +{ + struct smbXsrv_session_table *table = client->session_table; + struct smbXsrv_session_local_trav_state state; + NTSTATUS status; + int count = 0; + + state = (struct smbXsrv_session_local_trav_state) { + .status = NT_STATUS_OK, + .caller_cb = caller_cb, + .caller_data = caller_data, + }; + + if (table == NULL) { + DBG_DEBUG("empty session_table, nothing to do.\n"); + return NT_STATUS_OK; + } + + status = dbwrap_traverse(table->local.db_ctx, + smbXsrv_session_local_traverse_cb, + &state, + &count); + if (!NT_STATUS_IS_OK(status)) { + DBG_ERR("dbwrap_traverse() failed: %s\n", nt_errstr(status)); + return status; + } + if (!NT_STATUS_IS_OK(state.status)) { + DBG_ERR("count[%d] status[%s]\n", + count, nt_errstr(state.status)); + return state.status; + } + + return NT_STATUS_OK; +} + +static int smbXsrv_session_local_traverse_cb(struct db_record *local_rec, + void *private_data) +{ + struct smbXsrv_session_local_trav_state *state = + (struct smbXsrv_session_local_trav_state *)private_data; + TDB_DATA val; + void *ptr = NULL; + struct smbXsrv_session *session = NULL; + + val = dbwrap_record_get_value(local_rec); + if (val.dsize != sizeof(ptr)) { + state->status = NT_STATUS_INTERNAL_ERROR; + return -1; + } + + memcpy(&ptr, val.dptr, val.dsize); + session = talloc_get_type_abort(ptr, struct smbXsrv_session); + session->db_rec = local_rec; + + return state->caller_cb(session, state->caller_data); +} + NTSTATUS smb1srv_session_table_init(struct smbXsrv_connection *conn) { /*