Author: idra
Date: 2006-07-23 18:47:56 +0000 (Sun, 23 Jul 2006)
New Revision: 17207

WebSVN: 
http://websvn.samba.org/cgi-bin/viewcvs.cgi?view=rev&root=samba&rev=17207

Log:

Add the ldb based shares configuration module


Added:
   branches/SAMBA_4_0/source/param/share_ldb.c
Modified:
   branches/SAMBA_4_0/source/param/config.mk


Changeset:
Modified: branches/SAMBA_4_0/source/param/config.mk
===================================================================
--- branches/SAMBA_4_0/source/param/config.mk   2006-07-23 18:43:07 UTC (rev 
17206)
+++ branches/SAMBA_4_0/source/param/config.mk   2006-07-23 18:47:56 UTC (rev 
17207)
@@ -33,3 +33,13 @@
 # End MODULE share_classic
 ################################################
 
+################################################
+# Start MODULE share_ldb
+[MODULE::share_ldb]
+SUBSYSTEM = share
+INIT_FUNCTION = share_ldb_init
+OBJ_FILES = share_ldb.o 
+PUBLIC_DEPENDENCIES = ldb
+# End MODULE share_ldb
+################################################
+

Added: branches/SAMBA_4_0/source/param/share_ldb.c
===================================================================
--- branches/SAMBA_4_0/source/param/share_ldb.c 2006-07-23 18:43:07 UTC (rev 
17206)
+++ branches/SAMBA_4_0/source/param/share_ldb.c 2006-07-23 18:47:56 UTC (rev 
17207)
@@ -0,0 +1,281 @@
+/* 
+   Unix SMB/CIFS implementation.
+   
+   LDB based services configuration
+   
+   Copyright (C) Simo Sorce    2006
+   
+   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 "ldb/include/ldb.h"
+#include "ldb/include/ldb_errors.h"
+#include "auth/auth.h"
+#include "db_wrap.h"
+#include "param/share.h"
+
+static NTSTATUS sldb_init(TALLOC_CTX *mem_ctx, const struct share_ops *ops, 
struct share_context **ctx)
+{
+       struct ldb_context *sdb;
+
+       *ctx = talloc(mem_ctx, struct share_context);
+       if (!*ctx) {
+               DEBUG(0, ("ERROR: Out of memory!\n"));
+               return NT_STATUS_NO_MEMORY;
+       }
+       
+       sdb = ldb_wrap_connect( *ctx,
+                               private_path(*ctx, "share.ldb"),
+                               system_session(*ctx),
+                               NULL, 0, NULL);
+
+       if (!sdb) {
+               talloc_free(*ctx);
+               return NT_STATUS_UNSUCCESSFUL;
+       }
+
+       (*ctx)->ops = ops;
+       (*ctx)->priv_data = (void *)sdb;
+
+       return NT_STATUS_OK;
+}
+
+static const char *sldb_string_option(struct share_config *scfg, const char 
*opt_name, const char *defval)
+{
+       struct ldb_message *msg;
+       struct ldb_message_element *el;
+
+       if (scfg == NULL) return defval;
+
+       msg = talloc_get_type(scfg->opaque, struct ldb_message);
+
+       if (strchr(opt_name, ':')) {
+               char *name, *p;
+
+               name = talloc_strdup(scfg, opt_name);
+               if (!name) {
+                       return NULL;
+               }
+               p = strchr(name, ':');
+               *p = '-';
+
+               el = ldb_msg_find_element(msg, name);
+       } else {
+               el = ldb_msg_find_element(msg, opt_name);
+       }
+
+       if (el == NULL) {
+               return defval;
+       }
+
+       return (const char *)(el->values[0].data);
+}
+
+static int sldb_int_option(struct share_config *scfg, const char *opt_name, 
int defval)
+{
+       const char *val;
+       int ret;
+
+               val = sldb_string_option(scfg, opt_name, NULL);
+       if (val == NULL) return defval;
+
+       errno = 0;
+       ret = (int)strtol(val, NULL, 10);
+       if (errno) return -1;
+
+       return ret;
+}
+
+static BOOL sldb_bool_option(struct share_config *scfg, const char *opt_name, 
BOOL defval)
+{
+       const char *val;
+
+               val = sldb_string_option(scfg, opt_name, NULL);
+       if (val == NULL) return defval;
+
+       if (strcasecmp(val, "true") == 0) return True;
+
+       return False;
+}
+
+static const char **sldb_string_list_option(TALLOC_CTX *mem_ctx, struct 
share_config *scfg, const char *opt_name)
+{
+       struct ldb_message *msg;
+       struct ldb_message_element *el;
+       const char **list;
+       int i;
+
+       if (scfg == NULL) return NULL;
+
+       msg = talloc_get_type(scfg->opaque, struct ldb_message);
+
+       if (strchr(opt_name, ':')) {
+               char *name, *p;
+
+               name = talloc_strdup(scfg, opt_name);
+               if (!name) {
+                       return NULL;
+               }
+               p = strchr(name, ':');
+               *p = '-';
+
+               el = ldb_msg_find_element(msg, name);
+       } else {
+               el = ldb_msg_find_element(msg, opt_name);
+       }
+
+       if (el == NULL) {
+               return NULL;
+       }
+
+       list = talloc_array(mem_ctx, const char *, el->num_values + 1);
+       if (!list) return NULL;
+
+       for (i = 0; i < el->num_values; i++) {
+               list[i] = (const char *)(el->values[i].data);
+       }
+       list[i] = NULL;
+
+       return list;
+}
+
+static NTSTATUS sldb_list_all(TALLOC_CTX *mem_ctx,
+                                struct share_context *ctx,
+                                int *count,
+                                const char ***names)
+{
+       int ret, i, j;
+       const char **n;
+       struct ldb_context *ldb;
+       struct ldb_result *res;
+       TALLOC_CTX *tmp_ctx;
+
+       tmp_ctx = talloc_new(mem_ctx);
+       if (!tmp_ctx) {
+               DEBUG(0,("ERROR: Out of memory!\n"));
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       ldb = talloc_get_type(ctx->priv_data, struct ldb_context);
+
+       ret = ldb_search(ldb, ldb_dn_explode(tmp_ctx, "CN=SHARES"), 
LDB_SCOPE_SUBTREE, "(name=*)", NULL, &res);
+       if (ret != LDB_SUCCESS) {
+               talloc_free(tmp_ctx);
+               return NT_STATUS_UNSUCCESSFUL;
+       }
+       talloc_steal(tmp_ctx, res);
+
+       n = talloc_array(mem_ctx, const char *, res->count);
+       if (!n) {
+               DEBUG(0,("ERROR: Out of memory!\n"));
+               talloc_free(tmp_ctx);
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       for (i = 0, j = 0; i < res->count; i++) {
+               n[j] = talloc_strdup(n, ldb_msg_find_string(res->msgs[i], 
"name", NULL));
+               if (!n[j]) {
+                       DEBUG(0,("WARNING: Malformed share object in share 
database\n!"));
+                       continue;
+               }
+               j++;
+       }
+
+       *names = n;
+       *count = j;
+       talloc_free(tmp_ctx);
+
+       return NT_STATUS_OK;
+}
+
+static NTSTATUS sldb_get_config(TALLOC_CTX *mem_ctx,
+                        struct share_context *ctx,
+                        const char *name,
+                        struct share_config **scfg)
+{
+       int ret;
+       struct share_config *s;
+       struct ldb_context *ldb;
+       struct ldb_result *res;
+       TALLOC_CTX *tmp_ctx;
+       char *filter;
+
+       tmp_ctx = talloc_new(mem_ctx);
+       if (!tmp_ctx) {
+               DEBUG(0,("ERROR: Out of memory!\n"));
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       ldb = talloc_get_type(ctx->priv_data, struct ldb_context);
+
+       filter = talloc_asprintf(tmp_ctx,"(name=%s)", name);
+       if (!filter) {
+               DEBUG(0,("ERROR: Out of memory!\n"));
+               talloc_free(tmp_ctx);
+               return NT_STATUS_NO_MEMORY;
+       }
+       ret = ldb_search(ldb, ldb_dn_explode(tmp_ctx, "CN=SHARES"), 
LDB_SCOPE_SUBTREE, filter, NULL, &res);
+       if (ret != LDB_SUCCESS || res->count != 1) {
+               talloc_free(tmp_ctx);
+               return NT_STATUS_OBJECT_NAME_NOT_FOUND;
+       }
+       talloc_steal(tmp_ctx, res);
+
+       s = talloc(tmp_ctx, struct share_config);
+       if (!s) {
+               DEBUG(0,("ERROR: Out of memory!\n"));
+               talloc_free(tmp_ctx);
+               return NT_STATUS_NO_MEMORY;
+       }
+
+       s->name = talloc_strdup(s, ldb_msg_find_string(res->msgs[0], "name", 
NULL));
+       if (!s->name) {
+               DEBUG(0,("ERROR: Invalid share object!\n"));
+               talloc_free(tmp_ctx);
+               return NT_STATUS_UNSUCCESSFUL;
+       }
+
+       s->opaque = talloc_steal(s, res->msgs[0]);
+       if (!s->opaque) {
+               DEBUG(0,("ERROR: Invalid share object!\n"));
+               talloc_free(tmp_ctx);
+               return NT_STATUS_UNSUCCESSFUL;
+       }
+
+       s->ctx = ctx;
+
+       *scfg = talloc_steal(mem_ctx, s);
+
+       talloc_free(tmp_ctx);
+       return NT_STATUS_OK;
+}
+
+NTSTATUS share_ldb_init(void *mem_ctx)
+{
+       struct share_ops ops;
+
+       ops.name = "ldb";
+       ops.init = sldb_init;
+       ops.string_option = sldb_string_option;
+       ops.int_option = sldb_int_option;
+       ops.bool_option = sldb_bool_option;
+       ops.string_list_option = sldb_string_list_option;
+       ops.list_all = sldb_list_all;
+       ops.get_config = sldb_get_config;
+
+       return share_register(&ops);
+}
+

Reply via email to