psss / rpms / libsemanage

Forked from rpms/libsemanage 5 years ago
Clone
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/include/semanage/modules.h libsemanage-2.0.41/include/semanage/modules.h
f6a1eaa
--- nsalibsemanage/include/semanage/modules.h	2009-01-13 08:45:35.000000000 -0500
71c0c5e
+++ libsemanage-2.0.41/include/semanage/modules.h	2009-11-12 11:01:10.000000000 -0500
f6a1eaa
@@ -40,10 +40,12 @@
f6a1eaa
 				 char *module_data, size_t data_len);
f6a1eaa
 int semanage_module_install_base_file(semanage_handle_t *,
f6a1eaa
 				      const char *module_name);
f6a1eaa
+int semanage_module_enable(semanage_handle_t *, char *module_name);
f6a1eaa
+int semanage_module_disable(semanage_handle_t *, char *module_name);
f6a1eaa
 int semanage_module_remove(semanage_handle_t *, char *module_name);
f6a1eaa
 
f6a1eaa
 /* semanage_module_info is for getting information on installed
f6a1eaa
-   modules, only name and version at this time */
f6a1eaa
+   modules, only name and version, and enabled/disabled flag at this time */
f6a1eaa
 typedef struct semanage_module_info semanage_module_info_t;
f6a1eaa
 
f6a1eaa
 int semanage_module_list(semanage_handle_t *,
f6a1eaa
@@ -53,5 +55,6 @@
f6a1eaa
 						 int n);
f6a1eaa
 const char *semanage_module_get_name(semanage_module_info_t *);
f6a1eaa
 const char *semanage_module_get_version(semanage_module_info_t *);
f6a1eaa
+int semanage_module_get_enabled(semanage_module_info_t *);
f6a1eaa
 
f6a1eaa
 #endif
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/src/direct_api.c libsemanage-2.0.41/src/direct_api.c
b055669
--- nsalibsemanage/src/direct_api.c	2009-09-17 08:59:43.000000000 -0400
71c0c5e
+++ libsemanage-2.0.41/src/direct_api.c	2009-11-12 11:01:10.000000000 -0500
f6a1eaa
@@ -66,6 +66,8 @@
f6a1eaa
 static int semanage_direct_install_base(semanage_handle_t * sh, char *base_data,
f6a1eaa
 					size_t data_len);
f6a1eaa
 static int semanage_direct_install_base_file(semanage_handle_t * sh, const char *module_name);
f6a1eaa
+static int semanage_direct_enable(semanage_handle_t * sh, char *module_name);
f6a1eaa
+static int semanage_direct_disable(semanage_handle_t * sh, char *module_name);
f6a1eaa
 static int semanage_direct_remove(semanage_handle_t * sh, char *module_name);
f6a1eaa
 static int semanage_direct_list(semanage_handle_t * sh,
f6a1eaa
 				semanage_module_info_t ** modinfo,
f6a1eaa
@@ -83,6 +85,8 @@
f6a1eaa
 	.upgrade_file = semanage_direct_upgrade_file,
f6a1eaa
 	.install_base = semanage_direct_install_base,
f6a1eaa
 	.install_base_file = semanage_direct_install_base_file,
f6a1eaa
+	.enable = semanage_direct_enable,
f6a1eaa
+	.disable = semanage_direct_disable,
f6a1eaa
 	.remove = semanage_direct_remove,
f6a1eaa
 	.list = semanage_direct_list
f6a1eaa
 };
f6a1eaa
@@ -348,10 +352,17 @@
f6a1eaa
 	     semanage_path(SEMANAGE_TMP, SEMANAGE_MODULES)) == NULL) {
f6a1eaa
 		return -1;
f6a1eaa
 	}
