diff options
-rw-r--r-- | source4/param/loadparm.c | 4 | ||||
-rw-r--r-- | source4/rpc_server/config.mk | 3 | ||||
-rw-r--r-- | source4/rpc_server/spoolss/spoolssdb.c | 89 |
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); +} |