s3:net conf: don't store share names as lower case, but as given.
[ira/wip.git] / source3 / utils / net_conf.c
index ab1b0f3df7632a7c111bda868a66b140f7bca2ff..b65202ee692afeb45ff835e90005a40dffd8b3fb 100644 (file)
@@ -249,7 +249,7 @@ static int net_conf_list(struct net_context *c, struct smbconf_ctx *conf_ctx,
        werr = smbconf_get_config(conf_ctx, mem_ctx, &num_shares, &shares);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "Error getting config: %s\n",
-                         dos_errstr(werr));
+                         win_errstr(werr));
                goto done;
        }
 
@@ -300,7 +300,7 @@ static int net_conf_import(struct net_context *c, struct smbconf_ctx *conf_ctx,
                        net_conf_import_usage(c, argc, argv);
                        goto done;
                case 2:
-                       servicename = talloc_strdup_lower(mem_ctx, argv[1]);
+                       servicename = talloc_strdup(mem_ctx, argv[1]);
                        if (servicename == NULL) {
                                d_printf("error: out of memory!\n");
                                goto done;
@@ -322,7 +322,7 @@ static int net_conf_import(struct net_context *c, struct smbconf_ctx *conf_ctx,
        werr = smbconf_init(mem_ctx, &txt_ctx, conf_source);
        if (!W_ERROR_IS_OK(werr)) {
                d_printf("error loading file '%s': %s\n", filename,
-                        dos_errstr(werr));
+                        win_errstr(werr));
                goto done;
        }
 
@@ -338,11 +338,11 @@ static int net_conf_import(struct net_context *c, struct smbconf_ctx *conf_ctx,
                                         servicename,
                                         &service);
                if (!W_ERROR_IS_OK(werr)) {
-                       goto done;
+                       goto cancel;
                }
                werr = import_process_service(c, conf_ctx, service);
                if (!W_ERROR_IS_OK(werr)) {
-                       goto done;
+                       goto cancel;
                }
        } else {
                struct smbconf_service **services = NULL;
@@ -352,24 +352,72 @@ static int net_conf_import(struct net_context *c, struct smbconf_ctx *conf_ctx,
                                          &num_shares,
                                          &services);
                if (!W_ERROR_IS_OK(werr)) {
-                       goto done;
+                       goto cancel;
                }
                if (!c->opt_testmode) {
                        werr = smbconf_drop(conf_ctx);
                        if (!W_ERROR_IS_OK(werr)) {
-                               goto done;
+                               goto cancel;
                        }
                }
+
+               /*
+                * Wrap the importing of shares into a transaction,
+                * but only 100 at a time, in order to serve memory.
+                * The allocated memory accumulates across the actions
+                * within the transaction, and for me, some 1500
+                * imported shares, the MAX_TALLOC_SIZE of 256 MB
+                * was exceeded.
+                */
+               werr = smbconf_transaction_start(conf_ctx);
+               if (!W_ERROR_IS_OK(werr)) {
+                       d_printf("error starting transaction: %s\n",
+                                win_errstr(werr));
+                       goto done;
+               }
+
                for (sidx = 0; sidx < num_shares; sidx++) {
                        werr = import_process_service(c, conf_ctx,
                                                      services[sidx]);
                        if (!W_ERROR_IS_OK(werr)) {
+                               goto cancel;
+                       }
+
+                       if (sidx % 100) {
+                               continue;
+                       }
+
+                       werr = smbconf_transaction_commit(conf_ctx);
+                       if (!W_ERROR_IS_OK(werr)) {
+                               d_printf("error committing transaction: %s\n",
+                                        win_errstr(werr));
+                               goto done;
+                       }
+                       werr = smbconf_transaction_start(conf_ctx);
+                       if (!W_ERROR_IS_OK(werr)) {
+                               d_printf("error starting transaction: %s\n",
+                                        win_errstr(werr));
                                goto done;
                        }
                }
        }
 
-       ret = 0;
+       werr = smbconf_transaction_commit(conf_ctx);
+       if (!W_ERROR_IS_OK(werr)) {
+               d_printf("error committing transaction: %s\n",
+                        win_errstr(werr));
+       } else {
+               ret = 0;
+       }
+
+       goto done;
+
+cancel:
+       werr = smbconf_transaction_cancel(conf_ctx);
+       if (!W_ERROR_IS_OK(werr)) {
+               d_printf("error cancelling transaction: %s\n",
+                        win_errstr(werr));
+       }
 
 done:
        TALLOC_FREE(mem_ctx);
@@ -425,7 +473,7 @@ static int net_conf_drop(struct net_context *c, struct smbconf_ctx *conf_ctx,
        werr = smbconf_drop(conf_ctx);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "Error deleting configuration: %s\n",
-                         dos_errstr(werr));
+                         win_errstr(werr));
                goto done;
        }
 