f6a1eaa
-	if (asprintf(filename, "%s/%s.pp", module_path, *module_name) == -1) {
f6a1eaa
+	if (asprintf(filename, "%s/%s.pp%s", module_path, *module_name, DISABLESTR) == -1) {
f6a1eaa
 		ERR(sh, "Out of memory!");
f6a1eaa
 		return -1;
f6a1eaa
 	}
f6a1eaa
+
f6a1eaa
+	if (access(*filename, F_OK) == -1) {
f6a1eaa
+		char *ptr = *filename;
f6a1eaa
+		int len = strlen(ptr) - strlen(DISABLESTR);
f6a1eaa
+		if (len > 0) ptr[len]='\0';
f6a1eaa
+	}
f6a1eaa
+
f6a1eaa
 	return 0;
f6a1eaa
 }
f6a1eaa
 
b055669
@@ -1273,6 +1284,107 @@
f6a1eaa
 	return retval;
f6a1eaa
 }
f6a1eaa
 
f6a1eaa
+/* Enables a module from the sandbox.  Returns 0 on success, -1 if out
f6a1eaa
+ * of memory, -2 if module not found or could not be enabled. */
f6a1eaa
+static int semanage_direct_enable(semanage_handle_t * sh, char *module_name)
f6a1eaa
+{
f6a1eaa
+	int i, retval = -1;
f6a1eaa
+	char **module_filenames = NULL;
f6a1eaa
+	int num_mod_files;
f6a1eaa
+	size_t name_len = strlen(module_name);
f6a1eaa
+	if (semanage_get_modules_names(sh, &module_filenames, &num_mod_files) ==
f6a1eaa
+	    -1) {
f6a1eaa
+		return -1;
f6a1eaa
+	}
f6a1eaa
+	for (i = 0; i < num_mod_files; i++) {
f6a1eaa
+		char *base = strrchr(module_filenames[i], '/');
f6a1eaa
+		if (base == NULL) {
f6a1eaa
+			ERR(sh, "Could not read module names.");
f6a1eaa
+			retval = -2;
f6a1eaa
+			goto cleanup;
f6a1eaa
+		}
f6a1eaa
+		base++;
f6a1eaa
+		if (memcmp(module_name, base, name_len) == 0 &&
f6a1eaa
+		    strcmp(base + name_len + 3, DISABLESTR) == 0) {
f6a1eaa
+			int len = strlen(module_filenames[i]) - strlen(DISABLESTR);
f6a1eaa
+			char *enabled_name = calloc(1, len+1);
f6a1eaa
+			if (!enabled_name) {
f6a1eaa
+				ERR(sh, "Could not allocate memory");
f6a1eaa
+				retval = -1;
f6a1eaa
+				goto cleanup;
f6a1eaa
+			}
f6a1eaa
+
f6a1eaa
+			strncpy(enabled_name, module_filenames[i],len);
f6a1eaa
+
f6a1eaa
+			if (rename(module_filenames[i], enabled_name) == -1) {
f6a1eaa
+				ERR(sh, "Could not enable module file %s.",
f6a1eaa
+				    enabled_name);
f6a1eaa
+				retval = -2;
f6a1eaa
+			}
f6a1eaa
+			retval = 0;
f6a1eaa
+			free(enabled_name);
f6a1eaa
+			goto cleanup;
f6a1eaa
+		}
f6a1eaa
+	}
f6a1eaa
+	ERR(sh, "Module %s was not found.", module_name);
f6a1eaa
+	retval = -2;		/* module not found */
f6a1eaa
+      cleanup:
f6a1eaa
+	for (i = 0; module_filenames != NULL && i < num_mod_files; i++) {
f6a1eaa
+		free(module_filenames[i]);
f6a1eaa
+	}
f6a1eaa
+	free(module_filenames);
f6a1eaa
+	return retval;
f6a1eaa
+}
f6a1eaa
+
f6a1eaa
+/* Enables a module from the sandbox.  Returns 0 on success, -1 if out
f6a1eaa
+ * of memory, -2 if module not found or could not be enabled. */
f6a1eaa
+static int semanage_direct_disable(semanage_handle_t * sh, char *module_name)
f6a1eaa
+{
f6a1eaa
+	int i, retval = -1;
f6a1eaa
+	char **module_filenames = NULL;
f6a1eaa
+	int num_mod_files;
f6a1eaa
+	size_t name_len = strlen(module_name);
f6a1eaa
+	if (semanage_get_modules_names(sh, &module_filenames, &num_mod_files) ==
f6a1eaa
+	    -1) {
f6a1eaa
+		return -1;
f6a1eaa
+	}
f6a1eaa
+	for (i = 0; i < num_mod_files; i++) {
f6a1eaa
+		char *base = strrchr(module_filenames[i], '/');
f6a1eaa
+		if (base == NULL) {
f6a1eaa
+			ERR(sh, "Could not read module names.");
f6a1eaa
+			retval = -2;
f6a1eaa
+			goto cleanup;
f6a1eaa
+		}
f6a1eaa
+		base++;
f6a1eaa
+		if (memcmp(module_name, base, name_len) == 0 &&
f6a1eaa
+		    strcmp(base + name_len, ".pp") == 0) {
f6a1eaa
+			char disabled_name[PATH_MAX];
f6a1eaa
+			if (snprintf(disabled_name, PATH_MAX, "%s%s", 
f6a1eaa
+				     module_filenames[i], DISABLESTR) == PATH_MAX) {
f6a1eaa
+				ERR(sh, "Could not disable module file %s.",
f6a1eaa
+				    module_filenames[i]);
f6a1eaa
+				retval = -2;
f6a1eaa
+				goto cleanup;
f6a1eaa
+			}
f6a1eaa
+			if (rename(module_filenames[i], disabled_name) == -1) {
f6a1eaa
+				ERR(sh, "Could not disable module file %s.",
f6a1eaa
+				    module_filenames[i]);
f6a1eaa
+				retval = -2;
f6a1eaa
+			}
f6a1eaa
+			retval = 0;
f6a1eaa
+			goto cleanup;
f6a1eaa
+		}
f6a1eaa
+	}
f6a1eaa
+	ERR(sh, "Module %s was not found.", module_name);
f6a1eaa
+	retval = -2;		/* module not found */
f6a1eaa
+      cleanup:
f6a1eaa
+	for (i = 0; module_filenames != NULL && i < num_mod_files; i++) {
f6a1eaa
+		free(module_filenames[i]);
f6a1eaa
+	}
f6a1eaa
+	free(module_filenames);
f6a1eaa
+	return retval;
f6a1eaa
+}
f6a1eaa
+
f6a1eaa
 /* Removes a module from the sandbox.  Returns 0 on success, -1 if out
f6a1eaa
  * of memory, -2 if module not found or could not be removed. */
