r1210: A skeleton spoolssdb, based on samdb.
authorTim Potter <tpot@samba.org>
Mon, 21 Jun 2004 06:55:01 +0000 (06:55 +0000)
committerGerald (Jerry) Carter <jerry@samba.org>
Wed, 10 Oct 2007 17:56:45 +0000 (12:56 -0500)
source/param/loadparm.c
source/rpc_server/config.mk
source/rpc_server/spoolss/spoolssdb.c [new file with mode: 0644]

index 2e1da1ac31256abf3d3f05edc8e69ec7f3ac3646..0245d18c4574e5c36a7f2e530068f6d0f7e1ef92 100644 (file)
@@ -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)
index eb83e251148d2efb32c3e1d15a56b7c48c3dd983..beef89f23fa33ca0644596cab4ed8954b04bc441 100644 (file)
@@ -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/source/rpc_server/spoolss/spoolssdb.c b/source/rpc_server/spoolss/spoolssdb.c
new file mode 100644 (file)
index 0000000..f4180af
--- /dev/null
@@ -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);
+}