From cc613a60eb0f6b92cae98e8669e5e569a1eb9324 Mon Sep 17 00:00:00 2001 From: Michael Adam Date: Sun, 13 Apr 2008 17:13:16 +0200 Subject: [PATCH] libsmbconf: add a smbconf init dispatcher smbconf_init(). 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 | 3 +- source/lib/smbconf/smbconf.h | 5 ++- source/lib/smbconf/smbconf_init.c | 95 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 101 insertions(+), 2 deletions(-) create mode 100644 source/lib/smbconf/smbconf_init.c diff --git a/source/Makefile.in b/source/Makefile.in index dbc0e4690e7..243a3535d84 100644 --- a/source/Makefile.in +++ b/source/Makefile.in @@ -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 diff --git a/source/lib/smbconf/smbconf.h b/source/lib/smbconf/smbconf.h index e48a0cce976..481c2b16939 100644 --- a/source/lib/smbconf/smbconf.h +++ b/source/lib/smbconf/smbconf.h @@ -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 index 00000000000..2ad3a0807fa --- /dev/null +++ b/source/lib/smbconf/smbconf_init.c @@ -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 . + */ + +#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; +} -- 2.11.4.GIT