summaryrefslogtreecommitdiff
path: root/source4/rpc_server/spoolss
diff options
context:
space:
mode:
Diffstat (limited to 'source4/rpc_server/spoolss')
-rw-r--r--source4/rpc_server/spoolss/spoolssdb.c89
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);
+}