libsemanage: add back original module enable/disable functions for ABI compatability

This uses symbolic versioning to maintain ABI compatability with the old
versions of semanage_module_get_enabled. Also to maintain ABI, the functions
semanage_module_{enable,disable} are added back and modified to call the
new semanage_module_set_enabled function.

Removed in commits:
- Revert "Last attempt at upstreaming semodule_disable patch."
- Revert "fixes to commit 847d27b8385ce77ac71df8aa58a2d298b33d1ea4"
- Revert "libsemanage: change module disabled from rename to symlink"
- Revert "libsemanage: Cleanup/fix enable/disable/remove module."

Signed-off-by: Steve Lawrence <[email protected]>
diff --git a/libsemanage/src/libsemanage.map b/libsemanage/src/libsemanage.map
index 1b863e9..e875723 100644
--- a/libsemanage/src/libsemanage.map
+++ b/libsemanage/src/libsemanage.map
@@ -6,10 +6,13 @@
 	  semanage_module_install; semanage_module_install_file;
 	  semanage_module_upgrade; semanage_module_upgrade_file;
 	  semanage_module_install_base; semanage_module_install_base_file;
+	  semanage_module_enable;
+	  semanage_module_disable;
 	  semanage_module_remove;
 	  semanage_module_list; semanage_module_info_datum_destroy;
 	  semanage_module_list_nth; semanage_module_get_name;
 	  semanage_module_get_version; semanage_select_store;
+	  semanage_module_get_enabled;
 	  semanage_reload_policy; semanage_set_reload; semanage_set_rebuild;
 	  semanage_user_*; semanage_bool_*; semanage_seuser_*;
 	  semanage_iface_*; semanage_port_*; semanage_context_*;
diff --git a/libsemanage/src/module_internal.h b/libsemanage/src/module_internal.h
index f7edcba..8a12788 100644
--- a/libsemanage/src/module_internal.h
+++ b/libsemanage/src/module_internal.h
@@ -26,6 +26,5 @@
     hidden_proto(semanage_module_key_get_name)
     hidden_proto(semanage_module_key_set_priority)
     hidden_proto(semanage_module_key_set_name)
-    hidden_proto(semanage_module_get_enabled)
     hidden_proto(semanage_module_set_enabled)
 #endif
diff --git a/libsemanage/src/modules.c b/libsemanage/src/modules.c
index 0aed6e5..daa52a6 100644
--- a/libsemanage/src/modules.c
+++ b/libsemanage/src/modules.c
@@ -41,6 +41,9 @@
 #include "modules.h"
 #include "debug.h"
 
+asm(".symver semanage_module_get_enabled_1_1,semanage_module_get_enabled@@LIBSEMANAGE_1.1");
+asm(".symver semanage_module_get_enabled_1_0,semanage_module_get_enabled@LIBSEMANAGE_1.0");
+
 int semanage_module_install(semanage_handle_t * sh,
 			    char *module_data, size_t data_len)
 {
@@ -855,7 +858,7 @@
 
 hidden_def(semanage_module_key_set_priority)
 
-int semanage_module_get_enabled(semanage_handle_t *sh,
+int semanage_module_get_enabled_1_1(semanage_handle_t *sh,
 				const semanage_module_key_t *modkey,
 				int *enabled)
 {
@@ -875,7 +878,10 @@
 	return sh->funcs->get_enabled(sh, modkey, enabled);
 }
 
-hidden_def(semanage_module_get_enabled)
+int semanage_module_get_enabled_1_0(semanage_module_info_t *modinfo)
+{
+	return modinfo->enabled;
+}
 
 int semanage_module_set_enabled(semanage_handle_t *sh,
 				const semanage_module_key_t *modkey,
@@ -903,6 +909,62 @@
 
 hidden_def(semanage_module_set_enabled)
 
+/* This function exists only for ABI compatability. It has been deprecated and
+ * should not be used. Instead, use semanage_module_set_enabled() */
+int semanage_module_enable(semanage_handle_t *sh, char *module_name)
+{
+	int rc = -1;
+	semanage_module_key_t *modkey = NULL;
+
+	rc = semanage_module_key_create(sh, &modkey);
+	if (rc != 0)
+		goto exit;
+
+	rc = semanage_module_key_set_name(sh, modkey, module_name);
+	if (rc != 0)
+		goto exit;
+
+	rc = semanage_module_set_enabled(sh, modkey, 1);
+	if (rc != 0)
+		goto exit;
+
+	rc = 0;
+
+exit:
+	semanage_module_key_destroy(sh, modkey);
+	free(modkey);
+
+	return rc;
+}
+
+/* This function exists only for ABI compatability. It has been deprecated and
+ * should not be used. Instead, use semanage_module_set_enabled() */
+int semanage_module_disable(semanage_handle_t *sh, char *module_name)
+{
+	int rc = -1;
+	semanage_module_key_t *modkey = NULL;
+
+	rc = semanage_module_key_create(sh, &modkey);
+	if (rc != 0)
+		goto exit;
+
+	rc = semanage_module_key_set_name(sh, modkey, module_name);
+	if (rc != 0)
+		goto exit;
+
+	rc = semanage_module_set_enabled(sh, modkey, 0);
+	if (rc != 0)
+		goto exit;
+
+	rc = 0;
+
+exit:
+	semanage_module_key_destroy(sh, modkey);
+	free(modkey);
+
+	return rc;
+}
+
 /* Converts a string to a priority
  *
  * returns -1 if str is not a valid priority.