static int net_conf_delshare(struct net_context *c, struct smbconf_ctx *conf_ctx, int argc, const char **argv) { int ret = -1; const char *sharename = NULL; sbcErr err; TALLOC_CTX *mem_ctx = talloc_stackframe(); if (argc != 1 || c->display_usage) { net_conf_delshare_usage(c, argc, argv); goto done; } sharename = talloc_strdup(mem_ctx, argv[0]); if (sharename == NULL) { d_printf(_("error: out of memory!\n")); goto done; } err = smbconf_delete_share(conf_ctx, sharename); if (!SBC_ERROR_IS_OK(err)) { d_fprintf(stderr, _("Error deleting share %s: %s\n"), sharename, sbcErrorString(err)); goto done; } ret = 0; done: TALLOC_FREE(mem_ctx); return ret; }
/** * This functions process a service previously loaded with libsmbconf. */ static sbcErr import_process_service(struct net_context *c, struct smbconf_ctx *conf_ctx, struct smbconf_service *service) { sbcErr err = SBC_ERR_OK; if (c->opt_testmode) { uint32_t idx; const char *indent = ""; if (service->name != NULL) { d_printf("[%s]\n", service->name); indent = "\t"; } for (idx = 0; idx < service->num_params; idx++) { d_printf("%s%s = %s\n", indent, service->param_names[idx], service->param_values[idx]); } d_printf("\n"); goto done; } if (smbconf_share_exists(conf_ctx, service->name)) { err = smbconf_delete_share(conf_ctx, service->name); if (!SBC_ERROR_IS_OK(err)) { goto done; } } err = smbconf_create_set_share(conf_ctx, service); done: return err; }
/** * This functions process a service previously loaded with libsmbconf. */ static WERROR import_process_service(struct net_context *c, struct smbconf_ctx *conf_ctx, struct smbconf_service *service) { uint32_t idx; WERROR werr = WERR_OK; uint32_t num_includes = 0; char **includes = NULL; TALLOC_CTX *mem_ctx = talloc_stackframe(); if (c->opt_testmode) { const char *indent = ""; if (service->name != NULL) { d_printf("[%s]\n", service->name); indent = "\t"; } for (idx = 0; idx < service->num_params; idx++) { d_printf("%s%s = %s\n", indent, service->param_names[idx], service->param_values[idx]); } d_printf("\n"); goto done; } if (smbconf_share_exists(conf_ctx, service->name)) { werr = smbconf_delete_share(conf_ctx, service->name); if (!W_ERROR_IS_OK(werr)) { goto done; } } werr = smbconf_create_share(conf_ctx, service->name); if (!W_ERROR_IS_OK(werr)) { goto done; } for (idx = 0; idx < service->num_params; idx ++) { if (strequal(service->param_names[idx], "include")) { includes = TALLOC_REALLOC_ARRAY(mem_ctx, includes, char *, num_includes+1); if (includes == NULL) { werr = WERR_NOMEM; goto done; } includes[num_includes] = talloc_strdup(includes, service->param_values[idx]); if (includes[num_includes] == NULL) { werr = WERR_NOMEM; goto done; } num_includes++; } else {
static NTSTATUS sc_smap_unexpose(struct messaging_context *msg_ctx, struct fss_sc_smap *sc_smap, bool delete_all) { NTSTATUS ret; struct smbconf_ctx *conf_ctx; sbcErr cerr; bool is_modified = false; TALLOC_CTX *tmp_ctx = talloc_new(sc_smap); if (tmp_ctx == NULL) { return NT_STATUS_NO_MEMORY; } cerr = smbconf_init(tmp_ctx, &conf_ctx, "registry"); if (!SBC_ERROR_IS_OK(cerr)) { DEBUG(0, ("failed registry smbconf init: %s\n", sbcErrorString(cerr))); ret = NT_STATUS_UNSUCCESSFUL; goto err_tmp; } /* registry IO must be done as root */ become_root(); cerr = smbconf_transaction_start(conf_ctx); if (!SBC_ERROR_IS_OK(cerr)) { DEBUG(0, ("error starting transaction: %s\n", sbcErrorString(cerr))); ret = NT_STATUS_UNSUCCESSFUL; goto err_conf; } while (sc_smap) { struct fss_sc_smap *sc_map_next = sc_smap->next; if (!smbconf_share_exists(conf_ctx, sc_smap->sc_share_name)) { DEBUG(2, ("no such share: %s\n", sc_smap->sc_share_name)); if (!delete_all) { ret = NT_STATUS_OK; goto err_cancel; } sc_smap = sc_map_next; continue; } cerr = smbconf_delete_share(conf_ctx, sc_smap->sc_share_name); if (!SBC_ERROR_IS_OK(cerr)) { DEBUG(0, ("error deleting share: %s\n", sbcErrorString(cerr))); ret = NT_STATUS_UNSUCCESSFUL; goto err_cancel; } is_modified = true; sc_smap->is_exposed = false; if (delete_all) { sc_smap = sc_map_next; } else { sc_smap = NULL; /* only process single sc_map entry */ } } if (is_modified) { cerr = smbconf_transaction_commit(conf_ctx); if (!SBC_ERROR_IS_OK(cerr)) { DEBUG(0, ("error committing transaction: %s\n", sbcErrorString(cerr))); ret = NT_STATUS_UNSUCCESSFUL; goto err_cancel; } message_send_all(msg_ctx, MSG_SMB_CONF_UPDATED, NULL, 0, NULL); } else { ret = NT_STATUS_OK; goto err_cancel; } ret = NT_STATUS_OK; err_conf: talloc_free(conf_ctx); unbecome_root(); err_tmp: talloc_free(tmp_ctx); return ret; err_cancel: smbconf_transaction_cancel(conf_ctx); talloc_free(conf_ctx); unbecome_root(); talloc_free(tmp_ctx); return ret; }