/** * 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 int net_conf_setparm(struct net_context *c, struct smbconf_ctx *conf_ctx, int argc, const char **argv) { int ret = -1; sbcErr err; char *service = NULL; char *param = NULL; const char *value_str = NULL; TALLOC_CTX *mem_ctx = talloc_stackframe(); if (argc != 3 || c->display_usage) { net_conf_setparm_usage(c, argc, argv); goto done; } /* * NULL service name means "dangling parameters" to libsmbconf. * We use the empty string from the command line for this purpose. */ if (strlen(argv[0]) != 0) { service = talloc_strdup(mem_ctx, argv[0]); if (service == NULL) { d_printf(_("error: out of memory!\n")); goto done; } } param = strlower_talloc(mem_ctx, argv[1]); if (param == NULL) { d_printf(_("error: out of memory!\n")); goto done; } value_str = argv[2]; if (!net_conf_param_valid(service,param, value_str)) { goto done; } err = smbconf_transaction_start(conf_ctx); if (!SBC_ERROR_IS_OK(err)) { d_printf(_("error starting transaction: %s\n"), sbcErrorString(err)); goto done; } if (!smbconf_share_exists(conf_ctx, service)) { err = smbconf_create_share(conf_ctx, service); if (!SBC_ERROR_IS_OK(err)) { d_fprintf(stderr, _("Error creating share '%s': %s\n"), service, sbcErrorString(err)); goto cancel; } } err = smbconf_set_parameter(conf_ctx, service, param, value_str); if (!SBC_ERROR_IS_OK(err)) { d_fprintf(stderr, _("Error setting value '%s': %s\n"), param, sbcErrorString(err)); goto cancel; } err = smbconf_transaction_commit(conf_ctx); if (!SBC_ERROR_IS_OK(err)) { d_printf(_("error committing transaction: %s\n"), sbcErrorString(err)); } else { ret = 0; } goto done; cancel: err = smbconf_transaction_cancel(conf_ctx); if (!SBC_ERROR_IS_OK(err)) { d_printf(_("error cancelling transaction: %s\n"), sbcErrorString(err)); } done: TALLOC_FREE(mem_ctx); return ret; }
/** * Add a share, with a couple of standard parameters, partly optional. * * This is a high level utility function of the net conf utility, * not a direct frontend to the smbconf API. */ static int net_conf_addshare(struct net_context *c, struct smbconf_ctx *conf_ctx, int argc, const char **argv) { int ret = -1; sbcErr err; char *sharename = NULL; const char *path = NULL; const char *comment = NULL; const char *guest_ok = "no"; const char *writeable = "no"; TALLOC_CTX *mem_ctx = talloc_stackframe(); if (c->display_usage) { net_conf_addshare_usage(c, argc, argv); ret = 0; goto done; } switch (argc) { case 0: case 1: default: net_conf_addshare_usage(c, argc, argv); goto done; case 5: comment = argv[4]; FALL_THROUGH; case 4: if (!strnequal(argv[3], "guest_ok=", 9)) { net_conf_addshare_usage(c, argc, argv); goto done; } switch (argv[3][9]) { case 'y': case 'Y': guest_ok = "yes"; break; case 'n': case 'N': guest_ok = "no"; break; default: net_conf_addshare_usage(c, argc, argv); goto done; } FALL_THROUGH; case 3: if (!strnequal(argv[2], "writeable=", 10)) { net_conf_addshare_usage(c, argc, argv); goto done; } switch (argv[2][10]) { case 'y': case 'Y': writeable = "yes"; break; case 'n': case 'N': writeable = "no"; break; default: net_conf_addshare_usage(c, argc, argv); goto done; } FALL_THROUGH; case 2: path = argv[1]; sharename = talloc_strdup(mem_ctx, argv[0]); if (sharename == NULL) { d_printf(_("error: out of memory!\n")); goto done; } break; } /* * validate arguments */ /* validate share name */ if (!validate_net_name(sharename, INVALID_SHARENAME_CHARS, strlen(sharename))) { d_fprintf(stderr, _("ERROR: share name %s contains " "invalid characters (any of %s)\n"), sharename, INVALID_SHARENAME_CHARS); goto done; } if (strequal(sharename, GLOBAL_NAME)) { d_fprintf(stderr, _("ERROR: 'global' is not a valid share name.\n")); goto done; } if (smbconf_share_exists(conf_ctx, sharename)) { d_fprintf(stderr, _("ERROR: share %s already exists.\n"), sharename); goto done; } /* validate path */ if (path[0] != '/') { d_fprintf(stderr, _("Error: path '%s' is not an absolute path.\n"), path); goto done; } /* * start a transaction */ err = smbconf_transaction_start(conf_ctx); if (!SBC_ERROR_IS_OK(err)) { d_printf("error starting transaction: %s\n", sbcErrorString(err)); goto done; } /* * create the share */ err = smbconf_create_share(conf_ctx, sharename); if (!SBC_ERROR_IS_OK(err)) { d_fprintf(stderr, _("Error creating share %s: %s\n"), sharename, sbcErrorString(err)); goto cancel; } /* * fill the share with parameters */ err = smbconf_set_parameter(conf_ctx, sharename, "path", path); if (!SBC_ERROR_IS_OK(err)) { d_fprintf(stderr, _("Error setting parameter %s: %s\n"), "path", sbcErrorString(err)); goto cancel; } if (comment != NULL) { err = smbconf_set_parameter(conf_ctx, sharename, "comment", comment); if (!SBC_ERROR_IS_OK(err)) { d_fprintf(stderr, _("Error setting parameter %s: %s\n"), "comment", sbcErrorString(err)); goto cancel; } } err = smbconf_set_parameter(conf_ctx, sharename, "guest ok", guest_ok); if (!SBC_ERROR_IS_OK(err)) { d_fprintf(stderr, _("Error setting parameter %s: %s\n"), "'guest ok'", sbcErrorString(err)); goto cancel; } err = smbconf_set_parameter(conf_ctx, sharename, "writeable", writeable); if (!SBC_ERROR_IS_OK(err)) { d_fprintf(stderr, _("Error setting parameter %s: %s\n"), "writeable", sbcErrorString(err)); goto cancel; } /* * commit the whole thing */ err = smbconf_transaction_commit(conf_ctx); if (!SBC_ERROR_IS_OK(err)) { d_printf("error committing transaction: %s\n", sbcErrorString(err)); } else { ret = 0; } goto done; cancel: err = smbconf_transaction_cancel(conf_ctx); if (!SBC_ERROR_IS_OK(err)) { d_printf("error cancelling transaction: %s\n", sbcErrorString(err)); } done: TALLOC_FREE(mem_ctx); return ret; }