From a3a7881d39d0c294d0cd2ce13203478fb889b07c Mon Sep 17 00:00:00 2001 From: Jelmer Vernooij Date: Tue, 30 Aug 2005 13:58:48 +0000 Subject: r9798: Add generic functions for handling smb.conf files (the parameters don't to be pre-declared). Also doesn't use any globals, so multiple files can be loaded at once. Currently uses the prefix "param" for all functions and structures; suggestions for better ones are welcome... Remove old smb.conf-parsing code from libsamba3. (This used to be commit 414e5f7f6dc38a8fde3b61d524a664f56f9ea592) --- source4/param/generic.c | 231 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 231 insertions(+) create mode 100644 source4/param/generic.c (limited to 'source4/param/generic.c') diff --git a/source4/param/generic.c b/source4/param/generic.c new file mode 100644 index 0000000000..0129f82eeb --- /dev/null +++ b/source4/param/generic.c @@ -0,0 +1,231 @@ +/* + * Unix SMB/CIFS implementation. + * Copyright (C) Jelmer Vernooij 2005 + * + * 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" +#include "dlinklist.h" +#include "param/generic.h" + +struct param_section *param_get_section(struct param_context *ctx, const char *name) +{ + struct param_section *sect; + + if (name == NULL) + name = GLOBAL_NAME; + + for (sect = ctx->sections; sect; sect = sect->next) { + if (!strcasecmp_m(sect->name, name)) + return sect; + } + + return NULL; +} + +struct param *param_section_get (struct param_section *section, const char *name) +{ + struct param *p; + + for (p = section->parameters; p; p = p->next) { + if (strcasecmp(p->name, name) == 0) + return p; + } + + return NULL; +} + +struct param *param_get (struct param_context *ctx, const char *section_name, const char *name) +{ + struct param_section *section = param_get_section(ctx, section_name); + if (section == NULL) + return NULL; + + return param_section_get(section, name); +} + +/* Look up parameter. If it is not found, add it */ +static struct param *param_get_add(struct param_context *ctx, const char *section_name, const char *name) +{ + struct param_section *section; + struct param *p; + + section = param_get_section(ctx, section_name); + + if (section == NULL) { + section = talloc_zero(ctx, struct param_section); + section->name = talloc_strdup(section, section_name); + DLIST_ADD(ctx->sections, section); + } + + p = param_section_get(section, name); + if (p == NULL) { + p = talloc_zero(section, struct param); + p->name = talloc_strdup(p, name); + DLIST_ADD(section->parameters, p); + } + + return p; +} + +const char *param_get_string(struct param_context *ctx, const char *section, const char *param) +{ + struct param *p = param_get(ctx, section, param); + + if (p == NULL) + return NULL; + + return p->value; +} + +void param_set_string(struct param_context *ctx, const char *section, const char *param, const char *value) +{ + struct param *p = param_get_add(ctx, section, param); + + p->value = talloc_strdup(p, value); +} + +const char **param_get_string_list(struct param_context *ctx, const char *section, const char *param, + const char *separator) +{ + struct param *p = param_get(ctx, section, param); + + if (p == NULL) + return NULL; + + if (p->list_value == NULL) { + p->list_value = str_list_make(ctx, p->value, separator); + } + + return p->list_value; +} + +void param_set_string_list(struct param_context *ctx, const char *section, const char *param, const char **list) +{ + struct param *p = param_get_add(ctx, section, param); + + p->value = str_list_join(p, list, ' '); + p->list_value = str_list_copy(p, list); +} + +int param_get_int(struct param_context *ctx, const char *section, const char *param, int default_v) +{ + const char *value = param_get_string(ctx, section, param); + + if (value) + return strtol(value, NULL, 0); + + return default_v; +} + +void param_set_int(struct param_context *ctx, const char *section, const char *param, int value) +{ + struct param *p = param_get_add(ctx, section, param); + + p->value = talloc_asprintf(p, "%d", value); +} + +unsigned long param_get_ulong(struct param_context *ctx, const char *section, const char *param, unsigned long default_v) +{ + const char *value = param_get_string(ctx, section, param); + + if (value) + return strtoul(value, NULL, 0); + + return default_v; +} + +void param_set_ulong(struct param_context *ctx, const char *section, const char *name, unsigned long value) +{ + struct param *p = param_get_add(ctx, section, name); + + p->value = talloc_asprintf(p, "%lu", value); +} + +static BOOL param_sfunc (const char *name, void *_ctx) +{ + struct param_context *ctx = _ctx; + struct param_section *section = param_get_section(ctx, name); + + if (section == NULL) { + section = talloc_zero(ctx, struct param_section); + section->name = talloc_strdup(section, name); + + DLIST_ADD(ctx->sections, section); + } + + DLIST_PROMOTE(ctx->sections, section); + + return True; +} + + + +static BOOL param_pfunc (const char *name, const char *value, void *_ctx) +{ + struct param_context *ctx = _ctx; + struct param *p = param_section_get(ctx->sections, name); + + if (!p) { + p = talloc_zero(ctx->sections, struct param); + p->name = talloc_strdup(p, name); + p->value = talloc_strdup(p, value); + DLIST_ADD(ctx->sections->parameters, p); + } else { /* Replace current value */ + talloc_free(p->value); + p->value = talloc_strdup(p, value); + } + + return True; +} + +struct param_context *param_read(TALLOC_CTX *mem_ctx, const char *fn) +{ + struct param_context *ctx = talloc_zero(mem_ctx, struct param_context); + + ctx->sections = talloc_zero(ctx, struct param_section); + ctx->sections->name = talloc_strdup(ctx->sections, "global"); + + if (!pm_process( fn, param_sfunc, param_pfunc, ctx)) { + talloc_free(ctx); + return NULL; + } + + return ctx; +} + +int param_write(FILE *file, struct param_context *ctx) +{ + struct param_section *section; + + if (file == NULL) + return -1; + + if (ctx == NULL) + return -1; + + for (section = ctx->sections; section; section = section->next) { + struct param *param; + + fprintf(file, "[%s]\n", section->name); + for (param = section->parameters; param; param = param->next) { + fprintf(file, "\t%s = %s\n", param->name, param->value); + } + fprintf(file, "\n"); + } + + return 0; +} -- cgit