summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source4/param/loadparm.c4
-rw-r--r--source4/rpc_server/config.mk3
-rw-r--r--source4/rpc_server/spoolss/spoolssdb.c89
3 files changed, 95 insertions, 1 deletions
diff --git a/source4/param/loadparm.c b/source4/param/loadparm.c
index 2e1da1ac31..0245d18c45 100644
--- a/source4/param/loadparm.c
+++ b/source4/param/loadparm.c
@@ -107,6 +107,7 @@ typedef struct
char *szConfigFile;
char *szSMBPasswdFile;
char *szSAM_URL;
+ char *szSPOOLSS_URL;
char *szPrivateDir;
char **szPassdbBackend;
char **szPreloadModules;
@@ -581,6 +582,7 @@ static struct parm_struct parm_table[] = {
{"password server", P_STRING, P_GLOBAL, &Globals.szPasswordServer, NULL, NULL, FLAG_ADVANCED | FLAG_WIZARD | FLAG_DEVELOPER},
{"smb passwd file", P_STRING, P_GLOBAL, &Globals.szSMBPasswdFile, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"sam database", P_STRING, P_GLOBAL, &Globals.szSAM_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
+ {"spoolss database", P_STRING, P_GLOBAL, &Globals.szSPOOLSS_URL, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"private dir", P_STRING, P_GLOBAL, &Globals.szPrivateDir, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"passdb backend", P_LIST, P_GLOBAL, &Globals.szPassdbBackend, NULL, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
{"non unix account range", P_STRING, P_GLOBAL, &Globals.szNonUnixAccountRange, handle_non_unix_account_range, NULL, FLAG_ADVANCED | FLAG_DEVELOPER},
@@ -960,6 +962,7 @@ static void init_globals(void)
string_set(&Globals.szSMBPasswdFile, dyn_SMB_PASSWD_FILE);
string_set(&Globals.szPrivateDir, dyn_PRIVATE_DIR);
asprintf(&Globals.szSAM_URL, "tdb://%s/sam.ldb", dyn_PRIVATE_DIR);
+ asprintf(&Globals.szSPOOLSS_URL, "tdb://%s/spoolss.ldb", dyn_PRIVATE_DIR);
string_set(&Globals.szGuestaccount, GUEST_ACCOUNT);
@@ -1205,6 +1208,7 @@ FN_GLOBAL_STRING(lp_logfile, &Globals.szLogFile)
FN_GLOBAL_STRING(lp_configfile, &Globals.szConfigFile)
FN_GLOBAL_STRING(lp_smb_passwd_file, &Globals.szSMBPasswdFile)
FN_GLOBAL_STRING(lp_sam_url, &Globals.szSAM_URL)
+FN_GLOBAL_STRING(lp_spoolss_url, &Globals.szSPOOLSS_URL)
FN_GLOBAL_STRING(lp_private_dir, &Globals.szPrivateDir)
FN_GLOBAL_STRING(lp_serverstring, &Globals.szServerString)
FN_GLOBAL_STRING(lp_printcapname, &Globals.szPrintcapname)
diff --git a/source4/rpc_server/config.mk b/source4/rpc_server/config.mk
index eb83e25114..beef89f23f 100644
--- a/source4/rpc_server/config.mk
+++ b/source4/rpc_server/config.mk
@@ -119,7 +119,8 @@ REQUIRED_SUBSYSTEMS = \
# Start MODULE dcerpc_spoolss
[MODULE::dcerpc_spoolss]
INIT_OBJ_FILES = \
- rpc_server/spoolss/dcesrv_spoolss.o
+ rpc_server/spoolss/dcesrv_spoolss.o \
+ rpc_server/spoolss/spoolssdb.o
REQUIRED_SUBSYSTEMS = \
SAMDB \
DCERPC_COMMON
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);
+}