From 4aa44f7475e03dcc596f6a13fffffda7268074a1 Mon Sep 17 00:00:00 2001 From: Volker Lendecke Date: Tue, 8 May 2007 13:44:36 +0000 Subject: r22761: This introduces lib/conn_tdb.c with two main functions: connections_traverse and connections_forall. This centralizes all the routines that did individual tdb_open("connections.tdb") and direct tdb_traverse. Volker (This used to be commit e43e94cda1ad8876b3cb5d1129080b57fa6ec214) --- source3/lib/conn_tdb.c | 109 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 source3/lib/conn_tdb.c (limited to 'source3/lib/conn_tdb.c') diff --git a/source3/lib/conn_tdb.c b/source3/lib/conn_tdb.c new file mode 100644 index 0000000000..e6f491bbfb --- /dev/null +++ b/source3/lib/conn_tdb.c @@ -0,0 +1,109 @@ +/* + Unix SMB/CIFS implementation. + Low-level connections.tdb access functions + Copyright (C) Volker Lendecke 2007 + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. +*/ + +#include "includes.h" + +TDB_CONTEXT *conn_tdb_ctx(BOOL rw) +{ + static TDB_CONTEXT *tdb; + + if (tdb != NULL) { + return tdb; + } + + if (rw) { + tdb = tdb_open_log(lock_path("connections.tdb"), 0, + TDB_CLEAR_IF_FIRST|TDB_DEFAULT, + O_RDWR | O_CREAT, 0644); + } + else { + tdb = tdb_open_log(lock_path("connections.tdb"), 0, + TDB_DEFAULT, O_RDONLY, 0); + } + + if (tdb == NULL) { + DEBUG(0, ("Could not open connections.tdb: %s\n", + strerror(errno))); + } + + return tdb; +} + +struct conn_traverse_state { + int (*fn)(TDB_CONTEXT *tdb, + const struct connections_key *key, + const struct connections_data *data, + void *private_data); + void *private_data; +}; + +static int conn_traverse_fn(TDB_CONTEXT *tdb, TDB_DATA key, + TDB_DATA data, void *private_data) +{ + struct conn_traverse_state *state = + (struct conn_traverse_state *)private_data; + + if ((key.dsize != sizeof(struct connections_key)) + || (data.dsize != sizeof(struct connections_data))) { + return 0; + } + + return state->fn( + tdb, (const struct connections_key *)key.dptr, + (const struct connections_data *)data.dptr, + state->private_data); +} + +int connections_traverse(int (*fn)(TDB_CONTEXT *tdb, TDB_DATA key, + TDB_DATA data, void *private_data), + void *private_data) +{ + TDB_CONTEXT *tdb = conn_tdb_ctx(True); + + if (tdb == NULL) { + DEBUG(5, ("Could not open connections.tdb r/w, trying r/o\n")); + tdb = conn_tdb_ctx(False); + } + + if (tdb == NULL) { + return -1; + } + + return tdb_traverse(tdb, fn, private_data); +} + +int connections_forall(int (*fn)(TDB_CONTEXT *tdb, + const struct connections_key *key, + const struct connections_data *data, + void *private_data), + void *private_data) +{ + struct conn_traverse_state state; + + state.fn = fn; + state.private_data = private_data; + + return connections_traverse(conn_traverse_fn, (void *)&state); +} + +BOOL connections_init(BOOL rw) +{ + return (conn_tdb_ctx(rw) != NULL); +} -- cgit