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/lib/samba3/samba3.c | 95 +---------------------------------------- source4/lib/samba3/samba3.h | 11 ++--- source4/lib/samba3/share_info.c | 6 ++- source4/lib/util_strlist.c | 21 ++++++++- 4 files changed, 29 insertions(+), 104 deletions(-) (limited to 'source4/lib') diff --git a/source4/lib/samba3/samba3.c b/source4/lib/samba3/samba3.c index 56a7738693..d90d5edbfe 100644 --- a/source4/lib/samba3/samba3.c +++ b/source4/lib/samba3/samba3.c @@ -20,12 +20,6 @@ #include "includes.h" #include "lib/samba3/samba3.h" -struct smbconf_data { - TALLOC_CTX *ctx; - struct samba3 *db; - struct samba3_share_info *current_share; -}; - struct samba3_domainsecrets *samba3_find_domainsecrets(struct samba3 *db, const char *name) { int i; @@ -38,93 +32,6 @@ struct samba3_domainsecrets *samba3_find_domainsecrets(struct samba3 *db, const return NULL; } -struct samba3_share_info *samba3_find_share(struct samba3 *db, const char *name) -{ - int i; - for (i = 0; i < db->share_count; i++) { - if (!strcasecmp_m(db->shares[i].name, name)) - return &db->shares[i]; - } - - return NULL; -} - - -struct samba3_share_info *samba3_find_add_share(struct samba3 *db, TALLOC_CTX* ctx, const char *name) -{ - struct samba3_share_info *share = samba3_find_share(db, name); - - if (share) - return share; - - db->shares = talloc_realloc(ctx, db->shares, struct samba3_share_info, db->share_count+1); - ZERO_STRUCT(db->shares[db->share_count]); - db->shares[db->share_count].name = talloc_strdup(ctx, name); - db->share_count++; - - return &db->shares[db->share_count-1]; -} - -const char *samba3_get_param(struct samba3 *samba3, const char *section, const char *param) -{ - int i; - struct samba3_share_info *share = samba3_find_share(samba3, section); - - if (share == NULL) - return NULL; - - for (i = 0; i < share->parameter_count; i++) { - if (!strcasecmp_m(share->parameters[i].name, param)) - return share->parameters[i].value; - } - - return NULL; -} - - -static BOOL samba3_sfunc (const char *name, void *_db) -{ - struct smbconf_data *privdat = _db; - - privdat->current_share = samba3_find_add_share(privdat->db, privdat->ctx, name); - - return True; -} - -static BOOL samba3_pfunc (const char *name, const char *value, void *_db) -{ - struct smbconf_data *privdat = _db; - struct samba3_parameter *p; - - privdat->current_share->parameters = - talloc_realloc(privdat->ctx, privdat->current_share->parameters, - struct samba3_parameter, - privdat->current_share->parameter_count+1); - - p = &privdat->current_share->parameters[privdat->current_share->parameter_count]; - p->name = talloc_strdup(privdat->ctx, name); - p->value = talloc_strdup(privdat->ctx, value); - - privdat->current_share->parameter_count++; - - return True; -} - -NTSTATUS samba3_read_smbconf(const char *fn, TALLOC_CTX *ctx, struct samba3 *db) -{ - struct smbconf_data privdat; - - privdat.ctx = ctx; - privdat.db = db; - privdat.current_share = samba3_find_add_share(db, ctx, "global"); - - if (!pm_process( fn, samba3_sfunc, samba3_pfunc, &privdat )) { - return NT_STATUS_UNSUCCESSFUL; - } - - return NT_STATUS_OK; -} - NTSTATUS samba3_read(const char *smbconf, const char *libdir, TALLOC_CTX *ctx, struct samba3 **samba3) { struct samba3 *ret; @@ -133,7 +40,7 @@ NTSTATUS samba3_read(const char *smbconf, const char *libdir, TALLOC_CTX *ctx, s ret = talloc_zero(ctx, struct samba3); if (smbconf) - samba3_read_smbconf(smbconf, ctx, ret); + ret->configuration = param_read(ret, smbconf); dbfile = talloc_asprintf(ctx, "%s/account_policy.tdb", libdir); samba3_read_account_policy(dbfile, ctx, &ret->policy); diff --git a/source4/lib/samba3/samba3.h b/source4/lib/samba3/samba3.h index b8a9c68617..f0f4c99513 100644 --- a/source4/lib/samba3/samba3.h +++ b/source4/lib/samba3/samba3.h @@ -23,6 +23,7 @@ #include "librpc/gen_ndr/security.h" #include "librpc/gen_ndr/samr.h" +#include "param/generic.h" struct samba3_samaccount { uint32_t logon_time, @@ -185,21 +186,15 @@ struct samba3_secrets } *afs_keyfiles; }; -struct samba3_parameter { - char *name; - char *value; -}; - struct samba3_share_info { char *name; struct security_descriptor secdesc; - - uint32_t parameter_count; - struct samba3_parameter *parameters; }; struct samba3 { + struct param_context *configuration; + uint32_t winsdb_count; struct samba3_winsdb_entry *winsdb_entries; diff --git a/source4/lib/samba3/share_info.c b/source4/lib/samba3/share_info.c index 3479a7063c..e96adfc175 100644 --- a/source4/lib/samba3/share_info.c +++ b/source4/lib/samba3/share_info.c @@ -66,7 +66,11 @@ NTSTATUS samba3_read_share_info(const char *fn, TALLOC_CTX *ctx, struct samba3 * name = talloc_strndup(ctx, kbuf.dptr+strlen("SECDESC/"), kbuf.dsize-strlen("SECDESC/")); - share = samba3_find_add_share(db, ctx, name); + db->shares = talloc_realloc(db, db->shares, struct samba3_share_info, db->share_count+1); + share = &db->shares[db->share_count]; + db->share_count++; + + share->name = talloc_strdup(db, name); vbuf = tdb_fetch(tdb, kbuf); blob.data = (uint8_t *)vbuf.dptr; diff --git a/source4/lib/util_strlist.c b/source4/lib/util_strlist.c index d5c4d91585..8efa1f92d2 100644 --- a/source4/lib/util_strlist.c +++ b/source4/lib/util_strlist.c @@ -22,7 +22,7 @@ /* build a null terminated list of strings from a input string and a - separator list. The sepatator list must contain characters less than + separator list. The separator list must contain characters less than or equal to 0x2f for this to work correctly on multi-byte strings */ const char **str_list_make(TALLOC_CTX *mem_ctx, const char *string, const char *sep) @@ -70,6 +70,25 @@ const char **str_list_make(TALLOC_CTX *mem_ctx, const char *string, const char * return ret; } +/* join a list back to one string */ +char *str_list_join(TALLOC_CTX *mem_ctx, const char **list, char seperator) +{ + char *ret = NULL; + int i; + + if (list[0] == NULL) + return talloc_strdup(mem_ctx, ""); + + ret = talloc_strdup(mem_ctx, list[0]); + + for (i = 1; list[i]; i++) { + ret = talloc_asprintf_append(ret, "%c%s", seperator, list[i]); + } + + return ret; +} + + /* return the number of elements in a string list */ -- cgit