[PATCH] libsmbconf: add smbconf_create_set_share

David Disseldorp ddiss at samba.org
Thu May 16 03:55:04 MDT 2013


This call creates a new share definition, using the parameters provided
with a smbconf_service structure.
Such an interface allows for simple cloning of services with:
smbconf_get_share(conf_ctx, mem_ctx, base_sharename, &base_service_def);
base_service_def->name = clone_sharename;
smbconf_create_set_share(conf_ctx, clone_sharename, base_service_def);

Signed-off-by: David Disseldorp <ddiss at samba.org>
---
 lib/smbconf/smbconf.c             | 14 ++++++++++++++
 lib/smbconf/smbconf.h             | 16 ++++++++++++++++
 lib/smbconf/smbconf_private.h     |  3 +++
 lib/smbconf/smbconf_txt.c         | 11 +++++++++++
 source3/lib/smbconf/smbconf_reg.c | 32 ++++++++++++++++++++++++++++++++
 5 files changed, 76 insertions(+)

diff --git a/lib/smbconf/smbconf.c b/lib/smbconf/smbconf.c
index e0441ed..37048a4 100644
--- a/lib/smbconf/smbconf.c
+++ b/lib/smbconf/smbconf.c
@@ -231,6 +231,20 @@ sbcErr smbconf_create_share(struct smbconf_ctx *ctx,
 }
 
 /**
+ * create and set the definition for a new share (service).
+ */
+sbcErr smbconf_create_set_share(struct smbconf_ctx *ctx,
+				const char *servicename,
+				struct smbconf_service *service)
+{
+	if ((servicename != NULL) && smbconf_share_exists(ctx, servicename)) {
+		return SBC_ERR_FILE_EXISTS;
+	}
+
+	return ctx->ops->create_set_share(ctx, servicename, service);
+}
+
+/**
  * get a definition of a share (service) from configuration.
  */
 sbcErr smbconf_get_share(struct smbconf_ctx *ctx,
diff --git a/lib/smbconf/smbconf.h b/lib/smbconf/smbconf.h
index 7f62b06..4fc2ae3 100644
--- a/lib/smbconf/smbconf.h
+++ b/lib/smbconf/smbconf.h
@@ -205,6 +205,22 @@ bool smbconf_share_exists(struct smbconf_ctx *ctx, const char *servicename);
 sbcErr smbconf_create_share(struct smbconf_ctx *ctx, const char *servicename);
 
 /**
+ * @brief create and set the definition for a new service.
+ *
+ * @param[in] ctx       The smbconf context to use.
+ *
+ * @param[in] servicename The name of the service to add.
+ *
+ * @param[in] service   The definition for the added service.
+ *
+ * @return              SBC_ERR_OK on success, a corresponding sbcErr if an
+ *                      error occured.
+ */
+sbcErr smbconf_create_set_share(struct smbconf_ctx *ctx,
+				const char *servicename,
+				struct smbconf_service *service);
+
+/**
  * @brief Get a definition of a share (service) from configuration.
  *
  * @param[in] ctx       The smbconf context to use.
diff --git a/lib/smbconf/smbconf_private.h b/lib/smbconf/smbconf_private.h
index e768c30..0205ce9 100644
--- a/lib/smbconf/smbconf_private.h
+++ b/lib/smbconf/smbconf_private.h
@@ -42,6 +42,9 @@ struct smbconf_ops {
 				  char ***share_names);
 	bool (*share_exists)(struct smbconf_ctx *ctx, const char *service);
 	sbcErr (*create_share)(struct smbconf_ctx *ctx, const char *service);
+	sbcErr (*create_set_share)(struct smbconf_ctx *ctx,
+				   const char *servicename,
+				   struct smbconf_service *service);
 	sbcErr (*get_share)(struct smbconf_ctx *ctx,
 			    TALLOC_CTX *mem_ctx,
 			    const char *servicename,
diff --git a/lib/smbconf/smbconf_txt.c b/lib/smbconf/smbconf_txt.c
index 5c4bd27..4432346 100644
--- a/lib/smbconf/smbconf_txt.c
+++ b/lib/smbconf/smbconf_txt.c
@@ -392,6 +392,16 @@ static sbcErr smbconf_txt_create_share(struct smbconf_ctx *ctx,
 }
 
 /**
+ * create and set the definition for a new share (service).
+ */
+static sbcErr smbconf_txt_create_set_share(struct smbconf_ctx *ctx,
+					   const char *servicename,
+					   struct smbconf_service *service)
+{
+	return SBC_ERR_NOT_SUPPORTED;
+}
+
+/**
  * get a definition of a share (service) from configuration.
  */
 static sbcErr smbconf_txt_get_share(struct smbconf_ctx *ctx,
@@ -635,6 +645,7 @@ static struct smbconf_ops smbconf_ops_txt = {
 	.get_share_names	= smbconf_txt_get_share_names,
 	.share_exists		= smbconf_txt_share_exists,
 	.create_share		= smbconf_txt_create_share,
+	.create_set_share	= smbconf_txt_create_set_share,
 	.get_share		= smbconf_txt_get_share,
 	.delete_share		= smbconf_txt_delete_share,
 	.set_parameter		= smbconf_txt_set_parameter,
diff --git a/source3/lib/smbconf/smbconf_reg.c b/source3/lib/smbconf/smbconf_reg.c
index ec6b93f..1853f0e 100644
--- a/source3/lib/smbconf/smbconf_reg.c
+++ b/source3/lib/smbconf/smbconf_reg.c
@@ -895,6 +895,37 @@ static sbcErr smbconf_reg_create_share(struct smbconf_ctx *ctx,
 }
 
 /**
+ * create and set the definition for a new share (service).
+ */
+static sbcErr smbconf_reg_create_set_share(struct smbconf_ctx *ctx,
+					   const char *servicename,
+					   struct smbconf_service *service)
+{
+	sbcErr err;
+	struct registry_key *key = NULL;
+	int i;
+	TALLOC_CTX *tmp_ctx = talloc_stackframe();
+
+	err = smbconf_reg_create_service_key(tmp_ctx, ctx,
+					     servicename, &key);
+	if (!SBC_ERROR_IS_OK(err)) {
+		goto done;
+	}
+
+	for (i = 0; i < service->num_params; i++) {
+		err = smbconf_reg_set_value(key, service->param_names[i],
+					    service->param_values[i]);
+		if (!SBC_ERROR_IS_OK(err)) {
+			goto done;
+		}
+	}
+
+done:
+	talloc_free(tmp_ctx);
+	return err;
+}
+
+/**
  * get a definition of a share (service) from configuration.
  */
 static sbcErr smbconf_reg_get_share(struct smbconf_ctx *ctx,
@@ -1215,6 +1246,7 @@ struct smbconf_ops smbconf_ops_reg = {
 	.get_share_names	= smbconf_reg_get_share_names,
 	.share_exists		= smbconf_reg_share_exists,
 	.create_share		= smbconf_reg_create_share,
+	.create_set_share	= smbconf_reg_create_set_share,
 	.get_share		= smbconf_reg_get_share,
 	.delete_share		= smbconf_reg_delete_share,
 	.set_parameter		= smbconf_reg_set_parameter,
-- 
1.8.1.4



More information about the samba-technical mailing list