summaryrefslogtreecommitdiff
path: root/source4/lib/samba3/samba3.c
diff options
context:
space:
mode:
Diffstat (limited to 'source4/lib/samba3/samba3.c')
-rw-r--r--source4/lib/samba3/samba3.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/source4/lib/samba3/samba3.c b/source4/lib/samba3/samba3.c
index bfd41d6554..4eda3bd154 100644
--- a/source4/lib/samba3/samba3.c
+++ b/source4/lib/samba3/samba3.c
@@ -20,6 +20,71 @@
#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_share_info *samba3_find_share(struct samba3 *db, TALLOC_CTX* ctx, const char *name)
+{
+ int i;
+ for (i = 0; i < db->share_count; i++) {
+ if (!StrCaseCmp(db->shares[i].name, name))
+ return &db->shares[i];
+ }
+
+ db->shares = talloc_realloc(ctx, db->shares, struct samba3_share_info, db->share_count+1);
+ ZERO_STRUCT(db->shares[i]);
+ db->shares[i].name = talloc_strdup(ctx, name);
+ db->share_count++;
+
+ return &db->shares[i];
+}
+
+static BOOL samba3_sfunc (const char *name, void *_db)
+{
+ struct smbconf_data *privdat = _db;
+
+ privdat->current_share = samba3_find_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_share(db, ctx, "global");
+
+ if (!pm_process( fn, samba3_sfunc, samba3_pfunc, &privdat )) {
+ return NT_STATUS_UNSUCCESSFUL;
+ }
+
+ return NT_STATUS_OK;
+}
+
struct samba3 *samba3_read(const char *libdir, TALLOC_CTX *ctx)
{
struct samba3 *ret;
@@ -55,5 +120,9 @@ struct samba3 *samba3_read(const char *libdir, TALLOC_CTX *ctx)
samba3_read_secrets(dbfile, ctx, &ret->secrets);
SAFE_FREE(dbfile);
+ asprintf(&dbfile, "%s/share_info.tdb", libdir);
+ samba3_read_share_info(dbfile, ctx, ret);
+ SAFE_FREE(dbfile);
+
return ret;
}