Module Name:    src
Committed By:   jnemeth
Date:           Thu Jun  4 02:57:01 UTC 2009

Modified Files:
        src/sbin/modload: main.c modload.8

Log Message:
Add a "-m plist" option.  This option will read in an existing
<module>.prop file and merge any options supplied on the "command
line".

This code will serve as the basis for in-kernel merging.


To generate a diff of this commit:
cvs rdiff -u -r1.7 -r1.8 src/sbin/modload/main.c
cvs rdiff -u -r1.31 -r1.32 src/sbin/modload/modload.8

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sbin/modload/main.c
diff -u src/sbin/modload/main.c:1.7 src/sbin/modload/main.c:1.8
--- src/sbin/modload/main.c:1.7	Tue May 19 22:55:24 2009
+++ src/sbin/modload/main.c	Thu Jun  4 02:57:01 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: main.c,v 1.7 2009/05/19 22:55:24 jnemeth Exp $	*/
+/*	$NetBSD: main.c,v 1.8 2009/06/04 02:57:01 jnemeth Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifndef lint
-__RCSID("$NetBSD: main.c,v 1.7 2009/05/19 22:55:24 jnemeth Exp $");
+__RCSID("$NetBSD: main.c,v 1.8 2009/06/04 02:57:01 jnemeth Exp $");
 #endif /* !lint */
 
 #include <sys/module.h>
@@ -54,21 +54,26 @@
 static void	parse_string_param(prop_dictionary_t, const char *,
 				   const char *);
 static void	usage(void) __dead;
+static void	merge_dicts(prop_dictionary_t, const prop_dictionary_t);
 
 int
 main(int argc, char **argv)
 {
 	modctl_load_t cmdargs;
-	prop_dictionary_t props;
-	bool output_props = false;
+	prop_dictionary_t ext_props, props;
+	bool merge_props, output_props;
+	const char *ext_file;
 	char *propsstr;
 	int ch;
 	int flags;
 
-	flags = 0;
+	ext_file = NULL;
+	ext_props = NULL;
 	props = prop_dictionary_create();
+	merge_props = output_props = false;
+	flags = 0;
 
-	while ((ch = getopt(argc, argv, "b:fi:ps:")) != -1) {
+	while ((ch = getopt(argc, argv, "b:fi:m:ps:")) != -1) {
 		switch (ch) {
 		case 'b':
 			parse_param(props, optarg, parse_bool_param);
@@ -82,6 +87,11 @@
 			parse_param(props, optarg, parse_int_param);
 			break;
 
+		case 'm':
+			merge_props = true;
+			ext_file = optarg;
+			break;
+
 		case 'p':
 			output_props = true;
 			break;
@@ -103,9 +113,22 @@
 	if (propsstr == NULL)
 		errx(EXIT_FAILURE, "Failed to process properties");
 
-	if (output_props)
+	if (output_props) {
+		if (merge_props) {
+			ext_props =
+			    prop_dictionary_internalize_from_file(ext_file);
+			if (ext_props == NULL) {
+				errx(EXIT_FAILURE, "Failed to read existing "
+				    "property list");
+			}
+
+			free(propsstr);
+			merge_dicts(ext_props, props);
+			propsstr = prop_dictionary_externalize(ext_props);
+		}
+				
 		fputs(propsstr, stdout);
-	else {
+	} else {
 		if (argc != 1)
 			usage();
 		cmdargs.ml_filename = argv[0];
@@ -201,8 +224,36 @@
 	(void)fprintf(stderr,
 	    "Usage: %s [-f] [-b var=boolean] [-i var=integer] "
 	    "[-s var=string] module\n"
-	    "       %s -p [-b var=boolean] [-i var=integer] "
+	    "       %s -p [-m plist] [-b var=boolean] [-i var=integer] "
 	    "[-s var=string]\n",
 	    getprogname(), getprogname());
 	exit(EXIT_FAILURE);
 }
+
+static void
+merge_dicts(prop_dictionary_t existing_dict, const prop_dictionary_t new_dict)
+{
+	prop_dictionary_keysym_t props_keysym;
+	prop_object_iterator_t props_iter;
+	prop_object_t props_obj;
+	const char *props_key;
+
+	props_iter = prop_dictionary_iterator(new_dict);
+	if (props_iter == NULL) {
+		errx(EXIT_FAILURE, "Failed to iterate new property list");
+	}
+
+	while ((props_obj = prop_object_iterator_next(props_iter)) != NULL) {
+		props_keysym = (prop_dictionary_keysym_t)props_obj;
+		props_key = prop_dictionary_keysym_cstring_nocopy(props_keysym);
+		props_obj = prop_dictionary_get_keysym(new_dict, props_keysym);
+		if ((props_obj == NULL) || !prop_dictionary_set(existing_dict,
+		    props_key, props_obj)) {
+			errx(EXIT_FAILURE, "Failed to copy "
+			    "existing property list");
+		}
+	}
+	prop_object_iterator_release(props_iter);
+
+	return;
+}

Index: src/sbin/modload/modload.8
diff -u src/sbin/modload/modload.8:1.31 src/sbin/modload/modload.8:1.32
--- src/sbin/modload/modload.8:1.31	Tue May 19 22:39:52 2009
+++ src/sbin/modload/modload.8	Thu Jun  4 02:57:01 2009
@@ -1,4 +1,4 @@
-.\" $NetBSD: modload.8,v 1.31 2009/05/19 22:39:52 wiz Exp $
+.\" $NetBSD: modload.8,v 1.32 2009/06/04 02:57:01 jnemeth Exp $
 .\"
 .\" Copyright (c) 1993 Christopher G. Demetriou
 .\" All rights reserved.
@@ -32,7 +32,7 @@
 .\"
 .\" <<Id: LICENSE,v 1.2 2000/06/14 15:57:33 cgd Exp>>
 .\"
-.Dd May 19, 2009
+.Dd June 3, 2009
 .Dt MODLOAD 8
 .Os
 .Sh NAME
@@ -47,6 +47,7 @@
 .Ar module
 .Nm
 .Fl p
+.Op Fl m Ar plist
 .Op Fl b Ar var=boolean
 .Op Fl i Ar var=integer
 .Op Fl s Ar var=string
@@ -85,6 +86,11 @@
 .Ar var
 and integral value
 .Ar integer .
+.It Fl m Ar plist
+When used in conjuction with
+.Fl p
+merge new options with an existing property list contained in
+.Ar plist .
 .It Fl p
 Output a property list suitable for loading along with a module.
 When using this option, you do not need to specify a module.

Reply via email to