libsmbconf: add a smbconf init dispatcher smbconf_init().
authorMichael Adam <obnox@samba.org>
Sun, 13 Apr 2008 15:13:16 +0000 (17:13 +0200)
committerMichael Adam <obnox@samba.org>
Sun, 13 Apr 2008 18:04:44 +0000 (20:04 +0200)
The dispatcher takes a config source argument in the form
of "backend:path" where backend can (currently) be one of
"txt" (aka "file") or "reg" (aka "registry").

When the path is omitted, it is up to the backend to provide
a default path.

When there is no separator ":" and the string is not a recognized
backend, then file backend is assumed and the string is passed
in as the path argument.

Michael

source/Makefile.in
source/lib/smbconf/smbconf.h
source/lib/smbconf/smbconf_init.c [new file with mode: 0644]

index dbc0e4690e73f3ebaded1bbef816fc167acb7930..243a3535d84300f52cdf0a1d924819ee5e17c476 100644 (file)
@@ -847,7 +847,8 @@ LIBNETAPI_OBJ  = $(LIBNETAPI_OBJ1) $(LIBNET_OBJ) \
 
 LIBSMBCONF_OBJ = lib/smbconf/smbconf.o lib/smbconf/smbconf_util.o \
                 lib/smbconf/smbconf_reg.o \
-                lib/smbconf/smbconf_txt_simple.o
+                lib/smbconf/smbconf_txt_simple.o \
+                lib/smbconf/smbconf_init.o
 
 SMBCONFTORT_OBJ0 = lib/smbconf/testsuite.o
 
index e48a0cce976174b77803255a2086fa1f586f17e6..481c2b169396aadd4730b09932fd8ebed130c11c 100644 (file)
@@ -29,8 +29,11 @@ struct smbconf_csn {
 
 /*
  * initialization functions for the available modules
- * (a dispatcher might be added in the future)
  */
+
+WERROR smbconf_init(TALLOC_CTX *mem_ctx, struct smbconf_ctx **conf_ctx,
+                   const char *source);
+
 WERROR smbconf_init_reg(TALLOC_CTX *mem_ctx, struct smbconf_ctx **conf_ctx,
                        const char *path);
 
diff --git a/source/lib/smbconf/smbconf_init.c b/source/lib/smbconf/smbconf_init.c
new file mode 100644 (file)
index 0000000..2ad3a08
--- /dev/null
@@ -0,0 +1,95 @@
+/*
+ *  Unix SMB/CIFS implementation.
+ *  libsmbconf - Samba configuration library, init dispatcher
+ *  Copyright (C) Michael Adam 2008
+ *
+ *  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 3 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, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "includes.h"
+#include "smbconf_private.h"
+
+#define INCLUDES_VALNAME "includes"
+
+
+/**
+ * smbconf initialization dispatcher
+ *
+ * this takes a configuration source in the form of
+ * backend:path and calles the appropriate backend
+ * init function with the path argument
+ *
+ * known backends:
+ * -  "registry" or "reg"
+ * -  "txt" or "file"
+ */
+WERROR smbconf_init(TALLOC_CTX *mem_ctx, struct smbconf_ctx **conf_ctx,
+                   const char *source)
+{
+       WERROR werr;
+       char *backend = NULL;
+       char *path = NULL;
+       char *sep;
+       TALLOC_CTX *tmp_ctx = talloc_stackframe();
+
+       if (conf_ctx == NULL) {
+               werr = WERR_INVALID_PARAM;
+               goto done;
+       }
+
+       if ((source == NULL) || (*source == '\0')) {
+               werr = WERR_INVALID_PARAM;
+               goto done;
+       }
+
+       backend = talloc_strdup(tmp_ctx, source);
+       if (backend == NULL) {
+               werr = WERR_NOMEM;
+               goto done;
+       }
+
+       sep = strchr(backend, ':');
+       if (sep != NULL) {
+               *sep = '\0';
+               path = sep + 1;
+               if (strlen(path) == 0) {
+                       path = NULL;
+               }
+       }
+
+       if (strequal(backend, "registry") || strequal(backend, "reg")) {
+               werr = smbconf_init_reg(mem_ctx, conf_ctx, path);
+       } else if (strequal(backend, "file") || strequal(backend, "txt")) {
+               werr = smbconf_init_txt_simple(mem_ctx, conf_ctx, path);
+       } else if (sep == NULL) {
+               /*
+                * If no separator was given in the source, and the string is
+                * not a know backend, assume file backend and use the source
+                * string as a path argument.
+                */
+               werr = smbconf_init_txt_simple(mem_ctx, conf_ctx, backend);
+       } else {
+               /*
+                * Separator was specified but this is not a known backend.
+                * Can't handle this.
+                */
+               DEBUG(1, ("smbconf_init: ERROR - unknown backend '%s' given\n",
+                         backend));
+               werr = WERR_INVALID_PARAM;
+       }
+
+done:
+       TALLOC_FREE(tmp_ctx);
+       return werr;
+}