Rev 5318: add real writing to registry to import function. in http://samba.sernet.de/ma/bzr/SAMBA_3_0-registry.bzr/

Michael Adam ma at sernet.de
Mon Apr 2 10:48:24 GMT 2007


At http://samba.sernet.de/ma/bzr/SAMBA_3_0-registry.bzr/

------------------------------------------------------------
revno: 5318
revision-id: ma at sernet.de-20070402104821-fc7ac70680bb29af
parent: ma at sernet.de-20070402083145-d095b407428365f6
committer: Michael Adam <ma at sernet.de>
branch nick: SAMBA_3_0-registry.bzr
timestamp: Mon 2007-04-02 12:48:21 +0200
message:
  add real writing to registry to import function.
  output is preserved and made available though
  new "--test|-T" switch to the net command.
modified:
  source/utils/net.c             net.c-20060530022628-046c7d5fbf0eceac
  source/utils/net.h             net.h-20060530022628-645259ee28ff73bf
  source/utils/net_conf.c        net_conf.c-20070228210606-uywdn1acd043wgvt-1
=== modified file 'source/utils/net.c'
--- a/source/utils/net.c	2007-03-14 23:18:34 +0000
+++ b/source/utils/net.c	2007-04-02 10:48:21 +0000
@@ -85,6 +85,7 @@
 int opt_timestamps = 0;
 const char *opt_exclude = NULL;
 const char *opt_destination = NULL;
+BOOL opt_testmode = False;
 
 BOOL opt_have_ip = False;
 struct in_addr opt_dest_ip;
@@ -913,6 +914,7 @@
 		{"machine-pass",'P', POPT_ARG_NONE,   &opt_machine_pass},
 		{"myworkgroup", 'W', POPT_ARG_STRING, &opt_workgroup},
 		{"verbose",	'v', POPT_ARG_NONE,   &opt_verbose},
+		{"test",	'T', POPT_ARG_NONE,   &opt_testmode},
 		/* Options for 'net groupmap set' */
 		{"local",       'L', POPT_ARG_NONE,   &opt_localgroup},
 		{"domain",      'D', POPT_ARG_NONE,   &opt_domaingroup},

=== modified file 'source/utils/net.h'
--- a/source/utils/net.h	2006-09-28 21:20:31 +0000
+++ b/source/utils/net.h	2007-04-02 10:48:21 +0000
@@ -114,6 +114,7 @@
 extern int opt_timestamps;
 extern const char *opt_exclude;
 extern const char *opt_destination;
+extern BOOL opt_testmode;
 
 extern BOOL opt_have_ip;
 extern struct in_addr opt_dest_ip;