@@ -453,7 +501,7 @@ static int net_conf_showshare(struct net_context *c,
                goto done;
        }
 
-       sharename = talloc_strdup_lower(mem_ctx, argv[0]);
+       sharename = talloc_strdup(mem_ctx, argv[0]);
        if (sharename == NULL) {
                d_printf("error: out of memory!\n");
                goto done;
@@ -462,11 +510,11 @@ static int net_conf_showshare(struct net_context *c,
        werr = smbconf_get_share(conf_ctx, mem_ctx, sharename, &service);
        if (!W_ERROR_IS_OK(werr)) {
                d_printf("error getting share parameters: %s\n",
-                        dos_errstr(werr));
+                        win_errstr(werr));
                goto done;
        }
 
-       d_printf("[%s]\n", sharename);
+       d_printf("[%s]\n", service->name);
 
        for (count = 0; count < service->num_params; count++) {
                d_printf("\t%s = %s\n", service->param_names[count],
@@ -552,7 +600,7 @@ static int net_conf_addshare(struct net_context *c,
                        }
                case 2:
                        path = argv[1];
-                       sharename = talloc_strdup_lower(mem_ctx, argv[0]);
+                       sharename = talloc_strdup(mem_ctx, argv[0]);
                        if (sharename == NULL) {
                                d_printf("error: out of memory!\n");
                                goto done;
@@ -576,12 +624,6 @@ static int net_conf_addshare(struct net_context *c,
                goto done;
        }
 
-       if (getpwnam(sharename)) {
-               d_fprintf(stderr, "ERROR: share name %s is already a valid "
-                         "system user name.\n", sharename);
-               goto done;
-       }
-
        if (strequal(sharename, GLOBAL_NAME)) {
                d_fprintf(stderr,
                          "ERROR: 'global' is not a valid share name.\n");
@@ -626,7 +668,7 @@ static int net_conf_addshare(struct net_context *c,
        werr = smbconf_create_share(conf_ctx, sharename);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "Error creating share %s: %s\n",
-                         sharename, dos_errstr(werr));
+                         sharename, win_errstr(werr));
                goto done;
        }
 
@@ -637,7 +679,7 @@ static int net_conf_addshare(struct net_context *c,
        werr = smbconf_set_parameter(conf_ctx, sharename, "path", path);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "Error setting parameter %s: %s\n",
-                         "path", dos_errstr(werr));
+                         "path", win_errstr(werr));
                goto done;
        }
 
@@ -646,7 +688,7 @@ static int net_conf_addshare(struct net_context *c,
                                             comment);
                if (!W_ERROR_IS_OK(werr)) {
                        d_fprintf(stderr, "Error setting parameter %s: %s\n",
-                                 "comment", dos_errstr(werr));
+                                 "comment", win_errstr(werr));
                        goto done;
                }
        }
@@ -654,7 +696,7 @@ static int net_conf_addshare(struct net_context *c,
        werr = smbconf_set_parameter(conf_ctx, sharename, "guest ok", guest_ok);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "Error setting parameter %s: %s\n",
-                         "'guest ok'", dos_errstr(werr));
+                         "'guest ok'", win_errstr(werr));
                goto done;
        }
 
@@ -662,7 +704,7 @@ static int net_conf_addshare(struct net_context *c,
                                     writeable);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "Error setting parameter %s: %s\n",
-                         "writeable", dos_errstr(werr));
+                         "writeable", win_errstr(werr));
                goto done;
        }
 
@@ -686,7 +728,7 @@ static int net_conf_delshare(struct net_context *c,
                net_conf_delshare_usage(c, argc, argv);
                goto done;
        }
-       sharename = talloc_strdup_lower(mem_ctx, argv[0]);
+       sharename = talloc_strdup(mem_ctx, argv[0]);
        if (sharename == NULL) {
                d_printf("error: out of memory!\n");
                goto done;
@@ -695,7 +737,7 @@ static int net_conf_delshare(struct net_context *c,
        werr = smbconf_delete_share(conf_ctx, sharename);
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "Error deleting share %s: %s\n",
-                         sharename, dos_errstr(werr));
+                         sharename, win_errstr(werr));
                goto done;
        }
 
@@ -719,7 +761,7 @@ static int net_conf_setparm(struct net_context *c, struct smbconf_ctx *conf_ctx,
                net_conf_setparm_usage(c, argc, argv);
                goto done;
        }
