[PATCH] libsmbconf: add smbconf_create_set_share

Michael Adam obnox at samba.org
Tue May 21 09:52:37 MDT 2013


Hi David,

On 2013-05-16 at 14:42 +0300, Alexander Bokovoy wrote:
> On Thu, May 16, 2013 at 12:55 PM, David Disseldorp <ddiss at samba.org> wrote:
> 
> > 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);

Attached find a patchset that bases on your patch and
changes the code according to our discussion at sambaXP:

- moves the implementation from the reg backend to the
  central smbconf.c file
- wraps the action in a transaction
- removes the smbconf_ops function for create_set_share again

If you are happy with the changes, we could squash them
together with your initial patch and submit this under
your copyright and

Pair-Programmed-With: /me 
and signed-off-by /me

additional patches:

- improve some doxygen for the transaction calls.
- change "net conf import" to use the new smbconf_create_set_share()

The patches are also in my master-libsmbclient branch:
https://gitweb.samba.org/?p=obnox/samba/samba-obnox.git;a=shortlog;h=refs/heads/master-libsmbconf

> Looks OK but I thought to ask for proper ABI handling for libsmbconf since
> it is public library. Should we actually increment its ABI version (it has
> none right now) with this change?

Not certain if we want to publish it.
What would be the advantages/disadvantages?
If yes, the above branch contains a version bump patch.
Is that all that is needed?

Cheers - Michael


-------------- next part --------------
From 8ab008ea53edf1f3e8a23f4304c8091a0417f8e5 Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Mon, 20 May 2013 23:30:14 +0200
Subject: [PATCH 1/8] libsmbconf: fix documentation of transaction calls.

Signed-off-by: Michael Adam <obnox at samba.org>
---
 lib/smbconf/smbconf.h |    9 +++++++--
 1 file changed, 7 insertions(+), 2 deletions(-)