f6a1eaa
 static int semanage_direct_remove(semanage_handle_t * sh, char *module_name)
b055669
@@ -1293,8 +1405,7 @@
f6a1eaa
 			goto cleanup;
f6a1eaa
 		}
f6a1eaa
 		base++;
f6a1eaa
-		if (memcmp(module_name, base, name_len) == 0 &&
f6a1eaa
-		    strcmp(base + name_len, ".pp") == 0) {
f6a1eaa
+		if (memcmp(module_name, base, name_len) == 0) {
f6a1eaa
 			if (unlink(module_filenames[i]) == -1) {
f6a1eaa
 				ERR(sh, "Could not remove module file %s.",
f6a1eaa
 				    module_filenames[i]);
b055669
@@ -1369,6 +1480,7 @@
f6a1eaa
 		}
f6a1eaa
 		ssize_t size;
f6a1eaa
 		char *data = NULL;
f6a1eaa
+		int enabled = semanage_module_enabled(module_filenames[i]);
f6a1eaa
 
f6a1eaa
 		if ((size = bunzip(sh, fp, &data)) > 0) {
f6a1eaa
 			fclose(fp);
b055669
@@ -1393,6 +1505,7 @@
f6a1eaa
 		if (type == SEPOL_POLICY_MOD) {
f6a1eaa
 			(*modinfo)[*num_modules].name = name;
f6a1eaa
 			(*modinfo)[*num_modules].version = version;
f6a1eaa
+			(*modinfo)[*num_modules].enabled = enabled;
f6a1eaa
 			(*num_modules)++;
f6a1eaa
 		} else {
f6a1eaa
 			/* file was not a module, so don't report it */
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/src/genhomedircon.c libsemanage-2.0.41/src/genhomedircon.c
b1238c4
--- nsalibsemanage/src/genhomedircon.c	2009-09-17 08:59:43.000000000 -0400
71c0c5e
+++ libsemanage-2.0.41/src/genhomedircon.c	2009-11-12 11:01:10.000000000 -0500
b1238c4
@@ -310,6 +310,10 @@
b1238c4
 		}
b1238c4
 		if (strcmp(pwbuf->pw_dir, "/") == 0)
b1238c4
 			continue;
b1238c4
+		if (strcmp(pwbuf->pw_dir, "/root") == 0) {
b1238c4
+			continue;
b1238c4
+		}
b1238c4
+
b1238c4
 		if (semanage_str_count(pwbuf->pw_dir, '/') <= 1)
b1238c4
 			continue;
b1238c4
 		if (!(path = strdup(pwbuf->pw_dir))) {
b1238c4
@@ -803,6 +807,9 @@
b1238c4
 			 * /root */
b1238c4
 			continue;
b1238c4
 		}
b1238c4
+		if (strcmp(pwent->pw_dir, "/root") == 0) {
b1238c4
+			continue;
b1238c4
+		}
b1238c4
 		if (push_user_entry(&head, name, seuname,
b1238c4
 				    prefix, pwent->pw_dir) != STATUS_SUCCESS) {
b1238c4
 			*errors = STATUS_ERR;
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/src/libsemanage.map libsemanage-2.0.41/src/libsemanage.map
71c0c5e
--- nsalibsemanage/src/libsemanage.map	2009-10-29 15:21:39.000000000 -0400
71c0c5e
+++ libsemanage-2.0.41/src/libsemanage.map	2009-11-12 11:01:10.000000000 -0500
f6a1eaa
@@ -6,10 +6,13 @@
f6a1eaa
 	  semanage_module_install; semanage_module_install_file;
f6a1eaa
 	  semanage_module_upgrade; semanage_module_upgrade_file;
f6a1eaa
 	  semanage_module_install_base; semanage_module_install_base_file;
f6a1eaa
+	  semanage_module_enable;
f6a1eaa
+	  semanage_module_disable;
f6a1eaa
 	  semanage_module_remove;
f6a1eaa
 	  semanage_module_list; semanage_module_info_datum_destroy;
f6a1eaa
 	  semanage_module_list_nth; semanage_module_get_name;
f6a1eaa
 	  semanage_module_get_version; semanage_select_store;
f6a1eaa
+	  semanage_module_get_enabled;
f6a1eaa
 	  semanage_reload_policy; semanage_set_reload; semanage_set_rebuild;
f6a1eaa
 	  semanage_user_*; semanage_bool_*; semanage_seuser_*;
f6a1eaa
 	  semanage_iface_*; semanage_port_*; semanage_context_*;
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/src/module_internal.h libsemanage-2.0.41/src/module_internal.h
f6a1eaa
--- nsalibsemanage/src/module_internal.h	2008-08-28 09:34:24.000000000 -0400
71c0c5e
+++ libsemanage-2.0.41/src/module_internal.h	2009-11-12 11:01:10.000000000 -0500
f6a1eaa
@@ -6,6 +6,7 @@
f6a1eaa
 
f6a1eaa
 hidden_proto(semanage_module_get_name)
f6a1eaa
     hidden_proto(semanage_module_get_version)
f6a1eaa
+    hidden_proto(semanage_module_get_enabled)
f6a1eaa
     hidden_proto(semanage_module_info_datum_destroy)
f6a1eaa
     hidden_proto(semanage_module_list_nth)
f6a1eaa
 #endif
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/src/modules.c libsemanage-2.0.41/src/modules.c
b055669
--- nsalibsemanage/src/modules.c	2009-09-17 08:59:43.000000000 -0400
71c0c5e
+++ libsemanage-2.0.41/src/modules.c	2009-11-12 11:01:10.000000000 -0500
b1238c4
@@ -154,6 +154,40 @@
f6a1eaa
 	return sh->funcs->install_base_file(sh, module_name);
f6a1eaa
 }
f6a1eaa
 
f6a1eaa
+int semanage_module_enable(semanage_handle_t * sh, char *module_name)
f6a1eaa
+{
f6a1eaa
+	if (sh->funcs->enable == NULL) {
f6a1eaa
+		ERR(sh, "No enable function defined for this connection type.");
f6a1eaa
+		return -1;
f6a1eaa
+	} else if (!sh->is_connected) {
f6a1eaa
+		ERR(sh, "Not connected.");
f6a1eaa
+		return -1;
f6a1eaa
+	} else if (!sh->is_in_transaction) {
f6a1eaa
+		if (semanage_begin_transaction(sh) < 0) {
f6a1eaa
+			return -1;
f6a1eaa
+		}
f6a1eaa
+	}
f6a1eaa
+	sh->modules_modified = 1;
f6a1eaa
+	return sh->funcs->enable(sh, module_name);
f6a1eaa
+}
f6a1eaa
+
f6a1eaa
+int semanage_module_disable(semanage_handle_t * sh, char *module_name)
f6a1eaa
+{
f6a1eaa
+	if (sh->funcs->disable == NULL) {
f6a1eaa
+		ERR(sh, "No disable function defined for this connection type.");
f6a1eaa
+		return -1;
f6a1eaa
+	} else if (!sh->is_connected) {
f6a1eaa
+		ERR(sh, "Not connected.");
f6a1eaa
+		return -1;
f6a1eaa
+	} else if (!sh->is_in_transaction) {
f6a1eaa
+		if (semanage_begin_transaction(sh) < 0) {
f6a1eaa
+			return -1;
f6a1eaa
+		}
f6a1eaa
+	}
f6a1eaa
+	sh->modules_modified = 1;
f6a1eaa
+	return sh->funcs->disable(sh, module_name);
f6a1eaa
+}
f6a1eaa
+
f6a1eaa
 int semanage_module_remove(semanage_handle_t * sh, char *module_name)
f6a1eaa
 {
f6a1eaa
 	if (sh->funcs->remove == NULL) {
b1238c4
@@ -209,6 +243,13 @@
f6a1eaa
 
f6a1eaa
 hidden_def(semanage_module_get_name)
f6a1eaa
 
f6a1eaa
+int semanage_module_get_enabled(semanage_module_info_t * modinfo)
f6a1eaa
+{
f6a1eaa
+	return modinfo->enabled;
f6a1eaa
+}
f6a1eaa
+
f6a1eaa
+hidden_def(semanage_module_get_enabled)
f6a1eaa
+
f6a1eaa
 const char *semanage_module_get_version(semanage_module_info_t * modinfo)
f6a1eaa
 {
f6a1eaa
 	return modinfo->version;
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/src/modules.h libsemanage-2.0.41/src/modules.h
f6a1eaa
--- nsalibsemanage/src/modules.h	2008-08-28 09:34:24.000000000 -0400
71c0c5e
+++ libsemanage-2.0.41/src/modules.h	2009-11-12 11:01:10.000000000 -0500
f6a1eaa
@@ -26,6 +26,7 @@
f6a1eaa
 struct semanage_module_info {
f6a1eaa
 	char *name;		/* Key */
f6a1eaa
 	char *version;
f6a1eaa
+	int enabled;
f6a1eaa
 };
f6a1eaa
 
f6a1eaa
 #endif
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/src/policy.h libsemanage-2.0.41/src/policy.h
f6a1eaa
--- nsalibsemanage/src/policy.h	2009-01-13 08:45:35.000000000 -0500
71c0c5e
+++ libsemanage-2.0.41/src/policy.h	2009-11-12 11:01:10.000000000 -0500
f6a1eaa
@@ -58,6 +58,12 @@
f6a1eaa
 	/* Upgrade a policy module */
f6a1eaa
 	int (*upgrade_file) (struct semanage_handle *, const char *);
f6a1eaa
 
f6a1eaa
+	/* Enable a policy module */
f6a1eaa
+	int (*enable) (struct semanage_handle *, char *);
f6a1eaa
+
f6a1eaa
+	/* Disable a policy module */
f6a1eaa
+	int (*disable) (struct semanage_handle *, char *);
f6a1eaa
+
f6a1eaa
 	/* Remove a policy module */
f6a1eaa
 	int (*remove) (struct semanage_handle *, char *);
f6a1eaa
 
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/src/semanage.conf libsemanage-2.0.41/src/semanage.conf
ead711e
--- nsalibsemanage/src/semanage.conf	2008-08-28 09:34:24.000000000 -0400
71c0c5e
+++ libsemanage-2.0.41/src/semanage.conf	2009-11-12 11:01:10.000000000 -0500
1427637
@@ -35,4 +35,4 @@
1427637
 # given in <sepol/policydb.h>.  Change this setting if a different
1427637
 # version is necessary.
1427637
 #policy-version = 19
1427637
-
1427637
+expand-check=0
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/src/semanage_store.c libsemanage-2.0.41/src/semanage_store.c
71c0c5e
--- nsalibsemanage/src/semanage_store.c	2009-10-29 15:21:39.000000000 -0400
71c0c5e
+++ libsemanage-2.0.41/src/semanage_store.c	2009-11-12 11:01:10.000000000 -0500
f6a1eaa
@@ -57,6 +57,8 @@
f6a1eaa
 
f6a1eaa
 #include "debug.h"
f6a1eaa
 
f6a1eaa
+const char *DISABLESTR=".disabled";
f6a1eaa
+
f6a1eaa
 #define SEMANAGE_CONF_FILE "semanage.conf"
f6a1eaa
 /* relative path names to enum semanage_paths to special files and
f6a1eaa
  * directories for the module store */
f6a1eaa
@@ -433,6 +435,21 @@
f6a1eaa
 	return 1;
f6a1eaa
 }
f6a1eaa
 
f6a1eaa
+int semanage_module_enabled(const char *file) {
f6a1eaa
+	int len = strlen(file) - strlen(DISABLESTR);
f6a1eaa
+	return (len < 0 || strcmp(&file[len], DISABLESTR) != 0);
f6a1eaa
+}
f6a1eaa
+
f6a1eaa
+static int semanage_modulename_select(const struct dirent *d)
f6a1eaa
+{
f6a1eaa
+	if (d->d_name[0] == '.'
f6a1eaa
+	    && (d->d_name[1] == '\0'
f6a1eaa
+		|| (d->d_name[1] == '.' && d->d_name[2] == '\0')))
f6a1eaa
+		return 0;
f6a1eaa
+
f6a1eaa
+	return semanage_module_enabled(d->d_name);
f6a1eaa
+}
f6a1eaa
+
f6a1eaa
 /* Copies a file from src to dst.  If dst already exists then
f6a1eaa
  * overwrite it.  Returns 0 on success, -1 on error. */
f6a1eaa
 static int semanage_copy_file(const char *src, const char *dst, mode_t mode)
f6a1eaa
@@ -599,15 +616,8 @@
f6a1eaa
 	return -1;
f6a1eaa
 }
f6a1eaa
 
f6a1eaa
-/* Scans the modules directory for the current semanage handler.  This
f6a1eaa
- * might be the active directory or sandbox, depending upon if the
f6a1eaa
- * handler has a transaction lock.  Allocates and fills in *filenames
f6a1eaa
- * with an array of module filenames; length of array is stored in
f6a1eaa
- * *len.  The caller is responsible for free()ing *filenames and its
f6a1eaa
- * individual elements.	 Upon success returns 0, -1 on error.
f6a1eaa
- */
f6a1eaa
-int semanage_get_modules_names(semanage_handle_t * sh, char ***filenames,
f6a1eaa
-			       int *len)
f6a1eaa
+static int semanage_get_modules_names_filter(semanage_handle_t * sh, char ***filenames,
f6a1eaa
+				      int *len, int (*filter)(const struct dirent *))
f6a1eaa
 {
f6a1eaa
 	const char *modules_path;
f6a1eaa
 	struct dirent **namelist = NULL;
f6a1eaa
@@ -622,7 +632,7 @@
f6a1eaa
 	*filenames = NULL;
f6a1eaa
 	*len = 0;
f6a1eaa
 	if ((num_files = scandir(modules_path, &namelist,
f6a1eaa
-				 semanage_filename_select, alphasort)) == -1) {
f6a1eaa
+				 filter, alphasort)) == -1) {
f6a1eaa
 		ERR(sh, "Error while scanning directory %s.", modules_path);
f6a1eaa
 		goto cleanup;
f6a1eaa
 	}
f6a1eaa
@@ -663,6 +673,34 @@
f6a1eaa
 	return retval;
f6a1eaa
 }
f6a1eaa
 
f6a1eaa
+/* Scans the modules directory for the current semanage handler.  This
f6a1eaa
+ * might be the active directory or sandbox, depending upon if the
f6a1eaa
+ * handler has a transaction lock.  Allocates and fills in *filenames
f6a1eaa
+ * with an array of module filenames; length of array is stored in
f6a1eaa
+ * *len.  The caller is responsible for free()ing *filenames and its
f6a1eaa
+ * individual elements.	 Upon success returns 0, -1 on error.
f6a1eaa
+ */
f6a1eaa
+int semanage_get_modules_names(semanage_handle_t * sh, char ***filenames,
f6a1eaa
+			       int *len)
f6a1eaa
+{
f6a1eaa
+	return semanage_get_modules_names_filter(sh, filenames,
f6a1eaa
+						 len, semanage_filename_select);
f6a1eaa
+}
f6a1eaa
+
f6a1eaa
+/* Scans the modules directory for the current semanage handler.  This
f6a1eaa
+ * might be the active directory or sandbox, depending upon if the
f6a1eaa
+ * handler has a transaction lock.  Allocates and fills in *filenames
f6a1eaa
+ * with an array of module filenames; length of array is stored in
f6a1eaa
+ * *len.  The caller is responsible for free()ing *filenames and its
f6a1eaa
+ * individual elements.	 Upon success returns 0, -1 on error.
f6a1eaa
+ */
f6a1eaa
+int semanage_get_active_modules_names(semanage_handle_t * sh, char ***filenames,
f6a1eaa
+			       int *len)
f6a1eaa
+{
f6a1eaa
+	return semanage_get_modules_names_filter(sh, filenames,
f6a1eaa
+						 len, semanage_modulename_select);
f6a1eaa
+}
f6a1eaa
+
f6a1eaa
 /******************* routines that run external programs *******************/
f6a1eaa
 
f6a1eaa
 /* Appends a single character to a string.  Returns a pointer to the
f6a1eaa
@@ -1589,7 +1627,7 @@
f6a1eaa
 	}
f6a1eaa
 
f6a1eaa
 	/* get list of modules and load them */
f6a1eaa
-	if (semanage_get_modules_names(sh, &module_filenames, &num_modules) ==
f6a1eaa
+	if (semanage_get_active_modules_names(sh, &module_filenames, &num_modules) ==
f6a1eaa
 	    -1 || semanage_load_module(sh, base_filename, base) == -1) {
f6a1eaa
 		goto cleanup;
f6a1eaa
 	}
71c0c5e
diff --exclude-from=exclude -N -u -r nsalibsemanage/src/semanage_store.h libsemanage-2.0.41/src/semanage_store.h
f6a1eaa
--- nsalibsemanage/src/semanage_store.h	2009-07-07 15:32:32.000000000 -0400
71c0c5e
+++ libsemanage-2.0.41/src/semanage_store.h	2009-11-12 11:01:10.000000000 -0500
f6a1eaa
@@ -128,4 +128,6 @@
f6a1eaa
 		     size_t buf_len,
f6a1eaa
 		     char **sorted_buf, size_t * sorted_buf_len);
f6a1eaa
 
f6a1eaa
+extern const char *DISABLESTR;
f6a1eaa
+
f6a1eaa
 #endif