-       service = talloc_strdup_lower(mem_ctx, argv[0]);
+       service = talloc_strdup(mem_ctx, argv[0]);
        if (service == NULL) {
                d_printf("error: out of memory!\n");
                goto done;
@@ -735,7 +777,7 @@ static int net_conf_setparm(struct net_context *c, struct smbconf_ctx *conf_ctx,
                werr = smbconf_create_share(conf_ctx, service);
                if (!W_ERROR_IS_OK(werr)) {
                        d_fprintf(stderr, "Error creating share '%s': %s\n",
-                                 service, dos_errstr(werr));
+                                 service, win_errstr(werr));
                        goto done;
                }
        }
@@ -744,7 +786,7 @@ static int net_conf_setparm(struct net_context *c, struct smbconf_ctx *conf_ctx,
 
        if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "Error setting value '%s': %s\n",
-                         param, dos_errstr(werr));
+                         param, win_errstr(werr));
                goto done;
        }
 
@@ -771,7 +813,7 @@ static int net_conf_getparm(struct net_context *c, struct smbconf_ctx *conf_ctx,
                net_conf_getparm_usage(c, argc, argv);
                goto done;
        }
-       service = talloc_strdup_lower(mem_ctx, argv[0]);
+       service = talloc_strdup(mem_ctx, argv[0]);
        if (service == NULL) {
                d_printf("error: out of memory!\n");
                goto done;
@@ -796,7 +838,7 @@ static int net_conf_getparm(struct net_context *c, struct smbconf_ctx *conf_ctx,
                goto done;
        } else if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "Error getting value '%s': %s.\n",
-                         param, dos_errstr(werr));
+                         param, win_errstr(werr));
                goto done;
        }
 
@@ -821,7 +863,7 @@ static int net_conf_delparm(struct net_context *c, struct smbconf_ctx *conf_ctx,
                net_conf_delparm_usage(c, argc, argv);
                goto done;
        }
-       service = talloc_strdup_lower(mem_ctx, argv[0]);
+       service = talloc_strdup(mem_ctx, argv[0]);
        if (service == NULL) {
                d_printf("error: out of memory!\n");
                goto done;
@@ -846,7 +888,7 @@ static int net_conf_delparm(struct net_context *c, struct smbconf_ctx *conf_ctx,
                goto done;
        } else if (!W_ERROR_IS_OK(werr)) {
                d_fprintf(stderr, "Error deleting value '%s': %s.\n",
-                         param, dos_errstr(werr));
+                         param, win_errstr(werr));
                goto done;
        }
 
@@ -874,7 +916,7 @@ static int net_conf_getincludes(struct net_context *c,
                goto done;
        }
 
-       service = talloc_strdup_lower(mem_ctx, argv[0]);
+       service = talloc_strdup(mem_ctx, argv[0]);
        if (service == NULL) {
                d_printf("error: out of memory!\n");
                goto done;
@@ -883,7 +925,7 @@ static int net_conf_getincludes(struct net_context *c,
        werr = smbconf_get_includes(conf_ctx, mem_ctx, service,
                                    &num_includes, &includes);
        if (!W_ERROR_IS_OK(werr)) {
-               d_printf("error getting includes: %s\n", dos_errstr(werr));
+               d_printf("error getting includes: %s\n", win_errstr(werr));
                goto done;
        }
 
@@ -914,7 +956,7 @@ static int net_conf_setincludes(struct net_context *c,
                goto done;
        }
 
-       service = talloc_strdup_lower(mem_ctx, argv[0]);
+       service = talloc_strdup(mem_ctx, argv[0]);
        if (service == NULL) {
                d_printf("error: out of memory!\n");
                goto done;
@@ -929,7 +971,7 @@ static int net_conf_setincludes(struct net_context *c,
 
        werr = smbconf_set_includes(conf_ctx, service, num_includes, includes);
        if (!W_ERROR_IS_OK(werr)) {
-               d_printf("error setting includes: %s\n", dos_errstr(werr));
+               d_printf("error setting includes: %s\n", win_errstr(werr));
                goto done;
        }
 
@@ -954,7 +996,7 @@ static int net_conf_delincludes(struct net_context *c,
                goto done;
        }
 
-       service = talloc_strdup_lower(mem_ctx, argv[0]);
+       service = talloc_strdup(mem_ctx, argv[0]);
        if (service == NULL) {
                d_printf("error: out of memory!\n");
                goto done;
@@ -962,7 +1004,7 @@ static int net_conf_delincludes(struct net_context *c,
 
        werr = smbconf_delete_includes(conf_ctx, service);
        if (!W_ERROR_IS_OK(werr)) {
-               d_printf("error deleting includes: %s\n", dos_errstr(werr));
+               d_printf("error deleting includes: %s\n", win_errstr(werr));
                goto done;
        }