diff --git a/lib/smbconf/smbconf.h b/lib/smbconf/smbconf.h
index 7f62b06..fcb1388 100644
--- a/lib/smbconf/smbconf.h
+++ b/lib/smbconf/smbconf.h
@@ -447,7 +447,8 @@ sbcErr smbconf_delete_global_includes(struct smbconf_ctx *ctx);
 /**
  * @brief Start a transaction on the configuration backend.
  *
- * This is to speed up writes to the registry based backend.
+ * Transactions are exposed in order to make it possible
+ * to create atomic compound writing commands.
  *
  * @param[in] ctx       The smbconf context to start the transaction.
  *
@@ -459,7 +460,8 @@ sbcErr smbconf_transaction_start(struct smbconf_ctx *ctx);
 /**
  * @brief Commit a transaction on the configuration backend.
  *
- * This is to speed up writes to the registry based backend.
+ * Transactions are exposed in order to make it possible
+ * to create atomic compound writing commands.
  *
  * @param[in] ctx       The smbconf context to commit the transaction.
  *
@@ -473,6 +475,9 @@ sbcErr smbconf_transaction_commit(struct smbconf_ctx *ctx);
 /**
  * @brief Cancel a transaction on the configuration backend.
  *
+ * Transactions are exposed in order to make it possible
+ * to create atomic compound writing commands.
+ *
  * @param[in] ctx       The smbconf context to cancel the transaction.
  *
  * @return              SBC_ERR_OK on success, a corresponding sbcErr if an
-- 
1.7.9.5


From d7c43ff7a8c89be3ae85e4c151c0f0e514c11c06 Mon Sep 17 00:00:00 2001
From: David Disseldorp <ddiss at samba.org>
Date: Thu, 16 May 2013 11:55:04 +0200
Subject: [PATCH 2/8] libsmbconf: add smbconf_create_set_share

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 fcb1388..53661dd 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.7.9.5


From d015ef6a4392db4b627412fec969884ad8041b23 Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Tue, 21 May 2013 14:25:27 +0200
Subject: [PATCH 3/8] TODO: libsmbconf: remove "servicename" parameter from
 create_set_share()

This is redundant since it is in the service struct.

Signed-off-by: Michael Adam <obnox at samba.org>
---
 lib/smbconf/smbconf.c             |    6 +++---
 lib/smbconf/smbconf.h             |    3 ---
 lib/smbconf/smbconf_private.h     |    1 -
 lib/smbconf/smbconf_txt.c         |    1 -
 source3/lib/smbconf/smbconf_reg.c |    3 +--
 5 files changed, 4 insertions(+), 10 deletions(-)

diff --git a/lib/smbconf/smbconf.c b/lib/smbconf/smbconf.c
index 37048a4..ae43532 100644
--- a/lib/smbconf/smbconf.c
+++ b/lib/smbconf/smbconf.c
@@ -234,14 +234,14 @@ 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)) {
+	if ((service->name != NULL) && smbconf_share_exists(ctx, service->name))
+	{
 		return SBC_ERR_FILE_EXISTS;
 	}
 
-	return ctx->ops->create_set_share(ctx, servicename, service);
+	return ctx->ops->create_set_share(ctx, service);
 }
 
 /**
diff --git a/lib/smbconf/smbconf.h b/lib/smbconf/smbconf.h
index 53661dd..69a55db 100644
--- a/lib/smbconf/smbconf.h
+++ b/lib/smbconf/smbconf.h
@@ -209,15 +209,12 @@ sbcErr smbconf_create_share(struct smbconf_ctx *ctx, const char *servicename);
  *
  * @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);
 
 /**
diff --git a/lib/smbconf/smbconf_private.h b/lib/smbconf/smbconf_private.h
index 0205ce9..49e97bc 100644
--- a/lib/smbconf/smbconf_private.h
+++ b/lib/smbconf/smbconf_private.h
@@ -43,7 +43,6 @@ struct smbconf_ops {
 	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,
diff --git a/lib/smbconf/smbconf_txt.c b/lib/smbconf/smbconf_txt.c
index 4432346..265290b 100644
--- a/lib/smbconf/smbconf_txt.c
+++ b/lib/smbconf/smbconf_txt.c
@@ -395,7 +395,6 @@ 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;
diff --git a/source3/lib/smbconf/smbconf_reg.c b/source3/lib/smbconf/smbconf_reg.c
index 1853f0e..70a147e 100644
--- a/source3/lib/smbconf/smbconf_reg.c
+++ b/source3/lib/smbconf/smbconf_reg.c
@@ -898,7 +898,6 @@ 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;
@@ -907,7 +906,7 @@ static sbcErr smbconf_reg_create_set_share(struct smbconf_ctx *ctx,
 	TALLOC_CTX *tmp_ctx = talloc_stackframe();
 
 	err = smbconf_reg_create_service_key(tmp_ctx, ctx,
-					     servicename, &key);
+					     service->name, &key);
 	if (!SBC_ERROR_IS_OK(err)) {
 		goto done;
 	}
-- 
1.7.9.5


From 68afb3f13049da8a9ea1aa89ccee22c12d19b0e4 Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Tue, 21 May 2013 14:26:12 +0200
Subject: [PATCH 4/8] TODO: libsmbconf: implementation
 smbconf_create_set_share() inside smbconf.c

This is a higher level compound task that need not be in the backends.
This implementation is wrapped in a transaction and uses smbconf api functions
create_share() and set_parameter() to do the work.

Signed-off-by: Michael Adam <obnox at samba.org>
---
 lib/smbconf/smbconf.c |   39 ++++++++++++++++++++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

diff --git a/lib/smbconf/smbconf.c b/lib/smbconf/smbconf.c
index ae43532..c9399c3 100644
--- a/lib/smbconf/smbconf.c
+++ b/lib/smbconf/smbconf.c
@@ -236,12 +236,49 @@ sbcErr smbconf_create_share(struct smbconf_ctx *ctx,
 sbcErr smbconf_create_set_share(struct smbconf_ctx *ctx,
 				struct smbconf_service *service)
 {
+	sbcErr err, err2;
+	int i;
+
 	if ((service->name != NULL) && smbconf_share_exists(ctx, service->name))
 	{
 		return SBC_ERR_FILE_EXISTS;
 	}
 
-	return ctx->ops->create_set_share(ctx, service);
+	err = smbconf_transaction_start(ctx);
+	if (!SBC_ERROR_IS_OK(err)) {
+		return err;
+	}
+
+	err = smbconf_create_share(ctx, service->name);
+	if (!SBC_ERROR_IS_OK(err)) {
+		goto cancel;
+	}
+
+	for (i = 0; i < service->num_params; i++) {
+		err = smbconf_set_parameter(ctx,
+					    service->name,
+					    service->param_names[i],
+					    service->param_values[i]);
+		if (!SBC_ERROR_IS_OK(err)) {
+			goto cancel;
+		}
+	}
+
+	err = smbconf_transaction_commit(ctx);
+	if (!SBC_ERROR_IS_OK(err)) {
+		return err;
+	}
+
+	return SBC_ERR_OK;
+
+cancel:
+	err2 = smbconf_transaction_cancel(ctx);
+	if (!SBC_ERROR_IS_OK(err2)) {
+		DEBUG(5, (__location__ ": Error cancelling transaction: %s\n",
+			  sbcErrorString(err2)));
+	}
+
+	return err;
 }
 
 /**
-- 
1.7.9.5


From d943e0778628845c3cd6fc74fbd01689c34431b0 Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Tue, 21 May 2013 14:29:46 +0200
Subject: [PATCH 5/8] TODO: libsmbconf: remove create_set_share from the ops
 (and remove implementations)

This is now implemented in the smbconf.c code.

Signed-off-by: Michael Adam <obnox at samba.org>
---
 lib/smbconf/smbconf_private.h     |    2 --
 lib/smbconf/smbconf_txt.c         |   10 ----------
 source3/lib/smbconf/smbconf_reg.c |   31 -------------------------------
 3 files changed, 43 deletions(-)

diff --git a/lib/smbconf/smbconf_private.h b/lib/smbconf/smbconf_private.h
index 49e97bc..e768c30 100644
--- a/lib/smbconf/smbconf_private.h
+++ b/lib/smbconf/smbconf_private.h
@@ -42,8 +42,6 @@ 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,
-				   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 265290b..5c4bd27 100644
--- a/lib/smbconf/smbconf_txt.c
+++ b/lib/smbconf/smbconf_txt.c
@@ -392,15 +392,6 @@ 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,
-					   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,
@@ -644,7 +635,6 @@ 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 70a147e..ec6b93f 100644
--- a/source3/lib/smbconf/smbconf_reg.c
+++ b/source3/lib/smbconf/smbconf_reg.c
@@ -895,36 +895,6 @@ 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,
-					   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,
-					     service->name, &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,
@@ -1245,7 +1215,6 @@ 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.7.9.5


From de00e9b41848e6b6513c5008500f3024539cdeef Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Tue, 21 May 2013 16:49:58 +0200
Subject: [PATCH 6/8] TODO: libsmbconf: add treatment of includes to
 smbconf_create_set_share()

Signed-off-by: Michael Adam <obnox at samba.org>
---
 lib/smbconf/smbconf.c |   44 +++++++++++++++++++++++++++++++++++---------
 1 file changed, 35 insertions(+), 9 deletions(-)

diff --git a/lib/smbconf/smbconf.c b/lib/smbconf/smbconf.c
index c9399c3..27d36ca 100644
--- a/lib/smbconf/smbconf.c
+++ b/lib/smbconf/smbconf.c
@@ -238,6 +238,9 @@ sbcErr smbconf_create_set_share(struct smbconf_ctx *ctx,
 {
 	sbcErr err, err2;
 	int i;
+	uint32_t num_includes = 0;
+	char **includes = NULL;
+	TALLOC_CTX *tmp_ctx = NULL;
 
 	if ((service->name != NULL) && smbconf_share_exists(ctx, service->name))
 	{
@@ -249,27 +252,48 @@ sbcErr smbconf_create_set_share(struct smbconf_ctx *ctx,
 		return err;
 	}
 
+	tmp_ctx = talloc_stackframe();
+
 	err = smbconf_create_share(ctx, service->name);
 	if (!SBC_ERROR_IS_OK(err)) {
 		goto cancel;
 	}
 
 	for (i = 0; i < service->num_params; i++) {
-		err = smbconf_set_parameter(ctx,
-					    service->name,
-					    service->param_names[i],
-					    service->param_values[i]);
-		if (!SBC_ERROR_IS_OK(err)) {
-			goto cancel;
+		if (strequal(service->param_names[i], "include")) {
+			includes = talloc_realloc(tmp_ctx, includes, char *,
+						  num_includes+1);
+			if (includes == NULL) {
+				err = SBC_ERR_NOMEM;
+				goto cancel;
+			}
+			includes[num_includes] = talloc_strdup(includes,
+						service->param_values[i]);
+			if (includes[num_includes] == NULL) {
+				err = SBC_ERR_NOMEM;
+				goto cancel;
+			}
+			num_includes++;
+		} else {
+			err = smbconf_set_parameter(ctx,
+						    service->name,
+						    service->param_names[i],
+						    service->param_values[i]);
+			if (!SBC_ERROR_IS_OK(err)) {
+				goto cancel;
+			}
 		}
 	}
 
-	err = smbconf_transaction_commit(ctx);
+	err = smbconf_set_includes(ctx, service->name, num_includes,
+				   (const char **)includes);
 	if (!SBC_ERROR_IS_OK(err)) {
-		return err;
+		goto cancel;
 	}
 
-	return SBC_ERR_OK;
+	err = smbconf_transaction_commit(ctx);
+
+	goto done;
 
 cancel:
 	err2 = smbconf_transaction_cancel(ctx);
@@ -278,6 +302,8 @@ cancel:
 			  sbcErrorString(err2)));
 	}
 
+done:
+	talloc_free(tmp_ctx);
 	return err;
 }
 
-- 
1.7.9.5


From faf259d8b7dd05722c9ed3d0354d2f7da6875f43 Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Tue, 21 May 2013 16:50:49 +0200
Subject: [PATCH 7/8] net: use smbconf_create_set_share() in "net conf import"

Signed-off-by: Michael Adam <obnox at samba.org>
---
 source3/utils/net_conf.c |   49 ++--------------------------------------------
 1 file changed, 2 insertions(+), 47 deletions(-)

diff --git a/source3/utils/net_conf.c b/source3/utils/net_conf.c
index 60588c0..e43cd12 100644
--- a/source3/utils/net_conf.c
+++ b/source3/utils/net_conf.c
@@ -179,13 +179,10 @@ static sbcErr import_process_service(struct net_context *c,
 				     struct smbconf_ctx *conf_ctx,
 				     struct smbconf_service *service)
 {
-	uint32_t idx;
 	sbcErr err = SBC_ERR_OK;
-	uint32_t num_includes = 0;
-	char **includes = NULL;
-	TALLOC_CTX *mem_ctx = talloc_stackframe();
 
 	if (c->opt_testmode) {
+		uint32_t idx;
 		const char *indent = "";
 		if (service->name != NULL) {
 			d_printf("[%s]\n", service->name);
@@ -206,52 +203,10 @@ static sbcErr import_process_service(struct net_context *c,
 			goto done;
 		}
 	}
-	err = smbconf_create_share(conf_ctx, service->name);
-	if (!SBC_ERROR_IS_OK(err)) {
-		goto done;
-	}
 
-	for (idx = 0; idx < service->num_params; idx ++) {
-		if (strequal(service->param_names[idx], "include")) {
-			includes = talloc_realloc(mem_ctx,
-							includes,
-							char *,
-							num_includes+1);
-			if (includes == NULL) {
-				err = SBC_ERR_NOMEM;
-				goto done;
-			}
-			includes[num_includes] = talloc_strdup(includes,
-						service->param_values[idx]);
-			if (includes[num_includes] == NULL) {
-				err = SBC_ERR_NOMEM;
-				goto done;
-			}
-			num_includes++;
-		} else {
-			err = smbconf_set_parameter(conf_ctx,
-						     service->name,
-						     service->param_names[idx],
-						     service->param_values[idx]);
-			if (!SBC_ERROR_IS_OK(err)) {
-				d_fprintf(stderr,
-					  _("Error in section [%s], parameter \"%s\": %s\n"),
-					  service->name, service->param_names[idx],
-					  sbcErrorString(err));
-				goto done;
-			}
-		}
-	}
+	err = smbconf_create_set_share(conf_ctx, service);
 
-	err = smbconf_set_includes(conf_ctx, service->name, num_includes,
-				   (const char **)includes);
-	if (!SBC_ERROR_IS_OK(err)) {
-		goto done;
-	}
-
-	err = SBC_ERR_OK;
 done:
-	TALLOC_FREE(mem_ctx);
 	return err;
 }
 
-- 
1.7.9.5


From 8f1b54ba489197744ad8eb400d6a5100657bedbe Mon Sep 17 00:00:00 2001
From: Michael Adam <obnox at samba.org>
Date: Tue, 21 May 2013 17:12:24 +0200
Subject: [PATCH 8/8] libsmbconf: bump version number of the smbconf library
 to 1

Signed-off-by: Michael Adam <obnox at samba.org>
---
 source3/wscript_build |    2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/source3/wscript_build b/source3/wscript_build
index 0a85653..00ceeb3 100755
--- a/source3/wscript_build
+++ b/source3/wscript_build
@@ -943,7 +943,7 @@ bld.SAMBA3_LIBRARY('smbconf',
                    util_reg''',
                    public_headers='../lib/smbconf/smbconf.h',
                    pc_files=[],
-                   vnum='0')
+                   vnum='1')
 
 bld.SAMBA3_LIBRARY('smbd_conn',
                    source='smbd/conn.c',
-- 
1.7.9.5

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 206 bytes
Desc: Digital signature
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20130521/b8c1689b/attachment.pgp>


More information about the samba-technical mailing list