diff options
Diffstat (limited to 'source3')
-rw-r--r-- | source3/Makefile.in | 3 | ||||
-rw-r--r-- | source3/lib/smbconf/smbconf.h | 5 | ||||
-rw-r--r-- | source3/lib/smbconf/smbconf_init.c | 95 |
3 files changed, 101 insertions, 2 deletions
diff --git a/source3/Makefile.in b/source3/Makefile.in index dbc0e4690e..243a3535d8 100644 --- a/source3/Makefile.in +++ b/source3/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/source3/lib/smbconf/smbconf.h b/source3/lib/smbconf/smbconf.h index e48a0cce97..481c2b1693 100644 --- a/source3/lib/smbconf/smbconf.h +++ b/source3/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/source3/lib/smbconf/smbconf_init.c b/source3/lib/smbconf/smbconf_init.c new file mode 100644 index 0000000000..2ad3a0807f --- /dev/null +++ b/source3/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 <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; +} |