diff options
Diffstat (limited to 'source4/rpc_server/spoolss')
-rw-r--r-- | source4/rpc_server/spoolss/spoolssdb.c | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/source4/rpc_server/spoolss/spoolssdb.c b/source4/rpc_server/spoolss/spoolssdb.c new file mode 100644 index 0000000000..f4180af0ef --- /dev/null +++ b/source4/rpc_server/spoolss/spoolssdb.c @@ -0,0 +1,89 @@ +/* + Unix SMB/CIFS implementation. + + interface functions for the spoolss database + + Copyright (C) Andrew Tridgell 2004 + Copyright (C) Tim Potter 2004 + + 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" + +struct spoolssdb_context { + struct ldb_context *ldb; +}; + +/* + this is used to catch debug messages from ldb +*/ +void spoolssdb_debug(void *context, enum ldb_debug_level level, const char *fmt, va_list ap) +{ + char *s = NULL; + if (DEBUGLEVEL < 4 && level > LDB_DEBUG_WARNING) { + return; + } + vasprintf(&s, fmt, ap); + if (!s) return; + DEBUG(level, ("spoolssdb: %s\n", s)); + free(s); +} + +/* + connect to the spoolss database + return an opaque context pointer on success, or NULL on failure + */ +void *spoolssdb_connect(void) +{ + struct spoolssdb_context *ctx; + /* + the way that unix fcntl locking works forces us to have a + static ldb handle here rather than a much more sensible + approach of having the ldb handle as part of the + spoolss_OpenPrinter() pipe state. Otherwise we would try to open + the ldb more than once, and tdb would rightly refuse the + second open due to the broken nature of unix locking. + */ + static struct ldb_context *static_spoolss_db; + + if (static_spoolss_db == NULL) { + static_spoolss_db = ldb_connect(lp_spoolss_url(), 0, NULL); + if (static_spoolss_db == NULL) { + return NULL; + } + } + + ldb_set_debug(static_spoolss_db, spoolssdb_debug, NULL); + + ctx = malloc_p(struct spoolssdb_context); + if (!ctx) { + errno = ENOMEM; + return NULL; + } + + ctx->ldb = static_spoolss_db; + + return ctx; +} + +/* close a connection to the spoolss db */ +void spoolssdb_close(void *ctx) +{ + struct spoolssdb_context *spoolss_ctx = ctx; + /* we don't actually close due to broken posix locking semantics */ + spoolss_ctx->ldb = NULL; + free(spoolss_ctx); +} |