=== modified file 'source/utils/net_conf.c'
--- a/source/utils/net_conf.c	2007-04-02 08:31:45 +0000
+++ b/source/utils/net_conf.c	2007-04-02 10:48:21 +0000
@@ -52,8 +52,8 @@
 
 static int net_conf_import_usage(int argc, const char**argv)
 {
-	d_printf("USAGE: net conf import [-t] <filename> [<servicename>]\n"
-		 "\t-t             testmode - do not act, just print "
+	d_printf("USAGE: net conf import [--test|-T] <filename> [<servicename>]\n"
+		 "\t[--test|-T]    testmode - do not act, just print "
 		                   "what would be done\n"
 		 "\t<servicename>  only import service <servicename>, "
 		                   "ignore the rest\n");
@@ -285,16 +285,43 @@
 }
 
 static int import_process_service(TALLOC_CTX *ctx, 
-				  struct share_params *share, 
-				  BOOL testmode) 
+				  struct share_params *share)
 {
 	int ret = -1;
 	struct parm_struct *parm;
 	int pnum = 0;
-
-	d_printf("TEST: snum    %i : [%s]\n", share->service,
-		 (share->service == GLOBAL_SECTION_SNUM)?
-		 GLOBAL_NAME : lp_servicename(share->service));
+	const char *servicename;
+	struct registry_key *key;
+	WERROR werr;
+	const char *valtype = NULL;
+	char *valstr = NULL;
+
+	servicename = (share->service == GLOBAL_SECTION_SNUM)?
+		GLOBAL_NAME : lp_servicename(share->service);
+
+	if (opt_testmode) {
+		d_printf("TEST: snum    %i : [%s]\n", share->service, 
+			servicename);
+	}
+	else {
+		if (share->service == GLOBAL_SECTION_SNUM) {
+			werr = reg_open_path(ctx, KEY_SMBCONF, REG_KEY_WRITE,
+					     get_root_nt_token(), &key);
+			if (!W_ERROR_IS_OK(werr)) {
+				d_fprintf(stderr, 
+					"Error opening registry path '%s': %s\n",
+					KEY_SMBCONF, dos_errstr(werr));
+				goto done;
+			}
+		}
+		else {
+			werr = reg_createkey_internal(ctx, servicename, &key);
+			if (!W_ERROR_IS_OK(werr)) {
+				goto done;
+			}
+		}
+	}
+
 	while ((parm = lp_next_parameter(share->service, &pnum, 0)))
 	{
 		void *ptr = parm->ptr;
@@ -308,71 +335,96 @@
 			ptr = lp_local_ptr(share->service, ptr);
 		}
 
-		if (parm->type != P_SEP) {
-			d_printf("TEST: param %3d : %s = ", pnum, 
-				 parm->label);
-		}
+		valtype = "sz";
+
 		switch (parm->type) {
 		case P_CHAR:
-			d_printf("%c\n", *(char *)ptr);
+			valstr = talloc_asprintf(ctx, "%c", *(char *)ptr);
 			break;
 		case P_STRING:
 		case P_USTRING:
-			d_printf("%s\n", *(char **)ptr);
+			valstr = talloc_asprintf(ctx, "%s", *(char **)ptr);
 			break;
 		case P_GSTRING:
 		case P_UGSTRING:
-			d_printf("%s\n", (char *)ptr);
+			valstr = talloc_asprintf(ctx, "%s", (char *)ptr);
 			break;
 		case P_BOOL:
-			d_printf("%s\n", BOOLSTR(*(BOOL *)ptr));
+			valstr = talloc_asprintf(ctx, "%s", 
+						BOOLSTR(*(BOOL *)ptr));
 			break;
 		case P_BOOLREV:
-			d_printf("%s\n", BOOLSTR(!*(BOOL *)ptr));
+			valstr = talloc_asprintf(ctx, "%s", 
+						BOOLSTR(!*(BOOL *)ptr));
 			break;
 		case P_ENUM:
                 	for (i = 0; parm->enum_list[i].name; i++) {
                 	        if (*(int *)ptr == 
 				    parm->enum_list[i].value) 
 				{
-                	                d_printf("%s\n",
+					valstr = talloc_asprintf(ctx, "%s",
                 	                         parm->enum_list[i].name);
                 	                break;
                 	        }
                 	}
 			break;
 		case P_OCTAL:
-			d_printf("%s\n", octal_string(*(int *)ptr));
+			talloc_asprintf(ctx, "%s", octal_string(*(int *)ptr));
 			break;
 		case P_LIST:
+			valstr = talloc_asprintf(ctx, "");
 			if ((char ***)ptr && *(char ***)ptr) {
 				char **list = *(char ***)ptr;
 				for (; *list; list++) {
 					/* surround strings with whitespace 
 					 * in double quotes */
-					if ( strchr_m( *list, ' ' ) )
-						d_printf("\"%s\"%s", *list, 
-							 ((*(list+1))?", ":""));
-					else
-						d_printf("%s%s", *list, 
-							 ((*(list+1))?", ":""));
+					if (strchr_m(*list, ' '))
+					{
+						valstr = talloc_asprintf_append(
+							valstr, "\"%s\"%s", 
+							*list, 
+							 ((*(list+1))?", ":""));
+					}
+					else {
+						valstr = talloc_asprintf_append(
+							valstr, "%s%s", *list, 
+							 ((*(list+1))?", ":""));
+					}
 				}
 			}
-			d_printf("\n");
 			break;
 		case P_INTEGER:
-			d_printf("%d\n", *(int *)ptr);
+			valtype = "dword";
+			talloc_asprintf(ctx, "%d", *(int *)ptr);
 			break;
 		case P_SEP:
 			break;
 		default:
-			d_printf("<type unimplemented>\n");
+			valstr = talloc_asprintf(ctx, "<type unimplemented>\n");
 			break;
 		}
-	}
-	d_printf("TEST: -----------\n");
+
+		if (parm->type != P_SEP) {
+			if (opt_testmode) {
+				d_printf("TEST: param %3d : %s = %s\n", 
+					pnum, parm->label, valstr);
+			}
+			else {
+				werr = reg_setvalue_internal(key, parm->label, 
+							     valtype, valstr);
+				if (!W_ERROR_IS_OK(werr)) {
+					goto done;
+				}
+			}
+		}
+	}
+
+	if (opt_testmode) {
+		d_printf("TEST: -----------\n");
+	}
 
 	ret = 0;
+done:
 	return ret;
 }
 
@@ -456,7 +508,6 @@
 	struct share_iterator *shares;
 	struct share_params *share;
 	struct share_params global_share = { GLOBAL_SECTION_SNUM };
-	BOOL testmode = False;
 
 	ctx = talloc_init("net_conf_import");
 
@@ -465,31 +516,11 @@
 		default:
 			net_conf_import_usage(argc, argv);
 			goto done;
+		case 2:
+			servicename = argv[1];
 		case 1:
 			filename = argv[0];
 			break;
-		case 2:
-			if (strequal(argv[0], "-t")) {
-				testmode = True;
-				filename = argv[1];
-			}
-			else {
-				filename = argv[0];
-				servicename = argv[1];
-			}
-			break;
-		case 3:
-			servicename = argv[2];
-			filename = argv[1];
-			if (strequal(argv[0], "-t")) {
-				testmode = True;
-				filename = argv[1];
-			}
-			else {
-				net_conf_import_usage(argc, argv);
-				goto done;
-			}
-			break;
 	}
 
 	DEBUG(3,("net_conf_import: reading configuration from file %s.\n",
@@ -509,7 +540,7 @@
 
 	if ((servicename == NULL) || strequal(servicename, GLOBAL_NAME)) {
 		service_found = True;
-		if (import_process_service(ctx, &global_share, testmode) != 0) {
+		if (import_process_service(ctx, &global_share) != 0) {
 			goto done;
 		}
 	}
@@ -528,7 +559,7 @@
 		    || strequal(servicename, lp_servicename(share->service))) 
 		{
 			service_found = True;
-			if (import_process_service(ctx, share, testmode)!= 0) {
+			if (import_process_service(ctx, share)!= 0) {
 				goto done;
 			}
 		}



More information about the samba-cvs mailing list