libsmbconf: add smbconf_create_set_share
authorDavid Disseldorp <ddiss@samba.org>
Thu, 16 May 2013 09:55:04 +0000 (11:55 +0200)
committerMichael Adam <obnox@samba.org>
Tue, 28 May 2013 16:12:26 +0000 (18:12 +0200)
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, base_service_def);

Pair-Programmed-With: Michael Adam <obnox@samba.org>

Signed-off-by: David Disseldorp <ddiss@samba.org>
Signed-off-by: Michael Adam <obnox@samba.org>
lib/smbconf/smbconf.c
lib/smbconf/smbconf.h

index e0441ed9857f1d09bf4ca69a95b416d8ce5535a2..27d36cac0e543ae13830033118bcab703e6d2b53 100644 (file)
@@ -230,6 +230,83 @@ sbcErr smbconf_create_share(struct smbconf_ctx *ctx,
        return ctx->ops->create_share(ctx, servicename);
 }
 
+/**
+ * create and set the definition for a new share (service).
+ */
+sbcErr smbconf_create_set_share(struct smbconf_ctx *ctx,
+                               struct smbconf_service *service)
+{
+       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))
+       {
+               return SBC_ERR_FILE_EXISTS;
+       }
+
+       err = smbconf_transaction_start(ctx);
+       if (!SBC_ERROR_IS_OK(err)) {
+               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++) {
+               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_set_includes(ctx, service->name, num_includes,
+                                  (const char **)includes);
+       if (!SBC_ERROR_IS_OK(err)) {
+               goto cancel;
+       }
+
+       err = smbconf_transaction_commit(ctx);
+
+       goto done;
+
+cancel:
+       err2 = smbconf_transaction_cancel(ctx);
+       if (!SBC_ERROR_IS_OK(err2)) {
+               DEBUG(5, (__location__ ": Error cancelling transaction: %s\n",
+                         sbcErrorString(err2)));
+       }
+
+done:
+       talloc_free(tmp_ctx);
+       return err;
+}
+
 /**
  * get a definition of a share (service) from configuration.
  */
index fcb13882a946ca5f90962a3f09a6313d601b1424..69a55dbf2e238c722be076f8ca2f73e6fb192050 100644 (file)
@@ -204,6 +204,19 @@ 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] 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,
+                               struct smbconf_service *service);
+
 /**
  * @brief Get a definition of a share (service) from configuration.
  *