Module Name:    src
Committed By:   jnemeth
Date:           Tue Jun  9 19:09:03 UTC 2009

Modified Files:
        src/sys/kern: kern_module.c

Log Message:
Add code to merge the modload "command line" with <module>.prop.


To generate a diff of this commit:
cvs rdiff -u -r1.46 -r1.47 src/sys/kern/kern_module.c

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

Modified files:

Index: src/sys/kern/kern_module.c
diff -u src/sys/kern/kern_module.c:1.46 src/sys/kern/kern_module.c:1.47
--- src/sys/kern/kern_module.c:1.46	Sun Jun  7 09:47:31 2009
+++ src/sys/kern/kern_module.c	Tue Jun  9 19:09:03 2009
@@ -1,4 +1,4 @@
-/*	$NetBSD: kern_module.c,v 1.46 2009/06/07 09:47:31 jnemeth Exp $	*/
+/*	$NetBSD: kern_module.c,v 1.47 2009/06/09 19:09:03 jnemeth Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -34,7 +34,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.46 2009/06/07 09:47:31 jnemeth Exp $");
+__KERNEL_RCSID(0, "$NetBSD: kern_module.c,v 1.47 2009/06/09 19:09:03 jnemeth Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_ddb.h"
@@ -95,6 +95,7 @@
 static void	module_thread(void *);
 static int	module_load_plist_file(const char *, const bool, void **,
 		    size_t *);
+static bool	module_merge_dicts(prop_dictionary_t, const prop_dictionary_t);
 
 /*
  * module_error:
@@ -797,6 +798,10 @@
 			filedict = prop_dictionary_internalize(plist);
 			if (filedict == NULL) {
 				error = EINVAL;
+			} else if (!module_merge_dicts(filedict, props)) {
+				error = EINVAL;
+				prop_object_release(filedict);
+				filedict = NULL;
 			}
 		}
 		if (plist != NULL) {
@@ -810,7 +815,7 @@
 	KASSERT(module_active == NULL);
 	module_active = mod;
 	error = (*mi->mi_modcmd)(MODULE_CMD_INIT, (filedict != NULL) ?
-	    filedict : props);
+	    filedict : props);	/* props will have been merged with filedict */
 	module_active = NULL;
 	if (filedict != NULL) {
 		prop_object_release(filedict);
@@ -1197,3 +1202,37 @@
 	*basep = base;
 	return error;
 }
+
+static bool
+module_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;
+	bool error;
+
+	error = false;
+	props_iter = prop_dictionary_iterator(new_dict);
+	if (props_iter == NULL) {
+		return false;
+	}
+
+	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)) {
+			error = true;
+			goto out;
+		}
+	}
+	error = false;
+
+out:
+	prop_object_iterator_release(props_iter);
+
+	return !error;
+}

Reply via email to