diff --git a/MODULE_LICENSE_PUBLIC_DOMAIN b/MODULE_LICENSE_PUBLIC_DOMAIN
deleted file mode 100644
index e69de29..0000000
--- a/MODULE_LICENSE_PUBLIC_DOMAIN
+++ /dev/null
diff --git a/NOTICE b/NOTICE
deleted file mode 100644
index d386268..0000000
--- a/NOTICE
+++ /dev/null
@@ -1,21 +0,0 @@
-This library (libselinux) is public domain software, i.e. not copyrighted.
-
-Warranty Exclusion
-------------------
-You agree that this software is a
-non-commercially developed program that may contain "bugs" (as that
-term is used in the industry) and that it may not function as intended.
-The software is licensed "as is". NSA makes no, and hereby expressly
-disclaims all, warranties, express, implied, statutory, or otherwise
-with respect to the software, including noninfringement and the implied
-warranties of merchantability and fitness for a particular purpose.
-
-Limitation of Liability
------------------------
-In no event will NSA be liable for any damages, including loss of data,
-lost profits, cost of cover, or other special, incidental,
-consequential, direct or indirect damages arising from the software or
-the use thereof, however caused and on any theory of liability. This
-limitation will apply even if NSA has been advised of the possibility
-of such damage. You acknowledge that this is a reasonable allocation of
-risk.
diff --git a/README.android b/README.android
deleted file mode 100644
index e01f889..0000000
--- a/README.android
+++ /dev/null
@@ -1,62 +0,0 @@
-This directory contains a small port of libselinux for Android.
-It was originally forked in mid-2011, circa libselinux 2.1.0.
-Some changes have been cherry-picked from the upstream libselinux.
-Upstream git repository is https://github.com/SELinuxProject/selinux
-(libselinux subdirectory) and official releases are available from
-https://github.com/SELinuxProject/selinux/wiki/Releases.
-
-This fork differs from upstream libselinux in at least the following ways:
-
-* Dependencies on glibc-specific features have been removed/replaced
-in order to work with bionic,
-
-* Legacy code and compatibility interfaces have been removed,
-
-* Many interfaces, functions, and files are omitted since they are
-unused in Android,
-
-* The python bindings are omitted since they are unused in Android,
-
-* The setrans (context translation) support has been removed since
-there is no need for MLS label translation in Android and the support
-imposes extra overhead on calls passing security contexts,
-
-* The SELinux policy files are all located in / rather than under
-/etc/selinux since /etc is not available in Android until /system
-is mounted and use fixed paths, not dependent on /etc/selinux/config,
-
-* The kernel policy file (sepolicy in Android, policy.N in Linux) does
-not include a version suffix since Android does not need to support
-booting multiple kernels,
-
-* The policy loading logic does not support automatic downgrading of
-the kernel policy file to a version known to the kernel, since this
-requires libsepol on the device and is only needed to support mixing
-and matching kernels and userspace easily,
-
-* The selabel interface and label_file backend have been extended to
-support label-by-symlink and partial matching support for use by ueventd
-in labeling device nodes based on stable symlink names and by init for
-optimizing its restorecon_recursive of /sys,
-
-* Since the fork, upstream libselinux has switched the label_file
-backend to use a binary version of the file_contexts file
-(file_contexts.bin) that contains precompiled versions of the pcre
-regexes.  This reduces the time to load the file_contexts
-configuration, which in Linux can be significant due to the large
-number of entries (> 5000).  As Android has far fewer entries (~400),
-this has not yet seemed necessary.
-
-* restorecon functionality, including recursive restorecon, has been
-fully implemented within new libselinux functions, along with optimizations
-to prune the tree walk if no change has occurred in file_contexts since
-the last restorecon,
-
-* Support for new Android-specific SELinux configuration files, such
-as seapp_contexts, property_contexts, and service_contexts, has been
-added.
-
-New files added for Android:
-* libselinux/include/selinux/android.h
-* libselinux/src/android.c
-* libselinux/src/label_android_property.c (later added upstream)
diff --git a/include/selinux/android.h b/include/selinux/android.h
deleted file mode 100644
index 21a41a0..0000000
--- a/include/selinux/android.h
+++ /dev/null
@@ -1,56 +0,0 @@
-#ifndef _SELINUX_ANDROID_H_
-#define _SELINUX_ANDROID_H_
-
-#include <stdbool.h>
-#include <sys/types.h>
-#include <unistd.h>
-
-#include <selinux/label.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-extern struct selabel_handle* selinux_android_file_context_handle(void);
-
-extern struct selabel_handle* selinux_android_prop_context_handle(void);
-
-extern struct selabel_handle* selinux_android_service_context_handle(void);
-
-extern void selinux_android_set_sehandle(const struct selabel_handle *hndl);
-
-extern int selinux_android_load_policy(void);
-
-extern int selinux_android_setcon(const char *con);
-
-extern int selinux_android_setcontext(uid_t uid,
-				      bool isSystemServer,
-				      const char *seinfo,
-				      const char *name);
-
-extern int selinux_android_setfilecon(const char *pkgdir,
-				       const char *pkgname,
-				       const char *seinfo,
-				       uid_t uid);
-
-extern int selinux_log_callback(int type, const char *fmt, ...)
-    __attribute__ ((format(printf, 2, 3)));
-
-#define SELINUX_ANDROID_RESTORECON_NOCHANGE 1
-#define SELINUX_ANDROID_RESTORECON_VERBOSE  2
-#define SELINUX_ANDROID_RESTORECON_RECURSE  4
-#define SELINUX_ANDROID_RESTORECON_FORCE    8
-#define SELINUX_ANDROID_RESTORECON_DATADATA 16
-extern int selinux_android_restorecon(const char *file, unsigned int flags);
-
-extern int selinux_android_restorecon_pkgdir(const char *pkgdir,
-                                             const char *seinfo,
-                                             uid_t uid,
-                                             unsigned int flags);
-
-extern int selinux_android_seapp_context_reload(void);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/include/selinux/avc.h b/include/selinux/avc.h
deleted file mode 100644
index 8a1a6df..0000000
--- a/include/selinux/avc.h
+++ /dev/null
@@ -1,507 +0,0 @@
-/*
- * Access vector cache interface for object managers.
- *
- * Author : Eamon Walsh <ewalsh@epoch.ncsc.mil>
- */
-#ifndef _SELINUX_AVC_H_
-#define _SELINUX_AVC_H_
-
-#include <stdint.h>
-#include <errno.h>
-#include <stdlib.h>
-#include <selinux/selinux.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * SID format and operations
- */
-struct security_id {
-	char * ctx;
-	unsigned int refcnt;
-};
-typedef struct security_id *security_id_t;
-
-#define SECSID_WILD (security_id_t)NULL	/* unspecified SID */
-
-/**
- * avc_sid_to_context - get copy of context corresponding to SID.
- * @sid: input SID
- * @ctx: pointer to context reference
- *
- * Return a copy of the security context corresponding to the input
- * @sid in the memory referenced by @ctx.  The caller is expected to 
- * free the context with freecon().  Return %0 on success, -%1 on
- * failure, with @errno set to %ENOMEM if insufficient memory was
- * available to make the copy, or %EINVAL if the input SID is invalid.
- */
-int avc_sid_to_context(security_id_t sid, char ** ctx);
-int avc_sid_to_context_raw(security_id_t sid, char ** ctx);
-
-/**
- * avc_context_to_sid - get SID for context.
- * @ctx: input security context
- * @sid: pointer to SID reference
- *
- * Look up security context @ctx in SID table, making
- * a new entry if @ctx is not found.  Increment the
- * reference counter for the SID.  Store a pointer
- * to the SID structure into the memory referenced by @sid, 
- * returning %0 on success or -%1 on error with @errno set.  
- */
-int avc_context_to_sid(const char * ctx, security_id_t * sid);
-int avc_context_to_sid_raw(const char * ctx, security_id_t * sid);
-
-/**
- * sidget - increment SID reference counter.
- * @sid: SID reference
- *
- * Increment the reference counter for @sid, indicating that
- * @sid is in use by an (additional) object.  Return the
- * new reference count, or zero if @sid is invalid (has zero
- * reference count).  Note that avc_context_to_sid() also
- * increments reference counts.
- */
-int sidget(security_id_t sid);
-
-/**
- * sidput - decrement SID reference counter.
- * @sid: SID reference
- *
- * Decrement the reference counter for @sid, indicating that
- * a reference to @sid is no longer in use.  Return the 
- * new reference count.  When the reference count reaches
- * zero, the SID is invalid, and avc_context_to_sid() must
- * be called to obtain a new SID for the security context.
- */
-int sidput(security_id_t sid);
-
-/**
- * avc_get_initial_sid - get SID for an initial kernel security identifier
- * @name: input name of initial kernel security identifier
- * @sid: pointer to a SID reference
- *
- * Get the context for an initial kernel security identifier specified by 
- * @name using security_get_initial_context() and then call 
- * avc_context_to_sid() to get the corresponding SID.
- */
-int avc_get_initial_sid(const char *name, security_id_t * sid);
-
-/*
- * AVC entry
- */
-struct avc_entry;
-struct avc_entry_ref {
-	struct avc_entry *ae;
-};
-
-/**
- * avc_entry_ref_init - initialize an AVC entry reference.
- * @aeref: pointer to avc entry reference structure
- *
- * Use this macro to initialize an avc entry reference structure
- * before first use.  These structures are passed to avc_has_perm(),
- * which stores cache entry references in them.  They can increase
- * performance on repeated queries.
- */
-#define avc_entry_ref_init(aeref) ((aeref)->ae = NULL)
-
-/*
- * User-provided callbacks for memory, auditing, and locking
- */
-
-/* These structures are passed by reference to avc_init().  Passing
- * a NULL reference will cause the AVC to use a default.  The default
- * memory callbacks are malloc() and free().  The default logging method
- * is to print on stderr.  If no thread callbacks are passed, a separate
- * listening thread won't be started for kernel policy change messages.
- * If no locking callbacks are passed, no locking will take place.
- */
-struct avc_memory_callback {
-	/* malloc() equivalent. */
-	void *(*func_malloc) (size_t size);
-	/* free() equivalent. */
-	void (*func_free) (void *ptr);
-	/* Note that these functions should set errno on failure.
-	   If not, some avc routines may return -1 without errno set. */
-};
-
-struct avc_log_callback {
-	/* log the printf-style format and arguments. */
-	void (*func_log) (const char *fmt, ...);
-	/* store a string representation of auditdata (corresponding
-	   to the given security class) into msgbuf. */
-	void (*func_audit) (void *auditdata, security_class_t cls,
-			    char *msgbuf, size_t msgbufsize);
-};
-
-struct avc_thread_callback {
-	/* create and start a thread, returning an opaque pointer to it; 
-	   the thread should run the given function. */
-	void *(*func_create_thread) (void (*run) (void));
-	/* cancel a given thread and free its resources. */
-	void (*func_stop_thread) (void *thread);
-};
-
-struct avc_lock_callback {
-	/* create a lock and return an opaque pointer to it. */
-	void *(*func_alloc_lock) (void);
-	/* obtain a given lock, blocking if necessary. */
-	void (*func_get_lock) (void *lock);
-	/* release a given lock. */
-	void (*func_release_lock) (void *lock);
-	/* destroy a given lock (free memory, etc.) */
-	void (*func_free_lock) (void *lock);
-};
-
-/*
- * Available options
- */
-
-/* no-op option, useful for unused slots in an array of options */
-#define AVC_OPT_UNUSED		0
-/* override kernel enforcing mode (boolean value) */
-#define AVC_OPT_SETENFORCE	1
-
-/*
- * AVC operations
- */
-
-/**
- * avc_init - Initialize the AVC.
- * @msgprefix: prefix for log messages
- * @mem_callbacks: user-supplied memory callbacks
- * @log_callbacks: user-supplied logging callbacks
- * @thread_callbacks: user-supplied threading callbacks
- * @lock_callbacks: user-supplied locking callbacks
- *
- * Initialize the access vector cache.  Return %0 on
- * success or -%1 with @errno set on failure.  
- * If @msgprefix is NULL, use "uavc".  If any callback 
- * structure references are NULL, use default methods 
- * for those callbacks (see the definition of the callback
- * structures above).
- */
-int avc_init(const char *msgprefix,
-	     const struct avc_memory_callback *mem_callbacks,
-	     const struct avc_log_callback *log_callbacks,
-	     const struct avc_thread_callback *thread_callbacks,
-	     const struct avc_lock_callback *lock_callbacks);
-
-/**
- * avc_open - Initialize the AVC.
- * @opts: array of selabel_opt structures specifying AVC options or NULL.
- * @nopts: number of elements in opts array or zero for no options.
- *
- * This function is identical to avc_init(), except the message prefix
- * is set to "avc" and any callbacks desired should be specified via
- * selinux_set_callback().  Available options are listed above.
- */
-int avc_open(struct selinux_opt *opts, unsigned nopts);
-
-/**
- * avc_cleanup - Remove unused SIDs and AVC entries.
- *
- * Search the SID table for SID structures with zero
- * reference counts, and remove them along with all
- * AVC entries that reference them.  This can be used
- * to return memory to the system.
- */
-void avc_cleanup(void);
-
-/**
- * avc_reset - Flush the cache and reset statistics.
- *
- * Remove all entries from the cache and reset all access
- * statistics (as returned by avc_cache_stats()) to zero.
- * The SID mapping is not affected.  Return %0 on success, 
- * -%1 with @errno set on error.
- */
-int avc_reset(void);
-
-/**
- * avc_destroy - Free all AVC structures.
- *
- * Destroy all AVC structures and free all allocated
- * memory.  User-supplied locking, memory, and audit
- * callbacks will be retained, but security-event
- * callbacks will not.  All SID's will be invalidated.
- * User must call avc_init() if further use of AVC is desired.
- */
-void avc_destroy(void);
-
-/**
- * avc_has_perm_noaudit - Check permissions but perform no auditing.
- * @ssid: source security identifier
- * @tsid: target security identifier
- * @tclass: target security class
- * @requested: requested permissions, interpreted based on @tclass
- * @aeref:  AVC entry reference
- * @avd: access vector decisions
- *
- * Check the AVC to determine whether the @requested permissions are granted
- * for the SID pair (@ssid, @tsid), interpreting the permissions
- * based on @tclass, and call the security server on a cache miss to obtain
- * a new decision and add it to the cache.  Update @aeref to refer to an AVC
- * entry with the resulting decisions, and return a copy of the decisions
- * in @avd.  Return %0 if all @requested permissions are granted, -%1 with
- * @errno set to %EACCES if any permissions are denied, or to another value
- * upon other errors.  This function is typically called by avc_has_perm(),
- * but may also be called directly to separate permission checking from
- * auditing, e.g. in cases where a lock must be held for the check but
- * should be released for the auditing.
- */
-int avc_has_perm_noaudit(security_id_t ssid,
-			 security_id_t tsid,
-			 security_class_t tclass,
-			 access_vector_t requested,
-			 struct avc_entry_ref *aeref, struct av_decision *avd);
-
-/**
- * avc_has_perm - Check permissions and perform any appropriate auditing.
- * @ssid: source security identifier
- * @tsid: target security identifier
- * @tclass: target security class
- * @requested: requested permissions, interpreted based on @tclass
- * @aeref:  AVC entry reference
- * @auditdata: auxiliary audit data
- *
- * Check the AVC to determine whether the @requested permissions are granted
- * for the SID pair (@ssid, @tsid), interpreting the permissions
- * based on @tclass, and call the security server on a cache miss to obtain
- * a new decision and add it to the cache.  Update @aeref to refer to an AVC
- * entry with the resulting decisions.  Audit the granting or denial of
- * permissions in accordance with the policy.  Return %0 if all @requested
- * permissions are granted, -%1 with @errno set to %EACCES if any permissions
- * are denied or to another value upon other errors.
- */
-int avc_has_perm(security_id_t ssid, security_id_t tsid,
-		 security_class_t tclass, access_vector_t requested,
-		 struct avc_entry_ref *aeref, void *auditdata);
-
-/**
- * avc_audit - Audit the granting or denial of permissions.
- * @ssid: source security identifier
- * @tsid: target security identifier
- * @tclass: target security class
- * @requested: requested permissions
- * @avd: access vector decisions
- * @result: result from avc_has_perm_noaudit
- * @auditdata:  auxiliary audit data
- *
- * Audit the granting or denial of permissions in accordance
- * with the policy.  This function is typically called by
- * avc_has_perm() after a permission check, but can also be
- * called directly by callers who use avc_has_perm_noaudit()
- * in order to separate the permission check from the auditing.
- * For example, this separation is useful when the permission check must
- * be performed under a lock, to allow the lock to be released
- * before calling the auditing code.
- */
-void avc_audit(security_id_t ssid, security_id_t tsid,
-	       security_class_t tclass, access_vector_t requested,
-	       struct av_decision *avd, int result, void *auditdata);
-
-/**
- * avc_compute_create - Compute SID for labeling a new object.
- * @ssid: source security identifier
- * @tsid: target security identifier
- * @tclass: target security class
- * @newsid: pointer to SID reference
- *
- * Call the security server to obtain a context for labeling a
- * new object.  Look up the context in the SID table, making
- * a new entry if not found.  Increment the reference counter
- * for the SID.  Store a pointer to the SID structure into the
- * memory referenced by @newsid, returning %0 on success or -%1 on
- * error with @errno set.  
- */
-int avc_compute_create(security_id_t ssid,
-		       security_id_t tsid,
-		       security_class_t tclass, security_id_t * newsid);
-
-/**
- * avc_compute_member - Compute SID for polyinstantation.
- * @ssid: source security identifier
- * @tsid: target security identifier
- * @tclass: target security class
- * @newsid: pointer to SID reference
- *
- * Call the security server to obtain a context for labeling an
- * object instance.  Look up the context in the SID table, making
- * a new entry if not found.  Increment the reference counter
- * for the SID.  Store a pointer to the SID structure into the
- * memory referenced by @newsid, returning %0 on success or -%1 on
- * error with @errno set.  
- */
-int avc_compute_member(security_id_t ssid,
-		       security_id_t tsid,
-		       security_class_t tclass, security_id_t * newsid);
-
-/* 
- * security event callback facility
- */
-
-/* security events */
-#define AVC_CALLBACK_GRANT		1
-#define AVC_CALLBACK_TRY_REVOKE		2
-#define AVC_CALLBACK_REVOKE		4
-#define AVC_CALLBACK_RESET		8
-#define AVC_CALLBACK_AUDITALLOW_ENABLE	16
-#define AVC_CALLBACK_AUDITALLOW_DISABLE	32
-#define AVC_CALLBACK_AUDITDENY_ENABLE	64
-#define AVC_CALLBACK_AUDITDENY_DISABLE	128
-
-/**
- * avc_add_callback - Register a callback for security events.
- * @callback: callback function
- * @events: bitwise OR of desired security events
- * @ssid: source security identifier or %SECSID_WILD
- * @tsid: target security identifier or %SECSID_WILD
- * @tclass: target security class
- * @perms: permissions
- *
- * Register a callback function for events in the set @events
- * related to the SID pair (@ssid, @tsid) and
- * and the permissions @perms, interpreting
- * @perms based on @tclass.  Returns %0 on success or
- * -%1 if insufficient memory exists to add the callback.
- */
-int avc_add_callback(int (*callback)
-		      (uint32_t event, security_id_t ssid,
-		       security_id_t tsid, security_class_t tclass,
-		       access_vector_t perms,
-		       access_vector_t * out_retained),
-		     uint32_t events, security_id_t ssid,
-		     security_id_t tsid, security_class_t tclass,
-		     access_vector_t perms);
-
-/*
- * AVC statistics 
- */
-
-/* If set, cache statistics are tracked.  This may
- * become a compile-time option in the future.
- */
-#define AVC_CACHE_STATS     1
-
-struct avc_cache_stats {
-	unsigned entry_lookups;
-	unsigned entry_hits;
-	unsigned entry_misses;
-	unsigned entry_discards;
-	unsigned cav_lookups;
-	unsigned cav_hits;
-	unsigned cav_probes;
-	unsigned cav_misses;
-};
-
-/**
- * avc_cache_stats - get cache access statistics.
- * @stats: reference to statistics structure
- *
- * Fill the supplied structure with information about AVC 
- * activity since the last call to avc_init() or
- * avc_reset().  See the structure definition for
- * details.
- */
-void avc_cache_stats(struct avc_cache_stats *stats);
-
-/**
- * avc_av_stats - log av table statistics.
- *
- * Log a message with information about the size and
- * distribution of the access vector table.  The audit
- * callback is used to print the message.
- */
-void avc_av_stats(void);
-
-/**
- * avc_sid_stats - log SID table statistics.
- *
- * Log a message with information about the size and
- * distribution of the SID table.  The audit callback
- * is used to print the message.
- */
-void avc_sid_stats(void);
-
-/**
- * avc_netlink_open - Create a netlink socket and connect to the kernel.
- */
-int avc_netlink_open(int blocking);
-
-/**
- * avc_netlink_loop - Wait for netlink messages from the kernel
- */
-void avc_netlink_loop(void);
-
-/**
- * avc_netlink_close - Close the netlink socket
- */
-void avc_netlink_close(void);
-
-/**
- * avc_netlink_acquire_fd - Acquire netlink socket fd.
- *
- * Allows the application to manage messages from the netlink socket in
- * its own main loop.
- */
-int avc_netlink_acquire_fd(void);
-
-/**
- * avc_netlink_release_fd - Release netlink socket fd.
- *
- * Returns ownership of the netlink socket to the library.
- */
-void avc_netlink_release_fd(void);
-
-/**
- * avc_netlink_check_nb - Check netlink socket for new messages.
- *
- * Called by the application when using avc_netlink_acquire_fd() to
- * process kernel netlink events.
- */
-int avc_netlink_check_nb(void);
-
-/**
- * selinux_status_open - Open and map SELinux kernel status page
- *
- */
-int selinux_status_open(int fallback);
-
-/**
- * selinux_status_close - Unmap and close SELinux kernel status page
- *
- */
-void selinux_status_close(void);
-
-/**
- * selinux_status_updated - Inform us whether the kernel status has been updated
- *
- */
-int selinux_status_updated(void);
-
-/**
- * selinux_status_getenforce - Get the enforce flag value
- *
- */
-int selinux_status_getenforce(void);
-
-/**
- * selinux_status_policyload - Get the number of policy reloaded
- *
- */
-int selinux_status_policyload(void);
-
-/**
- * selinux_status_deny_unknown - Get the  behavior for undefined classes/permissions
- *
- */
-int selinux_status_deny_unknown(void);
-
-#ifdef __cplusplus
-}
-#endif
-#endif				/* _SELINUX_AVC_H_ */
diff --git a/include/selinux/context.h b/include/selinux/context.h
deleted file mode 100644
index 949fb1e..0000000
--- a/include/selinux/context.h
+++ /dev/null
@@ -1,50 +0,0 @@
-#ifndef _SELINUX_CONTEXT_H_
-#define _SELINUX_CONTEXT_H_
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Functions to deal with security contexts in user space.
- */
-
-	typedef struct {
-		void *ptr;
-	} context_s_t;
-
-	typedef context_s_t *context_t;
-
-/* Return a new context initialized to a context string */
-
-	extern context_t context_new(const char *);
-
-/* 
- * Return a pointer to the string value of the context_t
- * Valid until the next call to context_str or context_free 
- * for the same context_t*
- */
-
-	extern char *context_str(context_t);
-
-/* Free the storage used by a context */
-	extern void context_free(context_t);
-
-/* Get a pointer to the string value of a context component */
-
-	extern const char *context_type_get(context_t);
-	extern const char *context_range_get(context_t);
-	extern const char *context_role_get(context_t);
-	extern const char *context_user_get(context_t);
-
-/* Set a context component.  Returns nonzero if unsuccessful */
-
-	extern int context_type_set(context_t, const char *);
-	extern int context_range_set(context_t, const char *);
-	extern int context_role_set(context_t, const char *);
-	extern int context_user_set(context_t, const char *);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/include/selinux/label.h b/include/selinux/label.h
deleted file mode 100644
index 07eff74..0000000
--- a/include/selinux/label.h
+++ /dev/null
@@ -1,167 +0,0 @@
-/*
- * Labeling interface for userspace object managers and others.
- *
- * Author : Eamon Walsh <ewalsh@tycho.nsa.gov>
- */
-#ifndef _SELABEL_H_
-#define _SELABEL_H_
-
-#include <stdbool.h>
-#include <sys/types.h>
-#include <selinux/selinux.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/*
- * Opaque type used for all label handles.
- */
-
-struct selabel_handle;
-
-/* 
- * Available backends.
- */
-
-/* file contexts */
-#define SELABEL_CTX_FILE	0
-/* media contexts */
-#define SELABEL_CTX_MEDIA	1
-/* x contexts */
-#define SELABEL_CTX_X		2
-/* db objects */
-#define SELABEL_CTX_DB		3
-/* Android property contexts */
-#define SELABEL_CTX_ANDROID_PROP 4
-/* Android service contexts */
-#define SELABEL_CTX_ANDROID_SERVICE 5
-
-/*
- * Available options
- */
-
-/* no-op option, useful for unused slots in an array of options */
-#define SELABEL_OPT_UNUSED	0
-/* validate contexts before returning them (boolean value) */
-#define SELABEL_OPT_VALIDATE	1
-/* don't use local customizations to backend data (boolean value) */
-#define SELABEL_OPT_BASEONLY	2
-/* specify an alternate path to use when loading backend data */
-#define SELABEL_OPT_PATH	3
-/* select a subset of the search space as an optimization (file backend) */
-#define SELABEL_OPT_SUBSET	4
-/* total number of options */
-#define SELABEL_NOPT		5
-
-/*
- * Label operations
- */
-
-/**
- * selabel_open - Create a labeling handle.
- * @backend: one of the constants specifying a supported labeling backend.
- * @opts: array of selabel_opt structures specifying label options or NULL.
- * @nopts: number of elements in opts array or zero for no options.
- *
- * Open a labeling backend for use.  The available backend identifiers are
- * listed above.  Options may be provided via the opts parameter; available
- * options are listed above.  Not all options may be supported by every
- * backend.  Return value is the created handle on success or NULL with
- * @errno set on failure.
- */
-struct selabel_handle *selabel_open(unsigned int backend,
-				    const struct selinux_opt *opts,
-				    unsigned nopts);
-
-/**
- * selabel_close - Close a labeling handle.
- * @handle: specifies handle to close
- *
- * Destroy the specified handle, closing files, freeing allocated memory,
- * etc.  The handle may not be further used after it has been closed.
- */
-void selabel_close(struct selabel_handle *handle);
-
-/**
- * selabel_lookup - Perform labeling lookup operation.
- * @handle: specifies backend instance to query
- * @con: returns the appropriate context with which to label the object
- * @key: string input to lookup operation
- * @type: numeric input to the lookup operation
- *
- * Perform a labeling lookup operation.  Return %0 on success, -%1 with
- * @errno set on failure.  The key and type arguments are the inputs to the
- * lookup operation; appropriate values are dictated by the backend in use.
- * The result is returned in the memory pointed to by @con and must be freed
- * by the user with freecon().
- */
-int selabel_lookup(struct selabel_handle *handle, char **con,
-		   const char *key, int type);
-int selabel_lookup_raw(struct selabel_handle *handle, char **con,
-		       const char *key, int type);
-
-bool selabel_partial_match(struct selabel_handle *handle, const char *key);
-
-int selabel_lookup_best_match(struct selabel_handle *rec, char **con,
-			      const char *key, const char **aliases, int type);
-
-enum selabel_cmp_result {
-	SELABEL_SUBSET,
-	SELABEL_EQUAL,
-	SELABEL_SUPERSET,
-	SELABEL_INCOMPARABLE
-};
-
-/**
- * selabel_cmp - Compare two label configurations.
- * @h1: handle for the first label configuration
- * @h2: handle for the first label configuration
- *
- * Compare two label configurations.
- * Return %SELABEL_SUBSET if @h1 is a subset of @h2, %SELABEL_EQUAL
- * if @h1 is identical to @h2, %SELABEL_SUPERSET if @h1 is a superset
- * of @h2, and %SELABEL_INCOMPARABLE if @h1 and @h2 are incomparable.
- */
-enum selabel_cmp_result selabel_cmp(struct selabel_handle *h1,
-				    struct selabel_handle *h2);
-
-/**
- * selabel_stats - log labeling operation statistics.
- * @handle: specifies backend instance to query
- *
- * Log a message with information about the number of queries performed,
- * number of unused matching entries, or other operational statistics.
- * Message is backend-specific, some backends may not output a message.
- */
-void selabel_stats(struct selabel_handle *handle);
-
-/*
- * Type codes used by specific backends
- */
-
-/* X backend */
-#define SELABEL_X_PROP		1
-#define SELABEL_X_EXT		2
-#define SELABEL_X_CLIENT	3
-#define SELABEL_X_EVENT		4
-#define SELABEL_X_SELN		5
-#define SELABEL_X_POLYPROP	6
-#define SELABEL_X_POLYSELN	7
-
-/* DB backend */
-#define SELABEL_DB_DATABASE	1
-#define SELABEL_DB_SCHEMA	2
-#define SELABEL_DB_TABLE	3
-#define SELABEL_DB_COLUMN	4
-#define SELABEL_DB_SEQUENCE	5
-#define SELABEL_DB_VIEW		6
-#define SELABEL_DB_PROCEDURE	7
-#define SELABEL_DB_BLOB		8
-#define SELABEL_DB_TUPLE	9
-#define SELABEL_DB_LANGUAGE	10
-
-#ifdef __cplusplus
-}
-#endif
-#endif	/* _SELABEL_H_ */
diff --git a/include/selinux/selinux.h b/include/selinux/selinux.h
deleted file mode 100644
index 8827da8..0000000
--- a/include/selinux/selinux.h
+++ /dev/null
@@ -1,291 +0,0 @@
-#ifndef _SELINUX_H_
-#define _SELINUX_H_
-
-#include <sys/types.h>
-#include <stdarg.h>
-
-#ifdef __cplusplus
-extern "C" {
-#endif
-
-/* Return 1 if we are running on a SELinux kernel, or 0 if not or -1 if we get an error. */
-extern int is_selinux_enabled(void);
-/* Return 1 if we are running on a SELinux MLS kernel, or 0 otherwise. */
-extern int is_selinux_mls_enabled(void);
-
-/* No longer used; here for compatibility with legacy callers. */
-typedef char *security_context_t;
-
-/* Free the memory allocated for a context by any of the below get* calls. */
-extern void freecon(char * con);
-
-/* Free the memory allocated for a context array by security_compute_user. */
-extern void freeconary(char ** con);
-
-/* Wrappers for the /proc/pid/attr API. */
-
-/* Get current context, and set *con to refer to it.
-   Caller must free via freecon. */
-extern int getcon(char ** con);
-
-/* Set the current security context to con.  
-   Note that use of this function requires that the entire application
-   be trusted to maintain any desired separation between the old and new 
-   security contexts, unlike exec-based transitions performed via setexeccon.  
-   When possible, decompose your application and use setexeccon()+execve() 
-   instead. Note that the application may lose access to its open descriptors
-   as a result of a setcon() unless policy allows it to use descriptors opened
-   by the old context. */
-extern int setcon(const char * con);
-
-/* Get context of process identified by pid, and 
-   set *con to refer to it.  Caller must free via freecon. */
-extern int getpidcon(pid_t pid, char ** con);
-
-/* Get previous context (prior to last exec), and set *con to refer to it.
-   Caller must free via freecon. */
-extern int getprevcon(char ** con);
-
-/* Get exec context, and set *con to refer to it.
-   Sets *con to NULL if no exec context has been set, i.e. using default.
-   If non-NULL, caller must free via freecon. */
-extern int getexeccon(char ** con);
-
-/* Set exec security context for the next execve. 
-   Call with NULL if you want to reset to the default. */
-extern int setexeccon(const char * con);
-
-/* Get fscreate context, and set *con to refer to it.
-   Sets *con to NULL if no fs create context has been set, i.e. using default.
-   If non-NULL, caller must free via freecon. */
-extern int getfscreatecon(char ** con);
-
-/* Set the fscreate security context for subsequent file creations.
-   Call with NULL if you want to reset to the default. */
-extern int setfscreatecon(const char * context);
-
-/* Get keycreate context, and set *con to refer to it.
-   Sets *con to NULL if no key create context has been set, i.e. using default.
-   If non-NULL, caller must free via freecon. */
-extern int getkeycreatecon(char ** con);
-
-/* Set the keycreate security context for subsequent key creations.
-   Call with NULL if you want to reset to the default. */
-extern int setkeycreatecon(const char * context);
-
-/* Get sockcreate context, and set *con to refer to it.
-   Sets *con to NULL if no socket create context has been set, i.e. using default.
-   If non-NULL, caller must free via freecon. */
-extern int getsockcreatecon(char ** con);
-
-/* Set the sockcreate security context for subsequent socket creations.
-   Call with NULL if you want to reset to the default. */
-extern int setsockcreatecon(const char * context);
-
-/* Wrappers for the xattr API. */
-
-/* Get file context, and set *con to refer to it.
-   Caller must free via freecon. */
-extern int getfilecon(const char *path, char ** con);
-extern int lgetfilecon(const char *path, char ** con);
-extern int fgetfilecon(int fd, char ** con);
-
-/* Set file context */
-extern int setfilecon(const char *path, const char *con);
-extern int lsetfilecon(const char *path, const char *con);
-extern int fsetfilecon(int fd, const char *con);
-
-/* Wrappers for the socket API */
-
-/* Get context of peer socket, and set *con to refer to it.
-   Caller must free via freecon. */
-extern int getpeercon(int fd, char ** con);
-
-/* Wrappers for the selinuxfs (policy) API. */
-
-typedef unsigned int access_vector_t;
-typedef unsigned short security_class_t;
-
-struct av_decision {
-	access_vector_t allowed;
-	access_vector_t decided;
-	access_vector_t auditallow;
-	access_vector_t auditdeny;
-	unsigned int seqno;
-	unsigned int flags;
-};
-
-/* Definitions of av_decision.flags */
-#define SELINUX_AVD_FLAGS_PERMISSIVE	0x0001
-
-/* Structure for passing options, used by AVC and label subsystems */
-struct selinux_opt {
-	int type;
-	const char *value;
-};
-
-/* Callback facilities */
-union selinux_callback {
-	/* log the printf-style format and arguments,
-	   with the type code indicating the type of message */
-	int 
-#ifdef __GNUC__
-__attribute__ ((format(printf, 2, 3)))
-#endif
-	(*func_log) (int type, const char *fmt, ...);
-	/* store a string representation of auditdata (corresponding
-	   to the given security class) into msgbuf. */
-	int (*func_audit) (void *auditdata, security_class_t cls,
-			   char *msgbuf, size_t msgbufsize);
-	/* validate the supplied context, modifying if necessary */
-	int (*func_validate) (char **ctx);
-	/* netlink callback for setenforce message */
-	int (*func_setenforce) (int enforcing);
-	/* netlink callback for policyload message */
-	int (*func_policyload) (int seqno);
-};
-
-#define SELINUX_CB_LOG		0
-#define SELINUX_CB_AUDIT	1
-#define SELINUX_CB_VALIDATE	2
-#define SELINUX_CB_SETENFORCE	3
-#define SELINUX_CB_POLICYLOAD	4
-
-extern union selinux_callback selinux_get_callback(int type);
-extern void selinux_set_callback(int type, union selinux_callback cb);
-
-	/* Logging type codes, passed to the logging callback */
-#define SELINUX_ERROR	        0
-#define SELINUX_WARNING		1
-#define SELINUX_INFO		2
-#define SELINUX_AVC		3
-
-/* Compute an access decision. */
-extern int security_compute_av(const char * scon,
-			       const char * tcon,
-			       security_class_t tclass,
-			       access_vector_t requested,
-			       struct av_decision *avd);
-
-/* Compute a labeling decision and set *newcon to refer to it.
-   Caller must free via freecon. */
-extern int security_compute_create(const char * scon,
-				   const char * tcon,
-				   security_class_t tclass,
-				   char ** newcon);
-
-/* Compute a relabeling decision and set *newcon to refer to it.
-   Caller must free via freecon. */
-extern int security_compute_relabel(const char * scon,
-				    const char * tcon,
-				    security_class_t tclass,
-				    char ** newcon);
-
-/* Compute a polyinstantiation member decision and set *newcon to refer to it.
-   Caller must free via freecon. */
-extern int security_compute_member(const char * scon,
-				   const char * tcon,
-				   security_class_t tclass,
-				   char ** newcon);
-
-/* Compute the set of reachable user contexts and set *con to refer to 
-   the NULL-terminated array of contexts.  Caller must free via freeconary. */
-extern int security_compute_user(const char * scon,
-				 const char *username,
-				 char *** con);
-
-/* Load a policy configuration. */
-extern int security_load_policy(void *data, size_t len);
-
-/* Get the context of an initial kernel security identifier by name.  
-   Caller must free via freecon */
-extern int security_get_initial_context(const char *name,
-					char ** con);
-
-/* Translate boolean strict to name value pair. */
-typedef struct {
-	const char *name;
-	int value;
-} SELboolean;
-/* save a list of booleans in a single transaction.  */
-extern int security_set_boolean_list(size_t boolcnt,
-				     SELboolean * const boollist, int permanent);
-
-/* Check the validity of a security context. */
-extern int security_check_context(const char * con);
-
-/* Canonicalize a security context. */
-extern int security_canonicalize_context(const char * con,
-					 char ** canoncon);
-
-/* Get the enforce flag value. */
-extern int security_getenforce(void);
-
-/* Set the enforce flag value. */
-extern int security_setenforce(int value);
-
-/* Get the behavior for undefined classes/permissions */
-extern int security_deny_unknown(void);
-
-/* Disable SELinux at runtime (must be done prior to initial policy load). */
-extern int security_disable(void);
-
-/* Get the policy version number. */
-extern int security_policyvers(void);
-
-/* Get the boolean names */
-extern int security_get_boolean_names(char ***names, int *len);
-
-/* Get the pending value for the boolean */
-extern int security_get_boolean_pending(const char *name);
-
-/* Get the active value for the boolean */
-extern int security_get_boolean_active(const char *name);
-
-/* Set the pending value for the boolean */
-extern int security_set_boolean(const char *name, int value);
-
-/* Commit the pending values for the booleans */
-extern int security_commit_booleans(void);
-
-/* Userspace class mapping support */
-struct security_class_mapping {
-	const char *name;
-	const char *perms[sizeof(access_vector_t) * 8 + 1];
-};
-
-extern int selinux_set_mapping(struct security_class_mapping *map);
-
-/* Common helpers */
-
-/* Convert between security class values and string names */
-extern security_class_t string_to_security_class(const char *name);
-extern const char *security_class_to_string(security_class_t cls);
-
-/* Convert between individual access vector permissions and string names */
-extern const char *security_av_perm_to_string(security_class_t tclass,
-					      access_vector_t perm);
-extern access_vector_t string_to_av_perm(security_class_t tclass,
-					 const char *name);
-
-/* Returns an access vector in a string representation.  User must free the
- * returned string via free(). */
-extern int security_av_string(security_class_t tclass,
-			      access_vector_t av, char **result);
-
-/* Check permissions and perform appropriate auditing. */
-extern int selinux_check_access(const char * scon,
-				const char * tcon,
-				const char *tclass,
-				const char *perm, void *aux);
-
-/* Set the path to the selinuxfs mount point explicitly.
-   Normally, this is determined automatically during libselinux 
-   initialization, but this is not always possible, e.g. for /sbin/init
-   which performs the initial mount of selinuxfs. */
-void set_selinuxmnt(const char *mnt);
-
-#ifdef __cplusplus
-}
-#endif
-#endif
diff --git a/src/android.c b/src/android.c
deleted file mode 100644
index ff3a277..0000000
--- a/src/android.c
+++ /dev/null
@@ -1,1538 +0,0 @@
-#include <sys/types.h>
-#include <unistd.h>
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdbool.h>
-#include <ctype.h>
-#include <errno.h>
-#include <pwd.h>
-#include <grp.h>
-#include <sys/mman.h>
-#include <sys/mount.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/xattr.h>
-#include <fcntl.h>
-#include <fts.h>
-#include <selinux/selinux.h>
-#include <selinux/context.h>
-#include <selinux/android.h>
-#include <selinux/label.h>
-#include <selinux/avc.h>
-#include <openssl/sha.h>
-#include <private/android_filesystem_config.h>
-#include <log/log.h>
-#include "policy.h"
-#include "callbacks.h"
-#include "selinux_internal.h"
-#include "label_internal.h"
-#include <fnmatch.h>
-#include <limits.h>
-#include <sys/vfs.h>
-#include <linux/magic.h>
-#include <libgen.h>
-#include <packagelistparser/packagelistparser.h>
-
-#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
-#include <sys/_system_properties.h>
-
-/*
- * XXX Where should this configuration file be located?
- * Needs to be accessible by zygote and installd when
- * setting credentials for app processes and setting permissions
- * on app data directories.
- */
-static char const * const seapp_contexts_file = "/seapp_contexts";
-
-static const struct selinux_opt seopts =
-    { SELABEL_OPT_PATH, "/file_contexts.bin" };
-
-static const char *const sepolicy_file = "/sepolicy";
-
-static const struct selinux_opt seopts_prop =
-    { SELABEL_OPT_PATH, "/property_contexts" };
-
-static const struct selinux_opt seopts_service =
-    { SELABEL_OPT_PATH, "/service_contexts" };
-
-enum levelFrom {
-	LEVELFROM_NONE,
-	LEVELFROM_APP,
-	LEVELFROM_USER,
-	LEVELFROM_ALL
-};
-
-#if DEBUG
-static char const * const levelFromName[] = {
-	"none",
-	"app",
-	"user",
-	"all"
-};
-#endif
-
-struct prefix_str {
-	size_t len;
-	char *str;
-	char is_prefix;
-};
-
-static void free_prefix_str(struct prefix_str *p)
-{
-	if (!p)
-		return;
-	free(p->str);
-}
-
-struct seapp_context {
-	/* input selectors */
-	bool isSystemServer;
-	bool isEphemeralAppSet;
-	bool isEphemeralApp;
-	bool isOwnerSet;
-	bool isOwner;
-	struct prefix_str user;
-	char *seinfo;
-	struct prefix_str name;
-	struct prefix_str path;
-	bool isPrivAppSet;
-	bool isPrivApp;
-	/* outputs */
-	char *domain;
-	char *type;
-	char *level;
-	enum levelFrom levelFrom;
-};
-
-static void free_seapp_context(struct seapp_context *s)
-{
-	if (!s)
-		return;
-
-	free_prefix_str(&s->user);
-	free(s->seinfo);
-	free_prefix_str(&s->name);
-	free_prefix_str(&s->path);
-	free(s->domain);
-	free(s->type);
-	free(s->level);
-}
-
-static bool seapp_contexts_dup = false;
-
-static int seapp_context_cmp(const void *A, const void *B)
-{
-	const struct seapp_context *const *sp1 = (const struct seapp_context *const *) A;
-	const struct seapp_context *const *sp2 = (const struct seapp_context *const *) B;
-	const struct seapp_context *s1 = *sp1, *s2 = *sp2;
-	bool dup;
-
-	/* Give precedence to isSystemServer=true. */
-	if (s1->isSystemServer != s2->isSystemServer)
-		return (s1->isSystemServer ? -1 : 1);
-
-	/* Give precedence to a specified isEphemeral= over an
-	 * unspecified isEphemeral=. */
-	if (s1->isEphemeralAppSet != s2->isEphemeralAppSet)
-		return (s1->isEphemeralAppSet ? -1 : 1);
-
-
-	/* Give precedence to a specified isOwner= over an unspecified isOwner=. */
-	if (s1->isOwnerSet != s2->isOwnerSet)
-		return (s1->isOwnerSet ? -1 : 1);
-
-	/* Give precedence to a specified user= over an unspecified user=. */
-	if (s1->user.str && !s2->user.str)
-		return -1;
-	if (!s1->user.str && s2->user.str)
-		return 1;
-
-	if (s1->user.str) {
-		/* Give precedence to a fixed user= string over a prefix. */
-		if (s1->user.is_prefix != s2->user.is_prefix)
-			return (s2->user.is_prefix ? -1 : 1);
-
-		/* Give precedence to a longer prefix over a shorter prefix. */
-		if (s1->user.is_prefix && s1->user.len != s2->user.len)
-			return (s1->user.len > s2->user.len) ? -1 : 1;
-	}
-
-	/* Give precedence to a specified seinfo= over an unspecified seinfo=. */
-	if (s1->seinfo && !s2->seinfo)
-		return -1;
-	if (!s1->seinfo && s2->seinfo)
-		return 1;
-
-	/* Give precedence to a specified name= over an unspecified name=. */
-	if (s1->name.str && !s2->name.str)
-		return -1;
-	if (!s1->name.str && s2->name.str)
-		return 1;
-
-	if (s1->name.str) {
-		/* Give precedence to a fixed name= string over a prefix. */
-		if (s1->name.is_prefix != s2->name.is_prefix)
-			return (s2->name.is_prefix ? -1 : 1);
-
-		/* Give precedence to a longer prefix over a shorter prefix. */
-		if (s1->name.is_prefix && s1->name.len != s2->name.len)
-			return (s1->name.len > s2->name.len) ? -1 : 1;
-	}
-
-	/* Give precedence to a specified path= over an unspecified path=. */
-	if (s1->path.str && !s2->path.str)
-		return -1;
-	if (!s1->path.str && s2->path.str)
-		return 1;
-
-	if (s1->path.str) {
-		/* Give precedence to a fixed path= string over a prefix. */
-		if (s1->path.is_prefix != s2->path.is_prefix)
-			return (s2->path.is_prefix ? -1 : 1);
-
-		/* Give precedence to a longer prefix over a shorter prefix. */
-		if (s1->path.is_prefix && s1->path.len != s2->path.len)
-			return (s1->path.len > s2->path.len) ? -1 : 1;
-	}
-
-	/* Give precedence to a specified isPrivApp= over an unspecified isPrivApp=. */
-	if (s1->isPrivAppSet != s2->isPrivAppSet)
-		return (s1->isPrivAppSet ? -1 : 1);
-
-	/*
-	 * Check for a duplicated entry on the input selectors.
-	 * We already compared isSystemServer, isOwnerSet, and isOwner above.
-	 * We also have already checked that both entries specify the same
-	 * string fields, so if s1 has a non-NULL string, then so does s2.
-	 */
-	dup = (!s1->user.str || !strcmp(s1->user.str, s2->user.str)) &&
-		(!s1->seinfo || !strcmp(s1->seinfo, s2->seinfo)) &&
-		(!s1->name.str || !strcmp(s1->name.str, s2->name.str)) &&
-		(!s1->path.str || !strcmp(s1->path.str, s2->path.str));
-	if (dup) {
-		seapp_contexts_dup = true;
-		selinux_log(SELINUX_ERROR, "seapp_contexts:  Duplicated entry\n");
-		if (s1->user.str)
-			selinux_log(SELINUX_ERROR, " user=%s\n", s1->user.str);
-		if (s1->seinfo)
-			selinux_log(SELINUX_ERROR, " seinfo=%s\n", s1->seinfo);
-		if (s1->name.str)
-			selinux_log(SELINUX_ERROR, " name=%s\n", s1->name.str);
-		if (s1->path.str)
-			selinux_log(SELINUX_ERROR, " path=%s\n", s1->path.str);
-	}
-
-	/* Anything else has equal precedence. */
-	return 0;
-}
-
-static struct seapp_context **seapp_contexts = NULL;
-static int nspec = 0;
-
-static void free_seapp_contexts(void)
-{
-	int n;
-
-	if (!seapp_contexts)
-		return;
-
-	for (n = 0; n < nspec; n++)
-		free_seapp_context(seapp_contexts[n]);
-
-	free(seapp_contexts);
-	seapp_contexts = NULL;
-	nspec = 0;
-}
-
-int selinux_android_seapp_context_reload(void)
-{
-	FILE *fp = NULL;
-	char line_buf[BUFSIZ];
-	char *token;
-	unsigned lineno;
-	struct seapp_context *cur;
-	char *p, *name = NULL, *value = NULL, *saveptr;
-	size_t len;
-	int n, ret;
-
-	fp = fopen(seapp_contexts_file, "re");
-	if (!fp) {
-		selinux_log(SELINUX_ERROR, "%s:  could not open any seapp_contexts file", __FUNCTION__);
-		return -1;
-	}
-
-	free_seapp_contexts();
-
-	nspec = 0;
-	while (fgets(line_buf, sizeof line_buf - 1, fp)) {
-		p = line_buf;
-		while (isspace(*p))
-			p++;
-		if (*p == '#' || *p == 0)
-			continue;
-		nspec++;
-	}
-
-	seapp_contexts = (struct seapp_context **) calloc(nspec, sizeof(struct seapp_context *));
-	if (!seapp_contexts)
-		goto oom;
-
-	rewind(fp);
-	nspec = 0;
-	lineno = 1;
-	while (fgets(line_buf, sizeof line_buf - 1, fp)) {
-		len = strlen(line_buf);
-		if (line_buf[len - 1] == '\n')
-			line_buf[len - 1] = 0;
-		p = line_buf;
-		while (isspace(*p))
-			p++;
-		if (*p == '#' || *p == 0)
-			continue;
-
-		cur = (struct seapp_context *) calloc(1, sizeof(struct seapp_context));
-		if (!cur)
-			goto oom;
-
-		token = strtok_r(p, " \t", &saveptr);
-		if (!token) {
-			free_seapp_context(cur);
-			goto err;
-		}
-
-		while (1) {
-			name = token;
-			value = strchr(name, '=');
-			if (!value) {
-				free_seapp_context(cur);
-				goto err;
-			}
-			*value++ = 0;
-
-			if (!strcasecmp(name, "isSystemServer")) {
-				if (!strcasecmp(value, "true"))
-					cur->isSystemServer = true;
-				else if (!strcasecmp(value, "false"))
-					cur->isSystemServer = false;
-				else {
-					free_seapp_context(cur);
-					goto err;
-				}
-			} else if (!strcasecmp(name, "isEphemeralApp")) {
-				cur->isEphemeralAppSet = true;
-				if (!strcasecmp(value, "true"))
-					cur->isEphemeralApp = true;
-				else if (!strcasecmp(value, "false"))
-					cur->isEphemeralApp = false;
-				else {
-					free_seapp_context(cur);
-					goto err;
-				}
-			} else if (!strcasecmp(name, "isOwner")) {
-				cur->isOwnerSet = true;
-				if (!strcasecmp(value, "true"))
-					cur->isOwner = true;
-				else if (!strcasecmp(value, "false"))
-					cur->isOwner = false;
-				else {
-					free_seapp_context(cur);
-					goto err;
-				}
-			} else if (!strcasecmp(name, "user")) {
-				if (cur->user.str) {
-					free_seapp_context(cur);
-					goto err;
-				}
-				cur->user.str = strdup(value);
-				if (!cur->user.str) {
-					free_seapp_context(cur);
-					goto oom;
-				}
-				cur->user.len = strlen(cur->user.str);
-				if (cur->user.str[cur->user.len-1] == '*')
-					cur->user.is_prefix = 1;
-			} else if (!strcasecmp(name, "seinfo")) {
-				if (cur->seinfo) {
-					free_seapp_context(cur);
-					goto err;
-				}
-				cur->seinfo = strdup(value);
-				if (!cur->seinfo) {
-					free_seapp_context(cur);
-					goto oom;
-				}
-				if (strstr(value, ":")) {
-					free_seapp_context(cur);
-					goto err;
-				}
-			} else if (!strcasecmp(name, "name")) {
-				if (cur->name.str) {
-					free_seapp_context(cur);
-					goto err;
-				}
-				cur->name.str = strdup(value);
-				if (!cur->name.str) {
-					free_seapp_context(cur);
-					goto oom;
-				}
-				cur->name.len = strlen(cur->name.str);
-				if (cur->name.str[cur->name.len-1] == '*')
-					cur->name.is_prefix = 1;
-			} else if (!strcasecmp(name, "domain")) {
-				if (cur->domain) {
-					free_seapp_context(cur);
-					goto err;
-				}
-				cur->domain = strdup(value);
-				if (!cur->domain) {
-					free_seapp_context(cur);
-					goto oom;
-				}
-			} else if (!strcasecmp(name, "type")) {
-				if (cur->type) {
-					free_seapp_context(cur);
-					goto err;
-				}
-				cur->type = strdup(value);
-				if (!cur->type) {
-					free_seapp_context(cur);
-					goto oom;
-				}
-			} else if (!strcasecmp(name, "levelFromUid")) {
-				if (cur->levelFrom) {
-					free_seapp_context(cur);
-					goto err;
-				}
-				if (!strcasecmp(value, "true"))
-					cur->levelFrom = LEVELFROM_APP;
-				else if (!strcasecmp(value, "false"))
-					cur->levelFrom = LEVELFROM_NONE;
-				else {
-					free_seapp_context(cur);
-					goto err;
-				}
-			} else if (!strcasecmp(name, "levelFrom")) {
-				if (cur->levelFrom) {
-					free_seapp_context(cur);
-					goto err;
-				}
-				if (!strcasecmp(value, "none"))
-					cur->levelFrom = LEVELFROM_NONE;
-				else if (!strcasecmp(value, "app"))
-					cur->levelFrom = LEVELFROM_APP;
-				else if (!strcasecmp(value, "user"))
-					cur->levelFrom = LEVELFROM_USER;
-				else if (!strcasecmp(value, "all"))
-					cur->levelFrom = LEVELFROM_ALL;
-				else {
-					free_seapp_context(cur);
-					goto err;
-				}
-			} else if (!strcasecmp(name, "level")) {
-				if (cur->level) {
-					free_seapp_context(cur);
-					goto err;
-				}
-				cur->level = strdup(value);
-				if (!cur->level) {
-					free_seapp_context(cur);
-					goto oom;
-				}
-			} else if (!strcasecmp(name, "path")) {
-				if (cur->path.str) {
-					free_seapp_context(cur);
-					goto err;
-				}
-				cur->path.str = strdup(value);
-				if (!cur->path.str) {
-					free_seapp_context(cur);
-					goto oom;
-				}
-				cur->path.len = strlen(cur->path.str);
-				if (cur->path.str[cur->path.len-1] == '*')
-					cur->path.is_prefix = 1;
-			} else if (!strcasecmp(name, "isPrivApp")) {
-				cur->isPrivAppSet = true;
-				if (!strcasecmp(value, "true"))
-					cur->isPrivApp = true;
-				else if (!strcasecmp(value, "false"))
-					cur->isPrivApp = false;
-				else {
-					free_seapp_context(cur);
-					goto err;
-				}
-			} else {
-				free_seapp_context(cur);
-				goto err;
-			}
-
-			token = strtok_r(NULL, " \t", &saveptr);
-			if (!token)
-				break;
-		}
-
-		if (cur->name.str &&
-		    (!cur->seinfo || !strcmp(cur->seinfo, "default"))) {
-			selinux_log(SELINUX_ERROR, "%s:  No specific seinfo value specified with name=\"%s\", on line %u:  insecure configuration!\n",
-				    seapp_contexts_file, cur->name.str, lineno);
-			free_seapp_context(cur);
-			goto err;
-		}
-
-		seapp_contexts[nspec] = cur;
-		nspec++;
-		lineno++;
-	}
-
-	qsort(seapp_contexts, nspec, sizeof(struct seapp_context *),
-	      seapp_context_cmp);
-
-	if (seapp_contexts_dup)
-		goto err;
-
-#if DEBUG
-	{
-		int i;
-		for (i = 0; i < nspec; i++) {
-			cur = seapp_contexts[i];
-			selinux_log(SELINUX_INFO, "%s:  isSystemServer=%s  isEphemeralApp=%s isOwner=%s user=%s seinfo=%s "
-					"name=%s path=%s isPrivApp=%s -> domain=%s type=%s level=%s levelFrom=%s",
-				__FUNCTION__,
-				cur->isSystemServer ? "true" : "false",
-				cur->isEphemeralAppSet ? (cur->isEphemeralApp ? "true" : "false") : "null",
-				cur->isOwnerSet ? (cur->isOwner ? "true" : "false") : "null",
-				cur->user.str,
-				cur->seinfo, cur->name.str, cur->path.str,
-				cur->isPrivAppSet ? (cur->isPrivApp ? "true" : "false") : "null",
-				cur->domain, cur->type, cur->level,
-				levelFromName[cur->levelFrom]);
-		}
-	}
-#endif
-
-	ret = 0;
-
-out:
-	fclose(fp);
-	return ret;
-
-err:
-	selinux_log(SELINUX_ERROR, "%s:  Invalid entry on line %u\n",
-		    seapp_contexts_file, lineno);
-	free_seapp_contexts();
-	ret = -1;
-	goto out;
-oom:
-	selinux_log(SELINUX_ERROR, 
-		    "%s:  Out of memory\n", __FUNCTION__);
-	free_seapp_contexts();
-	ret = -1;
-	goto out;
-}
-
-
-static void seapp_context_init(void)
-{
-        selinux_android_seapp_context_reload();
-}
-
-static pthread_once_t once = PTHREAD_ONCE_INIT;
-
-/*
- * Max id that can be mapped to category set uniquely
- * using the current scheme.
- */
-#define CAT_MAPPING_MAX_ID (0x1<<16)
-
-enum seapp_kind {
-	SEAPP_TYPE,
-	SEAPP_DOMAIN
-};
-
-#define PRIVILEGED_APP_STR ":privapp"
-#define EPHEMERAL_APP_STR ":ephemeralapp"
-
-static int seinfo_parse(char *dest, const char *src, size_t size)
-{
-	size_t len;
-	char *p;
-
-	if ((p = strchr(src, ':')) != NULL)
-		len = p - src;
-	else
-		len = strlen(src);
-
-	if (len > size - 1)
-		return -1;
-
-	strncpy(dest, src, len);
-	dest[len] = '\0';
-
-	return 0;
-}
-
-static int seapp_context_lookup(enum seapp_kind kind,
-				uid_t uid,
-				bool isSystemServer,
-				const char *seinfo,
-				const char *pkgname,
-				const char *path,
-				context_t ctx)
-{
-	struct passwd *pwd;
-	bool isOwner;
-	const char *username = NULL;
-	struct seapp_context *cur = NULL;
-	int i;
-	size_t n;
-	uid_t userid;
-	uid_t appid;
-	bool isPrivApp = false;
-	bool isEphemeralApp = false;
-	char parsedseinfo[BUFSIZ];
-
-	__selinux_once(once, seapp_context_init);
-
-	if (seinfo) {
-		if (seinfo_parse(parsedseinfo, seinfo, BUFSIZ))
-			goto err;
-		isPrivApp = strstr(seinfo, PRIVILEGED_APP_STR) ? true : false;
-		isEphemeralApp = strstr(seinfo, EPHEMERAL_APP_STR) ? true : false;
-		seinfo = parsedseinfo;
-	}
-
-	userid = uid / AID_USER;
-	isOwner = (userid == 0);
-	appid = uid % AID_USER;
-	if (appid < AID_APP) {
-            /*
-             * This code is Android specific, bionic guarantees that
-             * calls to non-reentrant getpwuid() are thread safe.
-             */
-#ifndef __BIONIC__
-#warning "This code assumes that getpwuid is thread safe, only true with Bionic!"
-#endif
-		pwd = getpwuid(appid);
-		if (!pwd)
-			goto err;
-
-		username = pwd->pw_name;
-
-	} else if (appid < AID_ISOLATED_START) {
-		username = "_app";
-		appid -= AID_APP;
-	} else {
-		username = "_isolated";
-		appid -= AID_ISOLATED_START;
-	}
-
-	if (appid >= CAT_MAPPING_MAX_ID || userid >= CAT_MAPPING_MAX_ID)
-		goto err;
-
-	for (i = 0; i < nspec; i++) {
-		cur = seapp_contexts[i];
-
-		if (cur->isSystemServer != isSystemServer)
-			continue;
-
-		if (cur->isEphemeralAppSet && cur->isEphemeralApp != isEphemeralApp)
-			continue;
-
-		if (cur->isOwnerSet && cur->isOwner != isOwner)
-			continue;
-
-		if (cur->user.str) {
-			if (cur->user.is_prefix) {
-				if (strncasecmp(username, cur->user.str, cur->user.len-1))
-					continue;
-			} else {
-				if (strcasecmp(username, cur->user.str))
-					continue;
-			}
-		}
-
-		if (cur->seinfo) {
-			if (!seinfo || strcasecmp(seinfo, cur->seinfo))
-				continue;
-		}
-
-		if (cur->name.str) {
-			if(!pkgname)
-				continue;
-
-			if (cur->name.is_prefix) {
-				if (strncasecmp(pkgname, cur->name.str, cur->name.len-1))
-					continue;
-			} else {
-				if (strcasecmp(pkgname, cur->name.str))
-					continue;
-			}
-		}
-
-		if (cur->isPrivAppSet && cur->isPrivApp != isPrivApp)
-			continue;
-
-		if (cur->path.str) {
-			if (!path)
-				continue;
-
-			if (cur->path.is_prefix) {
-				if (strncmp(path, cur->path.str, cur->path.len-1))
-					continue;
-			} else {
-				if (strcmp(path, cur->path.str))
-					continue;
-			}
-		}
-
-		if (kind == SEAPP_TYPE && !cur->type)
-			continue;
-		else if (kind == SEAPP_DOMAIN && !cur->domain)
-			continue;
-
-		if (kind == SEAPP_TYPE) {
-			if (context_type_set(ctx, cur->type))
-				goto oom;
-		} else if (kind == SEAPP_DOMAIN) {
-			if (context_type_set(ctx, cur->domain))
-				goto oom;
-		}
-
-		if (cur->levelFrom != LEVELFROM_NONE) {
-			char level[255];
-			switch (cur->levelFrom) {
-			case LEVELFROM_APP:
-				snprintf(level, sizeof level, "s0:c%u,c%u",
-					 appid & 0xff,
-					 256 + (appid>>8 & 0xff));
-				break;
-			case LEVELFROM_USER:
-				snprintf(level, sizeof level, "s0:c%u,c%u",
-					 512 + (userid & 0xff),
-					 768 + (userid>>8 & 0xff));
-				break;
-			case LEVELFROM_ALL:
-				snprintf(level, sizeof level, "s0:c%u,c%u,c%u,c%u",
-					 appid & 0xff,
-					 256 + (appid>>8 & 0xff),
-					 512 + (userid & 0xff),
-					 768 + (userid>>8 & 0xff));
-				break;
-			default:
-				goto err;
-			}
-			if (context_range_set(ctx, level))
-				goto oom;
-		} else if (cur->level) {
-			if (context_range_set(ctx, cur->level))
-				goto oom;
-		}
-
-		break;
-	}
-
-	if (kind == SEAPP_DOMAIN && i == nspec) {
-		/*
-		 * No match.
-		 * Fail to prevent staying in the zygote's context.
-		 */
-		selinux_log(SELINUX_ERROR,
-			    "%s:  No match for app with uid %d, seinfo %s, name %s\n",
-			    __FUNCTION__, uid, seinfo, pkgname);
-
-		if (security_getenforce() == 1)
-			goto err;
-	}
-
-	return 0;
-err:
-	return -1;
-oom:
-	return -2;
-}
-
-int selinux_android_setfilecon(const char *pkgdir,
-				const char *pkgname,
-				const char *seinfo,
-				uid_t uid)
-{
-	char *orig_ctx_str = NULL;
-	char *ctx_str = NULL;
-	context_t ctx = NULL;
-	int rc = -1;
-
-	if (is_selinux_enabled() <= 0)
-		return 0;
-
-	rc = getfilecon(pkgdir, &ctx_str);
-	if (rc < 0)
-		goto err;
-
-	ctx = context_new(ctx_str);
-	orig_ctx_str = ctx_str;
-	if (!ctx)
-		goto oom;
-
-	rc = seapp_context_lookup(SEAPP_TYPE, uid, 0, seinfo, pkgname, NULL, ctx);
-	if (rc == -1)
-		goto err;
-	else if (rc == -2)
-		goto oom;
-
-	ctx_str = context_str(ctx);
-	if (!ctx_str)
-		goto oom;
-
-	rc = security_check_context(ctx_str);
-	if (rc < 0)
-		goto err;
-
-	if (strcmp(ctx_str, orig_ctx_str)) {
-		rc = setfilecon(pkgdir, ctx_str);
-		if (rc < 0)
-			goto err;
-	}
-
-	rc = 0;
-out:
-	freecon(orig_ctx_str);
-	context_free(ctx);
-	return rc;
-err:
-	selinux_log(SELINUX_ERROR, "%s:  Error setting context for pkgdir %s, uid %d: %s\n",
-		    __FUNCTION__, pkgdir, uid, strerror(errno));
-	rc = -1;
-	goto out;
-oom:
-	selinux_log(SELINUX_ERROR, "%s:  Out of memory\n", __FUNCTION__);
-	rc = -1;
-	goto out;
-}
-
-int selinux_android_setcon(const char *con)
-{
-	int ret = setcon(con);
-	if (ret)
-		return ret;
-	/*
-	  System properties must be reinitialized after setcon() otherwise the
-	  previous property files will be leaked since mmap()'ed regions are not
-	  closed as a result of setcon().
-	*/
-	return __system_properties_init();
-}
-
-int selinux_android_setcontext(uid_t uid,
-			       bool isSystemServer,
-			       const char *seinfo,
-			       const char *pkgname)
-{
-	char *orig_ctx_str = NULL, *ctx_str;
-	context_t ctx = NULL;
-	int rc = -1;
-
-	if (is_selinux_enabled() <= 0)
-		return 0;
-
-	rc = getcon(&ctx_str);
-	if (rc)
-		goto err;
-
-	ctx = context_new(ctx_str);
-	orig_ctx_str = ctx_str;
-	if (!ctx)
-		goto oom;
-
-	rc = seapp_context_lookup(SEAPP_DOMAIN, uid, isSystemServer, seinfo, pkgname, NULL, ctx);
-	if (rc == -1)
-		goto err;
-	else if (rc == -2)
-		goto oom;
-
-	ctx_str = context_str(ctx);
-	if (!ctx_str)
-		goto oom;
-
-	rc = security_check_context(ctx_str);
-	if (rc < 0)
-		goto err;
-
-	if (strcmp(ctx_str, orig_ctx_str)) {
-		rc = selinux_android_setcon(ctx_str);
-		if (rc < 0)
-			goto err;
-	}
-
-	rc = 0;
-out:
-	freecon(orig_ctx_str);
-	context_free(ctx);
-	avc_netlink_close();
-	return rc;
-err:
-	if (isSystemServer)
-		selinux_log(SELINUX_ERROR,
-				"%s:  Error setting context for system server: %s\n",
-				__FUNCTION__, strerror(errno));
-	else 
-		selinux_log(SELINUX_ERROR,
-				"%s:  Error setting context for app with uid %d, seinfo %s: %s\n",
-				__FUNCTION__, uid, seinfo, strerror(errno));
-
-	rc = -1;
-	goto out;
-oom:
-	selinux_log(SELINUX_ERROR, "%s:  Out of memory\n", __FUNCTION__);
-	rc = -1;
-	goto out;
-}
-
-static struct selabel_handle *fc_sehandle = NULL;
-#define FC_DIGEST_SIZE SHA_DIGEST_LENGTH
-static uint8_t fc_digest[FC_DIGEST_SIZE];
-
-static bool compute_file_contexts_hash(uint8_t c_digest[])
-{
-    int fd;
-    struct stat sb;
-    void *map;
-
-    fd = open(seopts.value, O_CLOEXEC | O_RDONLY | O_NOFOLLOW);
-    if (fd < 0) {
-        selinux_log(SELINUX_ERROR, "SELinux:  Could not open %s:  %s\n",
-                    seopts.value, strerror(errno));
-        return false;
-    }
-    if (fstat(fd, &sb) < 0) {
-        selinux_log(SELINUX_ERROR, "SELinux:  Could not stat %s:  %s\n",
-                    seopts.value, strerror(errno));
-        close(fd);
-        return false;
-    }
-    map = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
-    if (map == MAP_FAILED) {
-        selinux_log(SELINUX_ERROR, "SELinux:  Could not map %s:  %s\n",
-                    seopts.value, strerror(errno));
-        close(fd);
-        return false;
-    }
-    SHA1(map, sb.st_size, c_digest);
-    munmap(map, sb.st_size);
-    close(fd);
-
-    return true;
-}
-
-static void file_context_init(void)
-{
-    if (!fc_sehandle)
-        fc_sehandle = selinux_android_file_context_handle();
-}
-
-
-
-static pthread_once_t fc_once = PTHREAD_ONCE_INIT;
-
-#define PKGTAB_SIZE 256
-static struct pkg_info *pkgTab[PKGTAB_SIZE];
-
-static unsigned int pkghash(const char *pkgname)
-{
-    unsigned int h = 7;
-    for (; *pkgname; pkgname++) {
-        h = h * 31 + *pkgname;
-    }
-    return h & (PKGTAB_SIZE - 1);
-}
-
-static bool pkg_parse_callback(pkg_info *info, void *userdata) {
-
-    (void) userdata;
-
-    unsigned int hash = pkghash(info->name);
-    if (pkgTab[hash])
-        info->private_data = pkgTab[hash];
-    pkgTab[hash] = info;
-    return true;
-}
-
-static void package_info_init(void)
-{
-
-    bool rc = packagelist_parse(pkg_parse_callback, NULL);
-    if (!rc) {
-        selinux_log(SELINUX_ERROR, "SELinux: Could NOT parse package list\n");
-        return;
-    }
-
-#if DEBUG
-    {
-        unsigned int hash, buckets, entries, chainlen, longestchain;
-        struct pkg_info *info = NULL;
-
-        buckets = entries = longestchain = 0;
-        for (hash = 0; hash < PKGTAB_SIZE; hash++) {
-            if (pkgTab[hash]) {
-                buckets++;
-                chainlen = 0;
-                for (info = pkgTab[hash]; info; info = (pkg_info *)info->private_data) {
-                    chainlen++;
-                    selinux_log(SELINUX_INFO, "%s:  name=%s uid=%u debuggable=%s dataDir=%s seinfo=%s\n",
-                                __FUNCTION__,
-                                info->name, info->uid, info->debuggable ? "true" : "false", info->data_dir, info->seinfo);
-                }
-                entries += chainlen;
-                if (longestchain < chainlen)
-                    longestchain = chainlen;
-            }
-        }
-        selinux_log(SELINUX_INFO, "SELinux:  %d pkg entries and %d/%d buckets used, longest chain %d\n", entries, buckets, PKGTAB_SIZE, longestchain);
-    }
-#endif
-
-}
-
-static pthread_once_t pkg_once = PTHREAD_ONCE_INIT;
-
-struct pkg_info *package_info_lookup(const char *name)
-{
-    struct pkg_info *info;
-    unsigned int hash;
-
-    __selinux_once(pkg_once, package_info_init);
-
-    hash = pkghash(name);
-    for (info = pkgTab[hash]; info; info = (pkg_info *)info->private_data) {
-        if (!strcmp(name, info->name))
-            return info;
-    }
-    return NULL;
-}
-
-/* The path prefixes of package data directories. */
-#define DATA_DATA_PATH "/data/data"
-#define DATA_USER_PATH "/data/user"
-#define DATA_USER_DE_PATH "/data/user_de"
-#define EXPAND_USER_PATH "/mnt/expand/\?\?\?\?\?\?\?\?-\?\?\?\?-\?\?\?\?-\?\?\?\?-\?\?\?\?\?\?\?\?\?\?\?\?/user"
-#define EXPAND_USER_DE_PATH "/mnt/expand/\?\?\?\?\?\?\?\?-\?\?\?\?-\?\?\?\?-\?\?\?\?-\?\?\?\?\?\?\?\?\?\?\?\?/user_de"
-#define DATA_DATA_PREFIX DATA_DATA_PATH "/"
-#define DATA_USER_PREFIX DATA_USER_PATH "/"
-#define DATA_USER_DE_PREFIX DATA_USER_DE_PATH "/"
-
-static int pkgdir_selabel_lookup(const char *pathname,
-                                 const char *seinfo,
-                                 uid_t uid,
-                                 char **secontextp)
-{
-    char *pkgname = NULL, *end = NULL;
-    struct pkg_info *info = NULL;
-    char *secontext = *secontextp;
-    context_t ctx = NULL;
-    int rc = 0;
-
-    /* Skip directory prefix before package name. */
-    if (!strncmp(pathname, DATA_DATA_PREFIX, sizeof(DATA_DATA_PREFIX)-1)) {
-        pathname += sizeof(DATA_DATA_PREFIX) - 1;
-    } else if (!strncmp(pathname, DATA_USER_PREFIX, sizeof(DATA_USER_PREFIX)-1)) {
-        pathname += sizeof(DATA_USER_PREFIX) - 1;
-        while (isdigit(*pathname))
-            pathname++;
-        if (*pathname == '/')
-            pathname++;
-        else
-            return 0;
-    } else if (!strncmp(pathname, DATA_USER_DE_PREFIX, sizeof(DATA_USER_DE_PREFIX)-1)) {
-        pathname += sizeof(DATA_USER_DE_PREFIX) - 1;
-        while (isdigit(*pathname))
-            pathname++;
-        if (*pathname == '/')
-            pathname++;
-        else
-            return 0;
-    } else if (!fnmatch(EXPAND_USER_PATH, pathname, FNM_LEADING_DIR|FNM_PATHNAME)) {
-        pathname += sizeof(EXPAND_USER_PATH);
-        while (isdigit(*pathname))
-            pathname++;
-        if (*pathname == '/')
-            pathname++;
-        else
-            return 0;
-    } else if (!fnmatch(EXPAND_USER_DE_PATH, pathname, FNM_LEADING_DIR|FNM_PATHNAME)) {
-        pathname += sizeof(EXPAND_USER_DE_PATH);
-        while (isdigit(*pathname))
-            pathname++;
-        if (*pathname == '/')
-            pathname++;
-        else
-            return 0;
-    } else
-        return 0;
-
-    if (!(*pathname))
-        return 0;
-
-    pkgname = strdup(pathname);
-    if (!pkgname)
-        return -1;
-
-    for (end = pkgname; *end && *end != '/'; end++)
-        ;
-    pathname = end;
-    if (*end)
-        pathname++;
-    *end = '\0';
-
-    if (!seinfo) {
-        info = package_info_lookup(pkgname);
-        if (!info) {
-            selinux_log(SELINUX_WARNING, "SELinux:  Could not look up information for package %s, cannot restorecon %s.\n",
-                        pkgname, pathname);
-            free(pkgname);
-            return -1;
-        }
-    }
-
-    ctx = context_new(secontext);
-    if (!ctx)
-        goto err;
-
-    rc = seapp_context_lookup(SEAPP_TYPE, info ? info->uid : uid, 0,
-                              info ? info->seinfo : seinfo, info ? info->name : pkgname, pathname, ctx);
-    if (rc < 0)
-        goto err;
-
-    secontext = context_str(ctx);
-    if (!secontext)
-        goto err;
-
-    if (!strcmp(secontext, *secontextp))
-        goto out;
-
-    rc = security_check_context(secontext);
-    if (rc < 0)
-        goto err;
-
-    freecon(*secontextp);
-    *secontextp = strdup(secontext);
-    if (!(*secontextp))
-        goto err;
-
-    rc = 0;
-
-out:
-    free(pkgname);
-    context_free(ctx);
-    return rc;
-err:
-    selinux_log(SELINUX_ERROR, "%s:  Error looking up context for path %s, pkgname %s, seinfo %s, uid %u: %s\n",
-                __FUNCTION__, pathname, pkgname, info->seinfo, info->uid, strerror(errno));
-    rc = -1;
-    goto out;
-}
-
-#define RESTORECON_LAST "security.restorecon_last"
-
-static int restorecon_sb(const char *pathname, const struct stat *sb,
-                         bool nochange, bool verbose,
-                         const char *seinfo, uid_t uid)
-{
-    char *secontext = NULL;
-    char *oldsecontext = NULL;
-    int rc = 0;
-
-    if (selabel_lookup(fc_sehandle, &secontext, pathname, sb->st_mode) < 0)
-        return 0;  /* no match, but not an error */
-
-    if (lgetfilecon(pathname, &oldsecontext) < 0)
-        goto err;
-
-    /*
-     * For subdirectories of /data/data or /data/user, we ignore selabel_lookup()
-     * and use pkgdir_selabel_lookup() instead. Files within those directories
-     * have different labeling rules, based off of /seapp_contexts, and
-     * installd is responsible for managing these labels instead of init.
-     */
-    if (!strncmp(pathname, DATA_DATA_PREFIX, sizeof(DATA_DATA_PREFIX)-1) ||
-        !strncmp(pathname, DATA_USER_PREFIX, sizeof(DATA_USER_PREFIX)-1) ||
-        !strncmp(pathname, DATA_USER_DE_PREFIX, sizeof(DATA_USER_DE_PREFIX)-1) ||
-        !fnmatch(EXPAND_USER_PATH, pathname, FNM_LEADING_DIR|FNM_PATHNAME) ||
-        !fnmatch(EXPAND_USER_DE_PATH, pathname, FNM_LEADING_DIR|FNM_PATHNAME)) {
-        if (pkgdir_selabel_lookup(pathname, seinfo, uid, &secontext) < 0)
-            goto err;
-    }
-
-    if (strcmp(oldsecontext, secontext) != 0) {
-        if (verbose)
-            selinux_log(SELINUX_INFO,
-                        "SELinux:  Relabeling %s from %s to %s.\n", pathname, oldsecontext, secontext);
-        if (!nochange) {
-            if (lsetfilecon(pathname, secontext) < 0)
-                goto err;
-        }
-    }
-
-    rc = 0;
-
-out:
-    freecon(oldsecontext);
-    freecon(secontext);
-    return rc;
-
-err:
-    selinux_log(SELINUX_ERROR,
-                "SELinux: Could not set context for %s:  %s\n",
-                pathname, strerror(errno));
-    rc = -1;
-    goto out;
-}
-
-#define SYS_PATH "/sys"
-#define SYS_PREFIX SYS_PATH "/"
-
-static int selinux_android_restorecon_common(const char* pathname_orig,
-                                             const char *seinfo,
-                                             uid_t uid,
-                                             unsigned int flags)
-{
-    bool nochange = (flags & SELINUX_ANDROID_RESTORECON_NOCHANGE) ? true : false;
-    bool verbose = (flags & SELINUX_ANDROID_RESTORECON_VERBOSE) ? true : false;
-    bool recurse = (flags & SELINUX_ANDROID_RESTORECON_RECURSE) ? true : false;
-    bool force = (flags & SELINUX_ANDROID_RESTORECON_FORCE) ? true : false;
-    bool datadata = (flags & SELINUX_ANDROID_RESTORECON_DATADATA) ? true : false;
-    bool issys;
-    bool setrestoreconlast = true;
-    struct stat sb;
-    struct statfs sfsb;
-    FTS *fts;
-    FTSENT *ftsent;
-    char *pathname = NULL, *pathdnamer = NULL, *pathdname, *pathbname;
-    char * paths[2] = { NULL , NULL };
-    int ftsflags = FTS_NOCHDIR | FTS_XDEV | FTS_PHYSICAL;
-    int error, sverrno;
-    char xattr_value[FC_DIGEST_SIZE];
-    ssize_t size;
-
-    if (is_selinux_enabled() <= 0)
-        return 0;
-
-    __selinux_once(fc_once, file_context_init);
-
-    if (!fc_sehandle)
-        return 0;
-
-    /*
-     * Convert passed-in pathname to canonical pathname by resolving realpath of
-     * containing dir, then appending last component name.
-     */
-    pathbname = basename(pathname_orig);
-    if (!strcmp(pathbname, "/") || !strcmp(pathbname, ".") || !strcmp(pathbname, "..")) {
-        pathname = realpath(pathname_orig, NULL);
-        if (!pathname)
-            goto realpatherr;
-    } else {
-        pathdname = dirname(pathname_orig);
-        pathdnamer = realpath(pathdname, NULL);
-        if (!pathdnamer)
-            goto realpatherr;
-        if (!strcmp(pathdnamer, "/"))
-            error = asprintf(&pathname, "/%s", pathbname);
-        else
-            error = asprintf(&pathname, "%s/%s", pathdnamer, pathbname);
-        if (error < 0)
-            goto oom;
-    }
-
-    paths[0] = pathname;
-    issys = (!strcmp(pathname, SYS_PATH)
-            || !strncmp(pathname, SYS_PREFIX, sizeof(SYS_PREFIX)-1)) ? true : false;
-
-    if (!recurse) {
-        if (lstat(pathname, &sb) < 0) {
-            error = -1;
-            goto cleanup;
-        }
-
-        error = restorecon_sb(pathname, &sb, nochange, verbose, seinfo, uid);
-        goto cleanup;
-    }
-
-    /*
-     * Ignore restorecon_last on /data/data or /data/user
-     * since their labeling is based on seapp_contexts and seinfo
-     * assignments rather than file_contexts and is managed by
-     * installd rather than init.
-     */
-    if (!strncmp(pathname, DATA_DATA_PREFIX, sizeof(DATA_DATA_PREFIX)-1) ||
-        !strncmp(pathname, DATA_USER_PREFIX, sizeof(DATA_USER_PREFIX)-1) ||
-        !strncmp(pathname, DATA_USER_DE_PREFIX, sizeof(DATA_USER_DE_PREFIX)-1) ||
-        !fnmatch(EXPAND_USER_PATH, pathname, FNM_LEADING_DIR|FNM_PATHNAME) ||
-        !fnmatch(EXPAND_USER_DE_PATH, pathname, FNM_LEADING_DIR|FNM_PATHNAME))
-        setrestoreconlast = false;
-
-    /* Also ignore on /sys since it is regenerated on each boot regardless. */
-    if (issys)
-        setrestoreconlast = false;
-
-    /* Ignore files on in-memory filesystems */
-    if (statfs(pathname, &sfsb) == 0) {
-        if (sfsb.f_type == RAMFS_MAGIC || sfsb.f_type == TMPFS_MAGIC)
-            setrestoreconlast = false;
-    }
-
-    if (setrestoreconlast) {
-        size = getxattr(pathname, RESTORECON_LAST, xattr_value, sizeof fc_digest);
-        if (!force && size == sizeof fc_digest && memcmp(fc_digest, xattr_value, sizeof fc_digest) == 0) {
-            selinux_log(SELINUX_INFO,
-                        "SELinux: Skipping restorecon_recursive(%s)\n",
-                        pathname);
-            error = 0;
-            goto cleanup;
-        }
-    }
-
-    fts = fts_open(paths, ftsflags, NULL);
-    if (!fts) {
-        error = -1;
-        goto cleanup;
-    }
-
-    error = 0;
-    while ((ftsent = fts_read(fts)) != NULL) {
-        switch (ftsent->fts_info) {
-        case FTS_DC:
-            selinux_log(SELINUX_ERROR,
-                        "SELinux:  Directory cycle on %s.\n", ftsent->fts_path);
-            errno = ELOOP;
-            error = -1;
-            goto out;
-        case FTS_DP:
-            continue;
-        case FTS_DNR:
-            selinux_log(SELINUX_ERROR,
-                        "SELinux:  Could not read %s: %s.\n", ftsent->fts_path, strerror(errno));
-            fts_set(fts, ftsent, FTS_SKIP);
-            continue;
-        case FTS_NS:
-            selinux_log(SELINUX_ERROR,
-                        "SELinux:  Could not stat %s: %s.\n", ftsent->fts_path, strerror(errno));
-            fts_set(fts, ftsent, FTS_SKIP);
-            continue;
-        case FTS_ERR:
-            selinux_log(SELINUX_ERROR,
-                        "SELinux:  Error on %s: %s.\n", ftsent->fts_path, strerror(errno));
-            fts_set(fts, ftsent, FTS_SKIP);
-            continue;
-        case FTS_D:
-            if (issys && !selabel_partial_match(fc_sehandle, ftsent->fts_path)) {
-                fts_set(fts, ftsent, FTS_SKIP);
-                continue;
-            }
-
-            if (!datadata &&
-                (!strcmp(ftsent->fts_path, DATA_DATA_PATH) ||
-                 !strncmp(ftsent->fts_path, DATA_USER_PREFIX, sizeof(DATA_USER_PREFIX)-1) ||
-                 !strncmp(ftsent->fts_path, DATA_USER_DE_PREFIX, sizeof(DATA_USER_DE_PREFIX)-1) ||
-                 !fnmatch(EXPAND_USER_PATH, ftsent->fts_path, FNM_LEADING_DIR|FNM_PATHNAME) ||
-                 !fnmatch(EXPAND_USER_DE_PATH, ftsent->fts_path, FNM_LEADING_DIR|FNM_PATHNAME))) {
-                // Don't label anything below this directory.
-                fts_set(fts, ftsent, FTS_SKIP);
-                // but fall through and make sure we label the directory itself
-            }
-            /* fall through */
-        default:
-            error |= restorecon_sb(ftsent->fts_path, ftsent->fts_statp, nochange, verbose, seinfo, uid);
-            break;
-        }
-    }
-
-    // Labeling successful. Mark the top level directory as completed.
-    if (setrestoreconlast && !nochange && !error)
-        setxattr(pathname, RESTORECON_LAST, fc_digest, sizeof fc_digest, 0);
-
-out:
-    sverrno = errno;
-    (void) fts_close(fts);
-    errno = sverrno;
-cleanup:
-    free(pathdnamer);
-    free(pathname);
-    return error;
-oom:
-    sverrno = errno;
-    selinux_log(SELINUX_ERROR, "%s:  Out of memory\n", __FUNCTION__);
-    errno = sverrno;
-    error = -1;
-    goto cleanup;
-realpatherr:
-    sverrno = errno;
-    selinux_log(SELINUX_ERROR, "SELinux: Could not get canonical path for %s restorecon: %s.\n",
-            pathname_orig, strerror(errno));
-    errno = sverrno;
-    error = -1;
-    goto cleanup;
-}
-
-int selinux_android_restorecon(const char *file, unsigned int flags)
-{
-    return selinux_android_restorecon_common(file, NULL, -1, flags);
-}
-
-int selinux_android_restorecon_pkgdir(const char *pkgdir,
-                                      const char *seinfo,
-                                      uid_t uid,
-                                      unsigned int flags)
-{
-    return selinux_android_restorecon_common(pkgdir, seinfo, uid, flags | SELINUX_ANDROID_RESTORECON_DATADATA);
-}
-
-struct selabel_handle* selinux_android_file_context_handle(void)
-{
-    char *path = NULL;
-    struct selabel_handle *sehandle;
-    struct selinux_opt fc_opts[] = {
-        { SELABEL_OPT_PATH, path },
-        { SELABEL_OPT_BASEONLY, (char *)1 }
-    };
-
-    fc_opts[0].value = seopts.value;
-
-    sehandle = selabel_open(SELABEL_CTX_FILE, fc_opts, 2);
-
-    if (!sehandle) {
-        selinux_log(SELINUX_ERROR, "%s: Error getting file context handle (%s)\n",
-                __FUNCTION__, strerror(errno));
-        return NULL;
-    }
-    if (!compute_file_contexts_hash(fc_digest)) {
-        selabel_close(sehandle);
-        return NULL;
-    }
-    selinux_log(SELINUX_INFO, "SELinux: Loaded file_contexts contexts from %s.\n",
-            fc_opts[0].value);
-
-    return sehandle;
-}
-
-struct selabel_handle* selinux_android_prop_context_handle(void)
-{
-    struct selabel_handle* sehandle;
-
-    sehandle = selabel_open(SELABEL_CTX_ANDROID_PROP,
-            &seopts_prop, 1);
-    if (!sehandle) {
-        selinux_log(SELINUX_ERROR, "%s: Error getting property context handle (%s)\n",
-                __FUNCTION__, strerror(errno));
-        return NULL;
-    }
-    selinux_log(SELINUX_INFO, "SELinux: Loaded property_contexts from %s.\n",
-            seopts_prop.value);
-
-    return sehandle;
-}
-
-struct selabel_handle* selinux_android_service_context_handle(void)
-{
-    struct selabel_handle* sehandle;
-
-    sehandle = selabel_open(SELABEL_CTX_ANDROID_SERVICE,
-            &seopts_service, 1);
-
-    if (!sehandle) {
-        selinux_log(SELINUX_ERROR, "%s: Error getting service context handle (%s)\n",
-                __FUNCTION__, strerror(errno));
-        return NULL;
-    }
-    selinux_log(SELINUX_INFO, "SELinux: Loaded service_contexts from %s.\n",
-            seopts_service.value);
-
-    return sehandle;
-}
-
-void selinux_android_set_sehandle(const struct selabel_handle *hndl)
-{
-    fc_sehandle = (struct selabel_handle *) hndl;
-}
-
-int selinux_android_load_policy(void)
-{
-	int fd = -1, rc;
-	struct stat sb;
-	void *map = NULL;
-	static int load_successful = 0;
-
-	/*
-	 * Since updating policy at runtime has been abolished
-	 * we just check whether a policy has been loaded before
-	 * and return if this is the case.
-	 * There is no point in reloading policy.
-	 */
-	if (load_successful){
-	  selinux_log(SELINUX_WARNING, "SELinux: Attempted reload of SELinux policy!/n");
-	  return 0;
-	}
-
-	set_selinuxmnt(SELINUXMNT);
-	fd = open(sepolicy_file, O_RDONLY | O_NOFOLLOW | O_CLOEXEC);
-	if (fd < 0) {
-		selinux_log(SELINUX_ERROR, "SELinux:  Could not open sepolicy:  %s\n",
-				strerror(errno));
-		return -1;
-	}
-	if (fstat(fd, &sb) < 0) {
-		selinux_log(SELINUX_ERROR, "SELinux:  Could not stat %s:  %s\n",
-				sepolicy_file, strerror(errno));
-		close(fd);
-		return -1;
-	}
-	map = mmap(NULL, sb.st_size, PROT_READ, MAP_PRIVATE, fd, 0);
-	if (map == MAP_FAILED) {
-		selinux_log(SELINUX_ERROR, "SELinux:  Could not map %s:  %s\n",
-				sepolicy_file, strerror(errno));
-		close(fd);
-		return -1;
-	}
-
-	rc = security_load_policy(map, sb.st_size);
-	if (rc < 0) {
-		selinux_log(SELINUX_ERROR, "SELinux:  Could not load policy:  %s\n",
-				strerror(errno));
-		munmap(map, sb.st_size);
-		close(fd);
-		return -1;
-	}
-
-	munmap(map, sb.st_size);
-	close(fd);
-	selinux_log(SELINUX_INFO, "SELinux: Loaded policy from %s\n", sepolicy_file);
-	load_successful = 1;
-	return 0;
-}
-
-int selinux_log_callback(int type, const char *fmt, ...)
-{
-    va_list ap;
-    int priority;
-    char *strp;
-
-    switch(type) {
-    case SELINUX_WARNING:
-        priority = ANDROID_LOG_WARN;
-        break;
-    case SELINUX_INFO:
-        priority = ANDROID_LOG_INFO;
-        break;
-    default:
-        priority = ANDROID_LOG_ERROR;
-        break;
-    }
-
-    va_start(ap, fmt);
-    if (vasprintf(&strp, fmt, ap) != -1) {
-        LOG_PRI(priority, "SELinux", "%s", strp);
-        LOG_EVENT_STRING(AUDITD_LOG_TAG, strp);
-        free(strp);
-    }
-    va_end(ap);
-    return 0;
-}
diff --git a/src/avc.c b/src/avc.c
deleted file mode 100644
index 528d897..0000000
--- a/src/avc.c
+++ /dev/null
@@ -1,1121 +0,0 @@
-/*
- * Implementation of the userspace access vector cache (AVC).
- *
- * Author : Eamon Walsh <ewalsh@epoch.ncsc.mil>
- *
- * Derived from the kernel AVC implementation by
- * Stephen Smalley <sds@epoch.ncsc.mil> and 
- * James Morris <jmorris@redhat.com>.
- */
-#include <selinux/avc.h>
-#include "selinux_internal.h"
-#include <assert.h>
-#include "avc_sidtab.h"
-#include "avc_internal.h"
-
-#define AVC_CACHE_SLOTS		512
-#define AVC_CACHE_MAXNODES	410
-
-struct avc_entry {
-	security_id_t ssid;
-	security_id_t tsid;
-	security_class_t tclass;
-	struct av_decision avd;
-	security_id_t	create_sid;
-	int used;		/* used recently */
-};
-
-struct avc_node {
-	struct avc_entry ae;
-	struct avc_node *next;
-};
-
-struct avc_cache {
-	struct avc_node *slots[AVC_CACHE_SLOTS];
-	uint32_t lru_hint;	/* LRU hint for reclaim scan */
-	uint32_t active_nodes;
-	uint32_t latest_notif;	/* latest revocation notification */
-};
-
-struct avc_callback_node {
-	int (*callback) (uint32_t event, security_id_t ssid,
-			 security_id_t tsid,
-			 security_class_t tclass, access_vector_t perms,
-			 access_vector_t * out_retained);
-	uint32_t events;
-	security_id_t ssid;
-	security_id_t tsid;
-	security_class_t tclass;
-	access_vector_t perms;
-	struct avc_callback_node *next;
-};
-
-static void *avc_netlink_thread = NULL;
-static void *avc_lock = NULL;
-static void *avc_log_lock = NULL;
-static struct avc_node *avc_node_freelist = NULL;
-static struct avc_cache avc_cache;
-static char *avc_audit_buf = NULL;
-static struct avc_cache_stats cache_stats;
-static struct avc_callback_node *avc_callbacks = NULL;
-static struct sidtab avc_sidtab;
-
-static inline int avc_hash(security_id_t ssid,
-			   security_id_t tsid, security_class_t tclass)
-{
-	return ((uintptr_t) ssid ^ ((uintptr_t) tsid << 2) ^ tclass)
-	    & (AVC_CACHE_SLOTS - 1);
-}
-
-int avc_context_to_sid(const char * ctx, security_id_t * sid)
-{
-	int rc;
-	/* avc_init needs to be called before this function */
-	assert(avc_running);
-
-	avc_get_lock(avc_lock);
-	rc = sidtab_context_to_sid(&avc_sidtab, ctx, sid);
-	avc_release_lock(avc_lock);
-	return rc;
-}
-
-int avc_sid_to_context(security_id_t sid, char ** ctx)
-{
-	int rc;
-	*ctx = NULL;
-	avc_get_lock(avc_lock);
-	*ctx = strdup(sid->ctx);	/* caller must free via freecon */
-	rc = *ctx ? 0 : -1;
-	avc_release_lock(avc_lock);
-	return rc;
-}
-
-int avc_get_initial_sid(const char * name, security_id_t * sid)
-{
-	int rc;
-	char * con;
-
-	rc = security_get_initial_context(name, &con);
-	if (rc < 0)
-		return rc;
-	rc = avc_context_to_sid(con, sid);
-
-	freecon(con);
-
-	return rc;
-}
-
-int avc_open(struct selinux_opt *opts, unsigned nopts)
-{
-	avc_setenforce = 0;
-
-	while (nopts--)
-		switch(opts[nopts].type) {
-		case AVC_OPT_SETENFORCE:
-			avc_setenforce = 1;
-			avc_enforcing = !!opts[nopts].value;
-			break;
-		}
-
-	return avc_init("avc", NULL, NULL, NULL, NULL);
-}
-
-int avc_init(const char *prefix,
-	     const struct avc_memory_callback *mem_cb,
-	     const struct avc_log_callback *log_cb,
-	     const struct avc_thread_callback *thread_cb,
-	     const struct avc_lock_callback *lock_cb)
-{
-	struct avc_node *new;
-	int i, rc = 0;
-
-	if (avc_running)
-		return 0;
-
-	if (prefix)
-		strncpy(avc_prefix, prefix, AVC_PREFIX_SIZE - 1);
-
-	set_callbacks(mem_cb, log_cb, thread_cb, lock_cb);
-
-	avc_lock = avc_alloc_lock();
-	avc_log_lock = avc_alloc_lock();
-
-	memset(&cache_stats, 0, sizeof(cache_stats));
-
-	for (i = 0; i < AVC_CACHE_SLOTS; i++)
-		avc_cache.slots[i] = 0;
-	avc_cache.lru_hint = 0;
-	avc_cache.active_nodes = 0;
-	avc_cache.latest_notif = 0;
-
-	rc = sidtab_init(&avc_sidtab);
-	if (rc) {
-		avc_log(SELINUX_ERROR,
-			"%s:  unable to initialize SID table\n",
-			avc_prefix);
-		goto out;
-	}
-
-	avc_audit_buf = (char *)avc_malloc(AVC_AUDIT_BUFSIZE);
-	if (!avc_audit_buf) {
-		avc_log(SELINUX_ERROR,
-			"%s:  unable to allocate audit buffer\n",
-			avc_prefix);
-		rc = -1;
-		goto out;
-	}
-
-	for (i = 0; i < AVC_CACHE_MAXNODES; i++) {
-		new = avc_malloc(sizeof(*new));
-		if (!new) {
-			avc_log(SELINUX_WARNING,
-				"%s:  warning: only got %d av entries\n",
-				avc_prefix, i);
-			break;
-		}
-		memset(new, 0, sizeof(*new));
-		new->next = avc_node_freelist;
-		avc_node_freelist = new;
-	}
-
-	if (!avc_setenforce) {
-		rc = security_getenforce();
-		if (rc < 0) {
-			avc_log(SELINUX_ERROR,
-				"%s:  could not determine enforcing mode: %s\n",
-				avc_prefix,
-				strerror(errno));
-			goto out;
-		}
-		avc_enforcing = rc;
-	}
-
-	rc = avc_netlink_open(0);
-	if (rc < 0) {
-		avc_log(SELINUX_ERROR,
-			"%s:  can't open netlink socket: %d (%s)\n",
-			avc_prefix, errno, strerror(errno));
-		goto out;
-	}
-	if (avc_using_threads) {
-		avc_netlink_thread = avc_create_thread(&avc_netlink_loop);
-		avc_netlink_trouble = 0;
-	}
-	avc_running = 1;
-      out:
-	return rc;
-}
-
-void avc_cache_stats(struct avc_cache_stats *p)
-{
-	memcpy(p, &cache_stats, sizeof(cache_stats));
-}
-
-void avc_sid_stats(void)
-{
-	/* avc_init needs to be called before this function */
-	assert(avc_running);
-	avc_get_lock(avc_log_lock);
-	avc_get_lock(avc_lock);
-	sidtab_sid_stats(&avc_sidtab, avc_audit_buf, AVC_AUDIT_BUFSIZE);
-	avc_release_lock(avc_lock);
-	avc_log(SELINUX_INFO, "%s", avc_audit_buf);
-	avc_release_lock(avc_log_lock);
-}
-
-void avc_av_stats(void)
-{
-	int i, chain_len, max_chain_len, slots_used;
-	struct avc_node *node;
-
-	avc_get_lock(avc_lock);
-
-	slots_used = 0;
-	max_chain_len = 0;
-	for (i = 0; i < AVC_CACHE_SLOTS; i++) {
-		node = avc_cache.slots[i];
-		if (node) {
-			slots_used++;
-			chain_len = 0;
-			while (node) {
-				chain_len++;
-				node = node->next;
-			}
-			if (chain_len > max_chain_len)
-				max_chain_len = chain_len;
-		}
-	}
-
-	avc_release_lock(avc_lock);
-
-	avc_log(SELINUX_INFO, "%s:  %d AV entries and %d/%d buckets used, "
-		"longest chain length %d\n", avc_prefix,
-		avc_cache.active_nodes,
-		slots_used, AVC_CACHE_SLOTS, max_chain_len);
-}
-
-hidden_def(avc_av_stats)
-
-static inline struct avc_node *avc_reclaim_node(void)
-{
-	struct avc_node *prev, *cur;
-	int try;
-	uint32_t hvalue;
-
-	hvalue = avc_cache.lru_hint;
-	for (try = 0; try < 2; try++) {
-		do {
-			prev = NULL;
-			cur = avc_cache.slots[hvalue];
-			while (cur) {
-				if (!cur->ae.used)
-					goto found;
-
-				cur->ae.used = 0;
-
-				prev = cur;
-				cur = cur->next;
-			}
-			hvalue = (hvalue + 1) & (AVC_CACHE_SLOTS - 1);
-		} while (hvalue != avc_cache.lru_hint);
-	}
-
-	errno = ENOMEM;		/* this was a panic in the kernel... */
-	return NULL;
-
-      found:
-	avc_cache.lru_hint = hvalue;
-
-	if (prev == NULL)
-		avc_cache.slots[hvalue] = cur->next;
-	else
-		prev->next = cur->next;
-
-	return cur;
-}
-
-static inline void avc_clear_avc_entry(struct avc_entry *ae)
-{
-	memset(ae, 0, sizeof(*ae));
-}
-
-static inline struct avc_node *avc_claim_node(security_id_t ssid,
-					      security_id_t tsid,
-					      security_class_t tclass)
-{
-	struct avc_node *new;
-	int hvalue;
-
-	if (!avc_node_freelist)
-		avc_cleanup();
-
-	if (avc_node_freelist) {
-		new = avc_node_freelist;
-		avc_node_freelist = avc_node_freelist->next;
-		avc_cache.active_nodes++;
-	} else {
-		new = avc_reclaim_node();
-		if (!new)
-			goto out;
-	}
-
-	hvalue = avc_hash(ssid, tsid, tclass);
-	avc_clear_avc_entry(&new->ae);
-	new->ae.used = 1;
-	new->ae.ssid = ssid;
-	new->ae.tsid = tsid;
-	new->ae.tclass = tclass;
-	new->next = avc_cache.slots[hvalue];
-	avc_cache.slots[hvalue] = new;
-
-      out:
-	return new;
-}
-
-static inline struct avc_node *avc_search_node(security_id_t ssid,
-					       security_id_t tsid,
-					       security_class_t tclass,
-					       int *probes)
-{
-	struct avc_node *cur;
-	int hvalue;
-	int tprobes = 1;
-
-	hvalue = avc_hash(ssid, tsid, tclass);
-	cur = avc_cache.slots[hvalue];
-	while (cur != NULL &&
-	       (ssid != cur->ae.ssid ||
-		tclass != cur->ae.tclass || tsid != cur->ae.tsid)) {
-		tprobes++;
-		cur = cur->next;
-	}
-
-	if (cur == NULL) {
-		/* cache miss */
-		goto out;
-	}
-
-	/* cache hit */
-	if (probes)
-		*probes = tprobes;
-
-	cur->ae.used = 1;
-
-      out:
-	return cur;
-}
-
-/**
- * avc_lookup - Look up an AVC entry.
- * @ssid: source security identifier
- * @tsid: target security identifier
- * @tclass: target security class
- * @requested: requested permissions, interpreted based on @tclass
- * @aeref:  AVC entry reference
- *
- * Look up an AVC entry that is valid for the
- * @requested permissions between the SID pair
- * (@ssid, @tsid), interpreting the permissions
- * based on @tclass.  If a valid AVC entry exists,
- * then this function updates @aeref to refer to the
- * entry and returns %0.  Otherwise, -1 is returned.
- */
-static int avc_lookup(security_id_t ssid, security_id_t tsid,
-		      security_class_t tclass,
-		      access_vector_t requested, struct avc_entry_ref *aeref)
-{
-	struct avc_node *node;
-	int probes, rc = 0;
-
-	avc_cache_stats_incr(cav_lookups);
-	node = avc_search_node(ssid, tsid, tclass, &probes);
-
-	if (node && ((node->ae.avd.decided & requested) == requested)) {
-		avc_cache_stats_incr(cav_hits);
-		avc_cache_stats_add(cav_probes, probes);
-		aeref->ae = &node->ae;
-		goto out;
-	}
-
-	avc_cache_stats_incr(cav_misses);
-	rc = -1;
-      out:
-	return rc;
-}
-
-/**
- * avc_insert - Insert an AVC entry.
- * @ssid: source security identifier
- * @tsid: target security identifier
- * @tclass: target security class
- * @ae: AVC entry
- * @aeref:  AVC entry reference
- *
- * Insert an AVC entry for the SID pair
- * (@ssid, @tsid) and class @tclass.
- * The access vectors and the sequence number are
- * normally provided by the security server in
- * response to a security_compute_av() call.  If the
- * sequence number @ae->avd.seqno is not less than the latest
- * revocation notification, then the function copies
- * the access vectors into a cache entry, updates
- * @aeref to refer to the entry, and returns %0.
- * Otherwise, this function returns -%1 with @errno set to %EAGAIN.
- */
-static int avc_insert(security_id_t ssid, security_id_t tsid,
-		      security_class_t tclass,
-		      struct avc_entry *ae, struct avc_entry_ref *aeref)
-{
-	struct avc_node *node;
-	int rc = 0;
-
-	if (ae->avd.seqno < avc_cache.latest_notif) {
-		avc_log(SELINUX_WARNING,
-			"%s:  seqno %d < latest_notif %d\n", avc_prefix,
-			ae->avd.seqno, avc_cache.latest_notif);
-		errno = EAGAIN;
-		rc = -1;
-		goto out;
-	}
-
-	node = avc_claim_node(ssid, tsid, tclass);
-	if (!node) {
-		rc = -1;
-		goto out;
-	}
-
-	memcpy(&node->ae.avd, &ae->avd, sizeof(ae->avd));
-	aeref->ae = &node->ae;
-      out:
-	return rc;
-}
-
-void avc_cleanup(void)
-{
-}
-
-hidden_def(avc_cleanup)
-
-int avc_reset(void)
-{
-	struct avc_callback_node *c;
-	int i, ret, rc = 0, errsave = 0;
-	struct avc_node *node, *tmp;
-	errno = 0;
-
-	if (!avc_running)
-		return 0;
-
-	avc_get_lock(avc_lock);
-
-	for (i = 0; i < AVC_CACHE_SLOTS; i++) {
-		node = avc_cache.slots[i];
-		while (node) {
-			tmp = node;
-			node = node->next;
-			avc_clear_avc_entry(&tmp->ae);
-			tmp->next = avc_node_freelist;
-			avc_node_freelist = tmp;
-			avc_cache.active_nodes--;
-		}
-		avc_cache.slots[i] = 0;
-	}
-	avc_cache.lru_hint = 0;
-
-	avc_release_lock(avc_lock);
-
-	memset(&cache_stats, 0, sizeof(cache_stats));
-
-	for (c = avc_callbacks; c; c = c->next) {
-		if (c->events & AVC_CALLBACK_RESET) {
-			ret = c->callback(AVC_CALLBACK_RESET, 0, 0, 0, 0, 0);
-			if (ret && !rc) {
-				rc = ret;
-				errsave = errno;
-			}
-		}
-	}
-	errno = errsave;
-	return rc;
-}
-
-hidden_def(avc_reset)
-
-void avc_destroy(void)
-{
-	struct avc_callback_node *c;
-	struct avc_node *node, *tmp;
-	int i;
-	/* avc_init needs to be called before this function */
-	assert(avc_running);
-
-	avc_get_lock(avc_lock);
-
-	if (avc_using_threads)
-		avc_stop_thread(avc_netlink_thread);
-	avc_netlink_close();
-
-	for (i = 0; i < AVC_CACHE_SLOTS; i++) {
-		node = avc_cache.slots[i];
-		while (node) {
-			tmp = node;
-			node = node->next;
-			avc_free(tmp);
-		}
-	}
-	while (avc_node_freelist) {
-		tmp = avc_node_freelist;
-		avc_node_freelist = tmp->next;
-		avc_free(tmp);
-	}
-	avc_release_lock(avc_lock);
-
-	while (avc_callbacks) {
-		c = avc_callbacks;
-		avc_callbacks = c->next;
-		avc_free(c);
-	}
-	sidtab_destroy(&avc_sidtab);
-	avc_free_lock(avc_lock);
-	avc_free_lock(avc_log_lock);
-	avc_free(avc_audit_buf);
-	avc_running = 0;
-}
-
-/* ratelimit stuff put aside for now --EFW */
-#if 0
-/*
- * Copied from net/core/utils.c:net_ratelimit and modified for
- * use by the AVC audit facility.
- */
-#define AVC_MSG_COST	5*HZ
-#define AVC_MSG_BURST	10*5*HZ
-
-/*
- * This enforces a rate limit: not more than one kernel message
- * every 5secs to make a denial-of-service attack impossible.
- */
-static int avc_ratelimit(void)
-{
-	static unsigned long toks = 10 * 5 * HZ;
-	static unsigned long last_msg;
-	static int missed, rc = 0;
-	unsigned long now = jiffies;
-	void *ratelimit_lock = avc_alloc_lock();
-
-	avc_get_lock(ratelimit_lock);
-	toks += now - last_msg;
-	last_msg = now;
-	if (toks > AVC_MSG_BURST)
-		toks = AVC_MSG_BURST;
-	if (toks >= AVC_MSG_COST) {
-		int lost = missed;
-		missed = 0;
-		toks -= AVC_MSG_COST;
-		avc_release_lock(ratelimit_lock);
-		if (lost) {
-			avc_log(SELINUX_WARNING,
-				"%s:  %d messages suppressed.\n", avc_prefix,
-				lost);
-		}
-		rc = 1;
-		goto out;
-	}
-	missed++;
-	avc_release_lock(ratelimit_lock);
-      out:
-	avc_free_lock(ratelimit_lock);
-	return rc;
-}
-
-static inline int check_avc_ratelimit(void)
-{
-	if (avc_enforcing)
-		return avc_ratelimit();
-	else {
-		/* If permissive, then never suppress messages. */
-		return 1;
-	}
-}
-#endif				/* ratelimit stuff */
-
-/**
- * avc_dump_av - Display an access vector in human-readable form.
- * @tclass: target security class
- * @av: access vector
- */
-static void avc_dump_av(security_class_t tclass, access_vector_t av)
-{
-	const char *permstr;
-	access_vector_t bit = 1;
-
-	if (av == 0) {
-		log_append(avc_audit_buf, " null");
-		return;
-	}
-
-	log_append(avc_audit_buf, " {");
-
-	while (av) {
-		if (av & bit) {
-			permstr = security_av_perm_to_string(tclass, bit);
-			if (!permstr)
-				break;
-			log_append(avc_audit_buf, " %s", permstr);
-			av &= ~bit;
-		}
-		bit <<= 1;
-	}
-
-	if (av)
-		log_append(avc_audit_buf, " 0x%x", av);
-	log_append(avc_audit_buf, " }");
-}
-
-/**
- * avc_dump_query - Display a SID pair and a class in human-readable form.
- * @ssid: source security identifier
- * @tsid: target security identifier
- * @tclass: target security class
- */
-static void avc_dump_query(security_id_t ssid, security_id_t tsid,
-			   security_class_t tclass)
-{
-	avc_get_lock(avc_lock);
-
-	log_append(avc_audit_buf, "scontext=%s tcontext=%s",
-		   ssid->ctx, tsid->ctx);
-
-	avc_release_lock(avc_lock);
-	log_append(avc_audit_buf, " tclass=%s",
-		   security_class_to_string(tclass));
-}
-
-void avc_audit(security_id_t ssid, security_id_t tsid,
-	       security_class_t tclass, access_vector_t requested,
-	       struct av_decision *avd, int result, void *a)
-{
-	access_vector_t denied, audited;
-
-	denied = requested & ~avd->allowed;
-	if (denied)
-		audited = denied & avd->auditdeny;
-	else if (!requested || result)
-		audited = denied = requested;
-	else
-		audited = requested & avd->auditallow;
-	if (!audited)
-		return;
-#if 0
-	if (!check_avc_ratelimit())
-		return;
-#endif
-	/* prevent overlapping buffer writes */
-	avc_get_lock(avc_log_lock);
-	snprintf(avc_audit_buf, AVC_AUDIT_BUFSIZE,
-		 "%s:  %s ", avc_prefix, (denied || !requested) ? "denied" : "granted");
-	avc_dump_av(tclass, audited);
-	log_append(avc_audit_buf, " for ");
-
-	/* get any extra information printed by the callback */
-	avc_suppl_audit(a, tclass, avc_audit_buf + strlen(avc_audit_buf),
-			AVC_AUDIT_BUFSIZE - strlen(avc_audit_buf));
-
-	log_append(avc_audit_buf, " ");
-	avc_dump_query(ssid, tsid, tclass);
-
-	/* append permissive=0|1 like the kernel at the end */
-	if (denied || !requested)
-		log_append(avc_audit_buf, " permissive=%d", !result);
-
-	log_append(avc_audit_buf, "\n");
-	avc_log(SELINUX_AVC, "%s", avc_audit_buf);
-
-	avc_release_lock(avc_log_lock);
-}
-
-hidden_def(avc_audit)
-
-
-static void avd_init(struct av_decision *avd)
-{
-	avd->allowed = 0;
-	avd->auditallow = 0;
-	avd->auditdeny = 0xffffffff;
-	avd->seqno = avc_cache.latest_notif;
-	avd->flags = 0;
-}
-
-int avc_has_perm_noaudit(security_id_t ssid,
-			 security_id_t tsid,
-			 security_class_t tclass,
-			 access_vector_t requested,
-			 struct avc_entry_ref *aeref, struct av_decision *avd)
-{
-	struct avc_entry *ae;
-	int rc = 0;
-	struct avc_entry entry;
-	access_vector_t denied;
-	struct avc_entry_ref ref;
-
-	if (avd)
-		avd_init(avd);
-
-	if (!avc_using_threads && !avc_app_main_loop) {
-		(void)avc_netlink_check_nb();
-	}
-
-	if (!aeref) {
-		avc_entry_ref_init(&ref);
-		aeref = &ref;
-	}
-
-	avc_get_lock(avc_lock);
-	avc_cache_stats_incr(entry_lookups);
-	ae = aeref->ae;
-	if (ae) {
-		if (ae->ssid == ssid &&
-		    ae->tsid == tsid &&
-		    ae->tclass == tclass &&
-		    ((ae->avd.decided & requested) == requested)) {
-			avc_cache_stats_incr(entry_hits);
-			ae->used = 1;
-		} else {
-			avc_cache_stats_incr(entry_discards);
-			ae = 0;
-		}
-	}
-
-	if (!ae) {
-		avc_cache_stats_incr(entry_misses);
-		rc = avc_lookup(ssid, tsid, tclass, requested, aeref);
-		if (rc) {
-			rc = security_compute_av(ssid->ctx, tsid->ctx,
-						 tclass, requested,
-						 &entry.avd);
-			if (rc && errno == EINVAL && !avc_enforcing) {
-				rc = errno = 0;
-				goto out;
-			}
-			if (rc)
-				goto out;
-			rc = avc_insert(ssid, tsid, tclass, &entry, aeref);
-			if (rc)
-				goto out;
-		}
-		ae = aeref->ae;
-	}
-
-	if (avd)
-		memcpy(avd, &ae->avd, sizeof(*avd));
-
-	denied = requested & ~(ae->avd.allowed);
-
-	if (!requested || denied) {
-		if (!avc_enforcing ||
-		    (ae->avd.flags & SELINUX_AVD_FLAGS_PERMISSIVE))
-			ae->avd.allowed |= requested;
-		else {
-			errno = EACCES;
-			rc = -1;
-		}
-	}
-
-      out:
-	avc_release_lock(avc_lock);
-	return rc;
-}
-
-hidden_def(avc_has_perm_noaudit)
-
-int avc_has_perm(security_id_t ssid, security_id_t tsid,
-		 security_class_t tclass, access_vector_t requested,
-		 struct avc_entry_ref *aeref, void *auditdata)
-{
-	struct av_decision avd;
-	int errsave, rc;
-
-	rc = avc_has_perm_noaudit(ssid, tsid, tclass, requested, aeref, &avd);
-	errsave = errno;
-	avc_audit(ssid, tsid, tclass, requested, &avd, rc, auditdata);
-	errno = errsave;
-	return rc;
-}
-
-int avc_compute_create(security_id_t ssid,  security_id_t tsid,
-		       security_class_t tclass, security_id_t *newsid)
-{
-	int rc;
-	struct avc_entry_ref aeref;
-	struct avc_entry entry;
-	char * ctx;
-
-	*newsid = NULL;
-	avc_entry_ref_init(&aeref);
-
-	avc_get_lock(avc_lock);
-
-	/* check for a cached entry */
-	rc = avc_lookup(ssid, tsid, tclass, 0, &aeref);
-	if (rc) {
-		/* need to make a cache entry for this tuple */
-		rc = security_compute_av(ssid->ctx, tsid->ctx,
-					 tclass, 0, &entry.avd);
-		if (rc)
-			goto out;
-		rc = avc_insert(ssid, tsid, tclass, &entry, &aeref);
-		if (rc)
-			goto out;
-	}
-
-	/* check for a saved compute_create value */
-	if (!aeref.ae->create_sid) {
-		/* need to query the kernel policy */
-		rc = security_compute_create(ssid->ctx, tsid->ctx, tclass,
-						 &ctx);
-		if (rc)
-			goto out;
-		rc = sidtab_context_to_sid(&avc_sidtab, ctx, newsid);
-		freecon(ctx);
-		if (rc)
-			goto out;
-
-		aeref.ae->create_sid = *newsid;
-	} else {
-		/* found saved value */
-		*newsid = aeref.ae->create_sid;
-	}
-
-	rc = 0;
-out:
-	avc_release_lock(avc_lock);
-	return rc;
-}
-
-int avc_add_callback(int (*callback) (uint32_t event, security_id_t ssid,
-				      security_id_t tsid,
-				      security_class_t tclass,
-				      access_vector_t perms,
-				      access_vector_t * out_retained),
-		     uint32_t events, security_id_t ssid,
-		     security_id_t tsid,
-		     security_class_t tclass, access_vector_t perms)
-{
-	struct avc_callback_node *c;
-	int rc = 0;
-
-	c = avc_malloc(sizeof(*c));
-	if (!c) {
-		rc = -1;
-		goto out;
-	}
-
-	c->callback = callback;
-	c->events = events;
-	c->ssid = ssid;
-	c->tsid = tsid;
-	c->tclass = tclass;
-	c->perms = perms;
-	c->next = avc_callbacks;
-	avc_callbacks = c;
-      out:
-	return rc;
-}
-
-static inline int avc_sidcmp(security_id_t x, security_id_t y)
-{
-	return (x == y || x == SECSID_WILD || y == SECSID_WILD);
-}
-
-static inline void avc_update_node(uint32_t event, struct avc_node *node,
-				   access_vector_t perms)
-{
-	switch (event) {
-	case AVC_CALLBACK_GRANT:
-		node->ae.avd.allowed |= perms;
-		break;
-	case AVC_CALLBACK_TRY_REVOKE:
-	case AVC_CALLBACK_REVOKE:
-		node->ae.avd.allowed &= ~perms;
-		break;
-	case AVC_CALLBACK_AUDITALLOW_ENABLE:
-		node->ae.avd.auditallow |= perms;
-		break;
-	case AVC_CALLBACK_AUDITALLOW_DISABLE:
-		node->ae.avd.auditallow &= ~perms;
-		break;
-	case AVC_CALLBACK_AUDITDENY_ENABLE:
-		node->ae.avd.auditdeny |= perms;
-		break;
-	case AVC_CALLBACK_AUDITDENY_DISABLE:
-		node->ae.avd.auditdeny &= ~perms;
-		break;
-	}
-}
-
-static int avc_update_cache(uint32_t event, security_id_t ssid,
-			    security_id_t tsid, security_class_t tclass,
-			    access_vector_t perms)
-{
-	struct avc_node *node;
-	int i;
-
-	avc_get_lock(avc_lock);
-
-	if (ssid == SECSID_WILD || tsid == SECSID_WILD) {
-		/* apply to all matching nodes */
-		for (i = 0; i < AVC_CACHE_SLOTS; i++) {
-			for (node = avc_cache.slots[i]; node; node = node->next) {
-				if (avc_sidcmp(ssid, node->ae.ssid) &&
-				    avc_sidcmp(tsid, node->ae.tsid) &&
-				    tclass == node->ae.tclass) {
-					avc_update_node(event, node, perms);
-				}
-			}
-		}
-	} else {
-		/* apply to one node */
-		node = avc_search_node(ssid, tsid, tclass, 0);
-		if (node) {
-			avc_update_node(event, node, perms);
-		}
-	}
-
-	avc_release_lock(avc_lock);
-
-	return 0;
-}
-
-/* avc_control - update cache and call callbacks
- *
- * This should not be called directly; use the individual event
- * functions instead.
- */
-static int avc_control(uint32_t event, security_id_t ssid,
-		       security_id_t tsid, security_class_t tclass,
-		       access_vector_t perms,
-		       uint32_t seqno, access_vector_t * out_retained)
-{
-	struct avc_callback_node *c;
-	access_vector_t tretained = 0, cretained = 0;
-	int ret, rc = 0, errsave = 0;
-	errno = 0;
-
-	/*
-	 * try_revoke only removes permissions from the cache
-	 * state if they are not retained by the object manager.
-	 * Hence, try_revoke must wait until after the callbacks have
-	 * been invoked to update the cache state.
-	 */
-	if (event != AVC_CALLBACK_TRY_REVOKE)
-		avc_update_cache(event, ssid, tsid, tclass, perms);
-
-	for (c = avc_callbacks; c; c = c->next) {
-		if ((c->events & event) &&
-		    avc_sidcmp(c->ssid, ssid) &&
-		    avc_sidcmp(c->tsid, tsid) &&
-		    c->tclass == tclass && (c->perms & perms)) {
-			cretained = 0;
-			ret = c->callback(event, ssid, tsid, tclass,
-					  (c->perms & perms), &cretained);
-			if (ret && !rc) {
-				rc = ret;
-				errsave = errno;
-			}
-			if (!ret)
-				tretained |= cretained;
-		}
-	}
-
-	if (event == AVC_CALLBACK_TRY_REVOKE) {
-		/* revoke any unretained permissions */
-		perms &= ~tretained;
-		avc_update_cache(event, ssid, tsid, tclass, perms);
-		*out_retained = tretained;
-	}
-
-	avc_get_lock(avc_lock);
-	if (seqno > avc_cache.latest_notif)
-		avc_cache.latest_notif = seqno;
-	avc_release_lock(avc_lock);
-
-	errno = errsave;
-	return rc;
-}
-
-/**
- * avc_ss_grant - Grant previously denied permissions.
- * @ssid: source security identifier or %SECSID_WILD
- * @tsid: target security identifier or %SECSID_WILD
- * @tclass: target security class
- * @perms: permissions to grant
- * @seqno: policy sequence number
- */
-int avc_ss_grant(security_id_t ssid, security_id_t tsid,
-		 security_class_t tclass, access_vector_t perms,
-		 uint32_t seqno)
-{
-	return avc_control(AVC_CALLBACK_GRANT,
-			   ssid, tsid, tclass, perms, seqno, 0);
-}
-
-/**
- * avc_ss_try_revoke - Try to revoke previously granted permissions.
- * @ssid: source security identifier or %SECSID_WILD
- * @tsid: target security identifier or %SECSID_WILD
- * @tclass: target security class
- * @perms: permissions to grant
- * @seqno: policy sequence number
- * @out_retained: subset of @perms that are retained
- *
- * Try to revoke previously granted permissions, but
- * only if they are not retained as migrated permissions.
- * Return the subset of permissions that are retained via @out_retained.
- */
-int avc_ss_try_revoke(security_id_t ssid, security_id_t tsid,
-		      security_class_t tclass,
-		      access_vector_t perms, uint32_t seqno,
-		      access_vector_t * out_retained)
-{
-	return avc_control(AVC_CALLBACK_TRY_REVOKE,
-			   ssid, tsid, tclass, perms, seqno, out_retained);
-}
-
-/**
- * avc_ss_revoke - Revoke previously granted permissions.
- * @ssid: source security identifier or %SECSID_WILD
- * @tsid: target security identifier or %SECSID_WILD
- * @tclass: target security class
- * @perms: permissions to grant
- * @seqno: policy sequence number
- *
- * Revoke previously granted permissions, even if
- * they are retained as migrated permissions.
- */
-int avc_ss_revoke(security_id_t ssid, security_id_t tsid,
-		  security_class_t tclass, access_vector_t perms,
-		  uint32_t seqno)
-{
-	return avc_control(AVC_CALLBACK_REVOKE,
-			   ssid, tsid, tclass, perms, seqno, 0);
-}
-
-/**
- * avc_ss_reset - Flush the cache and revalidate migrated permissions.
- * @seqno: policy sequence number
- */
-int avc_ss_reset(uint32_t seqno)
-{
-	int rc;
-
-	rc = avc_reset();
-
-	avc_get_lock(avc_lock);
-	if (seqno > avc_cache.latest_notif)
-		avc_cache.latest_notif = seqno;
-	avc_release_lock(avc_lock);
-
-	return rc;
-}
-
-/**
- * avc_ss_set_auditallow - Enable or disable auditing of granted permissions.
- * @ssid: source security identifier or %SECSID_WILD
- * @tsid: target security identifier or %SECSID_WILD
- * @tclass: target security class
- * @perms: permissions to grant
- * @seqno: policy sequence number
- * @enable: enable flag.
- */
-int avc_ss_set_auditallow(security_id_t ssid, security_id_t tsid,
-			  security_class_t tclass, access_vector_t perms,
-			  uint32_t seqno, uint32_t enable)
-{
-	if (enable)
-		return avc_control(AVC_CALLBACK_AUDITALLOW_ENABLE,
-				   ssid, tsid, tclass, perms, seqno, 0);
-	else
-		return avc_control(AVC_CALLBACK_AUDITALLOW_DISABLE,
-				   ssid, tsid, tclass, perms, seqno, 0);
-}
-
-/**
- * avc_ss_set_auditdeny - Enable or disable auditing of denied permissions.
- * @ssid: source security identifier or %SECSID_WILD
- * @tsid: target security identifier or %SECSID_WILD
- * @tclass: target security class
- * @perms: permissions to grant
- * @seqno: policy sequence number
- * @enable: enable flag.
- */
-int avc_ss_set_auditdeny(security_id_t ssid, security_id_t tsid,
-			 security_class_t tclass, access_vector_t perms,
-			 uint32_t seqno, uint32_t enable)
-{
-	if (enable)
-		return avc_control(AVC_CALLBACK_AUDITDENY_ENABLE,
-				   ssid, tsid, tclass, perms, seqno, 0);
-	else
-		return avc_control(AVC_CALLBACK_AUDITDENY_DISABLE,
-				   ssid, tsid, tclass, perms, seqno, 0);
-}
diff --git a/src/avc_internal.c b/src/avc_internal.c
deleted file mode 100644
index c89a886..0000000
--- a/src/avc_internal.c
+++ /dev/null
@@ -1,292 +0,0 @@
-/*
- * Callbacks for user-supplied memory allocation, supplemental
- * auditing, and locking routines.
- *
- * Author : Eamon Walsh <ewalsh@epoch.ncsc.mil>
- *
- * Netlink code derived in part from sample code by
- * James Morris <jmorris@redhat.com>.
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <poll.h>
-#include <sys/types.h>
-#include <sys/socket.h>
-#include <linux/types.h>
-#include <linux/netlink.h>
-#include "callbacks.h"
-#include "selinux_netlink.h"
-#include "avc_internal.h"
-
-#ifndef NETLINK_SELINUX
-#define NETLINK_SELINUX 7
-#endif
-
-/* callback pointers */
-void *(*avc_func_malloc) (size_t) = NULL;
-void (*avc_func_free) (void *) = NULL;
-
-void (*avc_func_log) (const char *, ...) = NULL;
-void (*avc_func_audit) (void *, security_class_t, char *, size_t) = NULL;
-
-int avc_using_threads = 0;
-int avc_app_main_loop = 0;
-void *(*avc_func_create_thread) (void (*)(void)) = NULL;
-void (*avc_func_stop_thread) (void *) = NULL;
-
-void *(*avc_func_alloc_lock) (void) = NULL;
-void (*avc_func_get_lock) (void *) = NULL;
-void (*avc_func_release_lock) (void *) = NULL;
-void (*avc_func_free_lock) (void *) = NULL;
-
-/* message prefix string and avc enforcing mode */
-char avc_prefix[AVC_PREFIX_SIZE] = "uavc";
-int avc_running = 0;
-int avc_enforcing = 1;
-int avc_setenforce = 0;
-int avc_netlink_trouble = 0;
-
-/* netlink socket code */
-static int fd = -1;
-
-int avc_netlink_open(int blocking)
-{
-	int len, rc = 0;
-	struct sockaddr_nl addr;
-
-	fd = socket(PF_NETLINK, SOCK_RAW | SOCK_CLOEXEC, NETLINK_SELINUX);
-	if (fd < 0) {
-		rc = fd;
-		goto out;
-	}
-
-	if (!blocking && fcntl(fd, F_SETFL, O_NONBLOCK)) {
-		close(fd);
-		fd = -1;
-		rc = -1;
-		goto out;
-	}
-
-	len = sizeof(addr);
-
-	memset(&addr, 0, len);
-	addr.nl_family = AF_NETLINK;
-	addr.nl_groups = SELNL_GRP_AVC;
-
-	if (bind(fd, (struct sockaddr *)&addr, len) < 0) {
-		close(fd);
-		fd = -1;
-		rc = -1;
-		goto out;
-	}
-      out:
-	return rc;
-}
-
-void avc_netlink_close(void)
-{
-	if (fd >= 0)
-		close(fd);
-	fd = -1;	
-}
-
-static int avc_netlink_receive(char *buf, unsigned buflen, int blocking)
-{
-	int rc;
-	struct pollfd pfd = { fd, POLLIN | POLLPRI, 0 };
-	struct sockaddr_nl nladdr;
-	socklen_t nladdrlen = sizeof nladdr;
-	struct nlmsghdr *nlh = (struct nlmsghdr *)buf;
-
-	do {
-		rc = poll(&pfd, 1, (blocking ? -1 : 0));
-	} while (rc < 0 && errno == EINTR);
-
-	if (rc == 0 && !blocking) {
-		errno = EWOULDBLOCK;
-		return -1;
-	}
-	else if (rc < 1) {
-		avc_log(SELINUX_ERROR, "%s:  netlink poll: error %d\n",
-			avc_prefix, errno);
-		return rc;
-	}
-
-	rc = recvfrom(fd, buf, buflen, 0, (struct sockaddr *)&nladdr,
-		      &nladdrlen);
-	if (rc < 0)
-		return rc;
-
-	if (nladdrlen != sizeof nladdr) {
-		avc_log(SELINUX_WARNING,
-			"%s:  warning: netlink address truncated, len %d?\n",
-			avc_prefix, nladdrlen);
-		return -1;
-	}
-
-	if (nladdr.nl_pid) {
-		avc_log(SELINUX_WARNING,
-			"%s:  warning: received spoofed netlink packet from: %d\n",
-			avc_prefix, nladdr.nl_pid);
-		return -1;
-	}
-
-	if (rc == 0) {
-		avc_log(SELINUX_WARNING,
-			"%s:  warning: received EOF on netlink socket\n",
-			avc_prefix);
-		errno = EBADFD;
-		return -1;
-	}
-
-	if (nlh->nlmsg_flags & MSG_TRUNC || nlh->nlmsg_len > (unsigned)rc) {
-		avc_log(SELINUX_WARNING,
-			"%s:  warning: incomplete netlink message\n",
-			avc_prefix);
-		return -1;
-	}
-
-	return 0;
-}
-
-static int avc_netlink_process(char *buf)
-{
-	int rc;
-	struct nlmsghdr *nlh = (struct nlmsghdr *)buf;
-
-	switch (nlh->nlmsg_type) {
-	case NLMSG_ERROR:{
-		struct nlmsgerr *err = NLMSG_DATA(nlh);
-
-		/* Netlink ack */
-		if (err->error == 0)
-			break;
-
-		errno = -err->error;
-		avc_log(SELINUX_ERROR,
-			"%s:  netlink error: %d\n", avc_prefix, errno);
-		return -1;
-	}
-
-	case SELNL_MSG_SETENFORCE:{
-		struct selnl_msg_setenforce *msg = NLMSG_DATA(nlh);
-		avc_log(SELINUX_INFO,
-			"%s:  received setenforce notice (enforcing=%d)\n",
-			avc_prefix, msg->val);
-		if (avc_setenforce)
-			break;
-		avc_enforcing = msg->val;
-		if (avc_enforcing && (rc = avc_ss_reset(0)) < 0) {
-			avc_log(SELINUX_ERROR,
-				"%s:  cache reset returned %d (errno %d)\n",
-				avc_prefix, rc, errno);
-			return rc;
-		}
-		rc = selinux_netlink_setenforce(msg->val);
-		if (rc < 0)
-			return rc;
-		break;
-	}
-
-	case SELNL_MSG_POLICYLOAD:{
-		struct selnl_msg_policyload *msg = NLMSG_DATA(nlh);
-		avc_log(SELINUX_INFO,
-			"%s:  received policyload notice (seqno=%d)\n",
-			avc_prefix, msg->seqno);
-		rc = avc_ss_reset(msg->seqno);
-		if (rc < 0) {
-			avc_log(SELINUX_ERROR,
-				"%s:  cache reset returned %d (errno %d)\n",
-				avc_prefix, rc, errno);
-			return rc;
-		}
-		rc = selinux_netlink_policyload(msg->seqno);
-		if (rc < 0)
-			return rc;
-		break;
-	}
-
-	default:
-		avc_log(SELINUX_WARNING,
-			"%s:  warning: unknown netlink message %d\n",
-			avc_prefix, nlh->nlmsg_type);
-	}
-	return 0;
-}
-
-int avc_netlink_check_nb(void)
-{
-	int rc;
-	char buf[1024] __attribute__ ((aligned));
-
-	while (1) {
-		errno = 0;
-		rc = avc_netlink_receive(buf, sizeof(buf), 0);
-		if (rc < 0) {
-			if (errno == EWOULDBLOCK)
-				return 0;
-			if (errno == 0 || errno == EINTR)
-				continue;
-			else {
-				avc_log(SELINUX_ERROR,
-					"%s:  netlink recvfrom: error %d\n",
-					avc_prefix, errno);
-				return rc;
-			}
-		}
-
-		(void)avc_netlink_process(buf);
-	}
-	return 0;
-}
-
-/* run routine for the netlink listening thread */
-void avc_netlink_loop(void)
-{
-	int rc;
-	char buf[1024] __attribute__ ((aligned));
-
-	while (1) {
-		errno = 0;
-		rc = avc_netlink_receive(buf, sizeof(buf), 1);
-		if (rc < 0) {
-			if (errno == 0 || errno == EINTR)
-				continue;
-			else {
-				avc_log(SELINUX_ERROR,
-					"%s:  netlink recvfrom: error %d\n",
-					avc_prefix, errno);
-				break;
-			}
-		}
-
-		rc = avc_netlink_process(buf);
-		if (rc < 0)
-			break;
-	}
-
-	close(fd);
-	fd = -1;
-	avc_netlink_trouble = 1;
-	avc_log(SELINUX_ERROR,
-		"%s:  netlink thread: errors encountered, terminating\n",
-		avc_prefix);
-}
-
-int avc_netlink_acquire_fd(void)
-{
-    avc_app_main_loop = 1;
-
-    return fd;
-}
-
-void avc_netlink_release_fd(void)
-{
-    avc_app_main_loop = 0;
-}
diff --git a/src/avc_internal.h b/src/avc_internal.h
deleted file mode 100644
index 53610e8..0000000
--- a/src/avc_internal.h
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * This file describes the internal interface used by the AVC
- * for calling the user-supplied memory allocation, supplemental
- * auditing, and locking routine, as well as incrementing the
- * statistics fields.
- *
- * Author : Eamon Walsh <ewalsh@epoch.ncsc.mil>
- */
-#ifndef _SELINUX_AVC_INTERNAL_H_
-#define _SELINUX_AVC_INTERNAL_H_
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <selinux/avc.h>
-#include "callbacks.h"
-#include "dso.h"
-
-/* callback pointers */
-extern void *(*avc_func_malloc) (size_t) hidden;
-extern void (*avc_func_free) (void *)hidden;
-
-extern void (*avc_func_log) (const char *, ...)hidden;
-extern void (*avc_func_audit) (void *, security_class_t, char *, size_t)hidden;
-
-extern int avc_using_threads hidden;
-extern int avc_app_main_loop hidden;
-extern void *(*avc_func_create_thread) (void (*)(void))hidden;
-extern void (*avc_func_stop_thread) (void *)hidden;
-
-extern void *(*avc_func_alloc_lock) (void)hidden;
-extern void (*avc_func_get_lock) (void *)hidden;
-extern void (*avc_func_release_lock) (void *)hidden;
-extern void (*avc_func_free_lock) (void *)hidden;
-
-static inline void set_callbacks(const struct avc_memory_callback *mem_cb,
-				 const struct avc_log_callback *log_cb,
-				 const struct avc_thread_callback *thread_cb,
-				 const struct avc_lock_callback *lock_cb)
-{
-	if (mem_cb) {
-		avc_func_malloc = mem_cb->func_malloc;
-		avc_func_free = mem_cb->func_free;
-	}
-	if (log_cb) {
-		avc_func_log = log_cb->func_log;
-		avc_func_audit = log_cb->func_audit;
-	}
-	if (thread_cb) {
-		avc_using_threads = 1;
-		avc_func_create_thread = thread_cb->func_create_thread;
-		avc_func_stop_thread = thread_cb->func_stop_thread;
-	}
-	if (lock_cb) {
-		avc_func_alloc_lock = lock_cb->func_alloc_lock;
-		avc_func_get_lock = lock_cb->func_get_lock;
-		avc_func_release_lock = lock_cb->func_release_lock;
-		avc_func_free_lock = lock_cb->func_free_lock;
-	}
-}
-
-/* message prefix and enforcing mode*/
-#define AVC_PREFIX_SIZE 16
-extern char avc_prefix[AVC_PREFIX_SIZE] hidden;
-extern int avc_running hidden;
-extern int avc_enforcing hidden;
-extern int avc_setenforce hidden;
-
-/* user-supplied callback interface for avc */
-static inline void *avc_malloc(size_t size)
-{
-	return avc_func_malloc ? avc_func_malloc(size) : malloc(size);
-}
-
-static inline void avc_free(void *ptr)
-{
-	if (avc_func_free)
-		avc_func_free(ptr);
-	else
-		free(ptr);
-}
-
-/* this is a macro in order to use the variadic capability. */
-#define avc_log(type, format...) \
-  if (avc_func_log) \
-    avc_func_log(format); \
-  else \
-    selinux_log(type, format);
-
-static inline void avc_suppl_audit(void *ptr, security_class_t class,
-				   char *buf, size_t len)
-{
-	if (avc_func_audit)
-		avc_func_audit(ptr, class, buf, len);
-	else
-		selinux_audit(ptr, class, buf, len);
-}
-
-static inline void *avc_create_thread(void (*run) (void))
-{
-	return avc_func_create_thread ? avc_func_create_thread(run) : NULL;
-}
-
-static inline void avc_stop_thread(void *thread)
-{
-	if (avc_func_stop_thread)
-		avc_func_stop_thread(thread);
-}
-
-static inline void *avc_alloc_lock(void)
-{
-	return avc_func_alloc_lock ? avc_func_alloc_lock() : NULL;
-}
-
-static inline void avc_get_lock(void *lock)
-{
-	if (avc_func_get_lock)
-		avc_func_get_lock(lock);
-}
-
-static inline void avc_release_lock(void *lock)
-{
-	if (avc_func_release_lock)
-		avc_func_release_lock(lock);
-}
-
-static inline void avc_free_lock(void *lock)
-{
-	if (avc_func_free_lock)
-		avc_func_free_lock(lock);
-}
-
-/* statistics helper routines */
-#ifdef AVC_CACHE_STATS
-
-#define avc_cache_stats_incr(field) \
-  cache_stats.field ++;
-#define avc_cache_stats_add(field, num) \
-  cache_stats.field += num;
-
-#else
-
-#define avc_cache_stats_incr(field)
-#define avc_cache_stats_add(field, num)
-
-#endif
-
-/* logging helper routines */
-#define AVC_AUDIT_BUFSIZE 1024
-
-/* again, we need the variadic capability here */
-#define log_append(buf,format...) \
-  snprintf(buf+strlen(buf), AVC_AUDIT_BUFSIZE-strlen(buf), format)
-
-/* internal callbacks */
-int avc_ss_grant(security_id_t ssid, security_id_t tsid,
-		 security_class_t tclass, access_vector_t perms,
-		 uint32_t seqno) hidden;
-int avc_ss_try_revoke(security_id_t ssid, security_id_t tsid,
-		      security_class_t tclass,
-		      access_vector_t perms, uint32_t seqno,
-		      access_vector_t * out_retained) hidden;
-int avc_ss_revoke(security_id_t ssid, security_id_t tsid,
-		  security_class_t tclass, access_vector_t perms,
-		  uint32_t seqno) hidden;
-int avc_ss_reset(uint32_t seqno) hidden;
-int avc_ss_set_auditallow(security_id_t ssid, security_id_t tsid,
-			  security_class_t tclass, access_vector_t perms,
-			  uint32_t seqno, uint32_t enable) hidden;
-int avc_ss_set_auditdeny(security_id_t ssid, security_id_t tsid,
-			 security_class_t tclass, access_vector_t perms,
-			 uint32_t seqno, uint32_t enable) hidden;
-
-/* netlink kernel message code */
-extern int avc_netlink_trouble hidden;
-
-hidden_proto(avc_av_stats)
-    hidden_proto(avc_cleanup)
-    hidden_proto(avc_reset)
-    hidden_proto(avc_audit)
-    hidden_proto(avc_has_perm_noaudit)
-#endif				/* _SELINUX_AVC_INTERNAL_H_ */
diff --git a/src/avc_sidtab.c b/src/avc_sidtab.c
deleted file mode 100644
index 52f21df..0000000
--- a/src/avc_sidtab.c
+++ /dev/null
@@ -1,152 +0,0 @@
-/*
- * Implementation of the userspace SID hashtable.
- *
- * Author : Eamon Walsh, <ewalsh@epoch.ncsc.mil>
- */
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdint.h>
-#include <string.h>
-#include "selinux_internal.h"
-#include <selinux/avc.h>
-#include "avc_sidtab.h"
-#include "avc_internal.h"
-
-static inline unsigned sidtab_hash(const char * key)
-{
-	char *p, *keyp;
-	unsigned int size;
-	unsigned int val;
-
-	val = 0;
-	keyp = (char *)key;
-	size = strlen(keyp);
-	for (p = keyp; (unsigned int)(p - keyp) < size; p++)
-		val =
-		    (val << 4 | (val >> (8 * sizeof(unsigned int) - 4))) ^ (*p);
-	return val & (SIDTAB_SIZE - 1);
-}
-
-int sidtab_init(struct sidtab *s)
-{
-	int i, rc = 0;
-
-	s->htable = (struct sidtab_node **)avc_malloc
-	    (sizeof(struct sidtab_node *) * SIDTAB_SIZE);
-
-	if (!s->htable) {
-		rc = -1;
-		goto out;
-	}
-	for (i = 0; i < SIDTAB_SIZE; i++)
-		s->htable[i] = NULL;
-	s->nel = 0;
-      out:
-	return rc;
-}
-
-int sidtab_insert(struct sidtab *s, const char * ctx)
-{
-	int hvalue, rc = 0;
-	struct sidtab_node *newnode;
-	char * newctx;
-
-	newnode = (struct sidtab_node *)avc_malloc(sizeof(*newnode));
-	if (!newnode) {
-		rc = -1;
-		goto out;
-	}
-	newctx = (char *) strdup(ctx);
-	if (!newctx) {
-		rc = -1;
-		avc_free(newnode);
-		goto out;
-	}
-
-	hvalue = sidtab_hash(newctx);
-	newnode->next = s->htable[hvalue];
-	newnode->sid_s.ctx = newctx;
-	newnode->sid_s.refcnt = 1;	/* unused */
-	s->htable[hvalue] = newnode;
-	s->nel++;
-      out:
-	return rc;
-}
-
-int
-sidtab_context_to_sid(struct sidtab *s,
-		      const char * ctx, security_id_t * sid)
-{
-	int hvalue, rc = 0;
-	struct sidtab_node *cur;
-
-	*sid = NULL;
-	hvalue = sidtab_hash(ctx);
-
-      loop:
-	cur = s->htable[hvalue];
-	while (cur != NULL && strcmp(cur->sid_s.ctx, ctx))
-		cur = cur->next;
-
-	if (cur == NULL) {	/* need to make a new entry */
-		rc = sidtab_insert(s, ctx);
-		if (rc)
-			goto out;
-		goto loop;	/* find the newly inserted node */
-	}
-
-	*sid = &cur->sid_s;
-      out:
-	return rc;
-}
-
-void sidtab_sid_stats(struct sidtab *h, char *buf, int buflen)
-{
-	int i, chain_len, slots_used, max_chain_len;
-	struct sidtab_node *cur;
-
-	slots_used = 0;
-	max_chain_len = 0;
-	for (i = 0; i < SIDTAB_SIZE; i++) {
-		cur = h->htable[i];
-		if (cur) {
-			slots_used++;
-			chain_len = 0;
-			while (cur) {
-				chain_len++;
-				cur = cur->next;
-			}
-
-			if (chain_len > max_chain_len)
-				max_chain_len = chain_len;
-		}
-	}
-
-	snprintf(buf, buflen,
-		 "%s:  %d SID entries and %d/%d buckets used, longest "
-		 "chain length %d\n", avc_prefix, h->nel, slots_used,
-		 SIDTAB_SIZE, max_chain_len);
-}
-
-void sidtab_destroy(struct sidtab *s)
-{
-	int i;
-	struct sidtab_node *cur, *temp;
-
-	if (!s)
-		return;
-
-	for (i = 0; i < SIDTAB_SIZE; i++) {
-		cur = s->htable[i];
-		while (cur != NULL) {
-			temp = cur;
-			cur = cur->next;
-			freecon(temp->sid_s.ctx);
-			avc_free(temp);
-		}
-		s->htable[i] = NULL;
-	}
-	avc_free(s->htable);
-	s->htable = NULL;
-}
diff --git a/src/avc_sidtab.h b/src/avc_sidtab.h
deleted file mode 100644
index bce9b87..0000000
--- a/src/avc_sidtab.h
+++ /dev/null
@@ -1,36 +0,0 @@
-/*
- * A security identifier table (sidtab) is a hash table
- * of security context structures indexed by SID value.
- */
-#ifndef _SELINUX_AVC_SIDTAB_H_
-#define _SELINUX_AVC_SIDTAB_H_
-
-#include <selinux/selinux.h>
-#include <selinux/avc.h>
-#include "dso.h"
-
-struct sidtab_node {
-	struct security_id sid_s;
-	struct sidtab_node *next;
-};
-
-#define SIDTAB_HASH_BITS 7
-#define SIDTAB_HASH_BUCKETS (1 << SIDTAB_HASH_BITS)
-#define SIDTAB_HASH_MASK (SIDTAB_HASH_BUCKETS-1)
-#define SIDTAB_SIZE SIDTAB_HASH_BUCKETS
-
-struct sidtab {
-	struct sidtab_node **htable;
-	unsigned nel;
-};
-
-int sidtab_init(struct sidtab *s) hidden;
-int sidtab_insert(struct sidtab *s, const char * ctx) hidden;
-
-int sidtab_context_to_sid(struct sidtab *s,
-			  const char * ctx, security_id_t * sid) hidden;
-
-void sidtab_sid_stats(struct sidtab *s, char *buf, int buflen) hidden;
-void sidtab_destroy(struct sidtab *s) hidden;
-
-#endif				/* _SELINUX_AVC_SIDTAB_H_ */
diff --git a/src/booleans.c b/src/booleans.c
deleted file mode 100644
index 17e0ad8..0000000
--- a/src/booleans.c
+++ /dev/null
@@ -1,263 +0,0 @@
-/*
- * Author: Karl MacMillan <kmacmillan@tresys.com>
- *
- * Modified:  
- *   Dan Walsh <dwalsh@redhat.com> - Added security_load_booleans().
- */
-
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <fcntl.h>
-#include <assert.h>
-#include <stdlib.h>
-#include <dirent.h>
-#include <string.h>
-#include <stdio.h>
-#include <unistd.h>
-#include <fnmatch.h>
-#include <limits.h>
-#include <ctype.h>
-#include <errno.h>
-
-#include "selinux_internal.h"
-#include "policy.h"
-
-#define SELINUX_BOOL_DIR "/booleans/"
-
-static int filename_select(const struct dirent *d)
-{
-	if (d->d_name[0] == '.'
-	    && (d->d_name[1] == '\0'
-		|| (d->d_name[1] == '.' && d->d_name[2] == '\0')))
-		return 0;
-	return 1;
-}
-
-int security_get_boolean_names(char ***names, int *len)
-{
-	char path[PATH_MAX];
-	int i, rc;
-	struct dirent **namelist;
-	char **n;
-
-	assert(len);
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s%s", selinux_mnt, SELINUX_BOOL_DIR);
-	*len = scandir(path, &namelist, &filename_select, alphasort);
-	if (*len <= 0) {
-		return -1;
-	}
-
-	n = (char **)malloc(sizeof(char *) * *len);
-	if (!n) {
-		rc = -1;
-		goto bad;
-	}
-
-	for (i = 0; i < *len; i++) {
-	        n[i] = strdup(namelist[i]->d_name);
-		if (!n[i]) {
-			rc = -1;
-			goto bad_freen;
-		}
-	}
-	rc = 0;
-	*names = n;
-      out:
-	for (i = 0; i < *len; i++) {
-		free(namelist[i]);
-	}
-	free(namelist);
-	return rc;
-      bad_freen:
-	for (--i; i >= 0; --i)
-		free(n[i]);
-	free(n);
-      bad:
-	goto out;
-}
-
-hidden_def(security_get_boolean_names)
-#define STRBUF_SIZE 3
-static int get_bool_value(const char *name, char **buf)
-{
-	int fd, len;
-	char *fname = NULL;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	*buf = (char *)malloc(sizeof(char) * (STRBUF_SIZE + 1));
-	if (!*buf)
-		goto out;
-	(*buf)[STRBUF_SIZE] = 0;
-
-	len = strlen(name) + strlen(selinux_mnt) + sizeof(SELINUX_BOOL_DIR);
-	fname = (char *)malloc(sizeof(char) * len);
-	if (!fname)
-		goto out;
-	snprintf(fname, len, "%s%s%s", selinux_mnt, SELINUX_BOOL_DIR, name);
-
-	fd = open(fname, O_RDONLY);
-	if (fd < 0)
-		goto out;
-
-	len = read(fd, *buf, STRBUF_SIZE);
-	close(fd);
-	if (len != STRBUF_SIZE)
-		goto out;
-
-	free(fname);
-	return 0;
-      out:
-	if (*buf)
-		free(*buf);
-	if (fname)
-		free(fname);
-	return -1;
-}
-
-int security_get_boolean_pending(const char *name)
-{
-	char *buf;
-	int val;
-
-	if (get_bool_value(name, &buf))
-		return -1;
-
-	if (atoi(&buf[1]))
-		val = 1;
-	else
-		val = 0;
-	free(buf);
-	return val;
-}
-
-int security_get_boolean_active(const char *name)
-{
-	char *buf;
-	int val;
-
-	if (get_bool_value(name, &buf))
-		return -1;
-
-	buf[1] = '\0';
-	if (atoi(buf))
-		val = 1;
-	else
-		val = 0;
-	free(buf);
-	return val;
-}
-
-hidden_def(security_get_boolean_active)
-
-int security_set_boolean(const char *name, int value)
-{
-	int fd, ret, len;
-	char buf[2], *fname;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-	if (value < 0 || value > 1) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	len = strlen(name) + strlen(selinux_mnt) + sizeof(SELINUX_BOOL_DIR);
-	fname = (char *)malloc(sizeof(char) * len);
-	if (!fname)
-		return -1;
-	snprintf(fname, len, "%s%s%s", selinux_mnt, SELINUX_BOOL_DIR, name);
-
-	fd = open(fname, O_WRONLY);
-	if (fd < 0) {
-		ret = -1;
-		goto out;
-	}
-
-	if (value)
-		buf[0] = '1';
-	else
-		buf[0] = '0';
-	buf[1] = '\0';
-
-	ret = write(fd, buf, 2);
-	close(fd);
-      out:
-	free(fname);
-	if (ret > 0)
-		return 0;
-	else
-		return -1;
-}
-
-hidden_def(security_set_boolean)
-
-int security_commit_booleans(void)
-{
-	int fd, ret;
-	char buf[2];
-	char path[PATH_MAX];
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s/commit_pending_bools", selinux_mnt);
-	fd = open(path, O_WRONLY);
-	if (fd < 0)
-		return -1;
-
-	buf[0] = '1';
-	buf[1] = '\0';
-
-	ret = write(fd, buf, 2);
-	close(fd);
-
-	if (ret > 0)
-		return 0;
-	else
-		return -1;
-}
-
-hidden_def(security_commit_booleans)
-
-static void rollback(SELboolean * boollist, int end)
-{
-	int i;
-
-	for (i = 0; i < end; i++)
-		security_set_boolean(boollist[i].name,
-				     security_get_boolean_active(boollist[i].
-								 name));
-}
-
-int security_set_boolean_list(size_t boolcnt, SELboolean * const boollist,
-			      int permanent __attribute__((unused)))
-{
-
-	size_t i;
-	for (i = 0; i < boolcnt; i++) {
-		if (security_set_boolean(boollist[i].name, boollist[i].value)) {
-			rollback(boollist, i);
-			return -1;
-		}
-	}
-
-	/* OK, let's do the commit */
-	if (security_commit_booleans()) {
-		return -1;
-	}
-
-	return 0;
-}
diff --git a/src/callbacks.c b/src/callbacks.c
deleted file mode 100644
index c3cf98b..0000000
--- a/src/callbacks.c
+++ /dev/null
@@ -1,124 +0,0 @@
-/*
- * User-supplied callbacks and default implementations.
- * Class and permission mappings.
- */
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <errno.h>
-#include <selinux/selinux.h>
-#include "callbacks.h"
-
-/* default implementations */
-static int __attribute__ ((format(printf, 2, 3)))
-default_selinux_log(int type __attribute__((unused)), const char *fmt, ...)
-{
-	int rc;
-	va_list ap;
-	va_start(ap, fmt);
-	rc = vfprintf(stderr, fmt, ap);
-	va_end(ap);
-	return rc;
-}
-
-static int
-default_selinux_audit(void *ptr __attribute__((unused)),
-		      security_class_t cls __attribute__((unused)),
-		      char *buf __attribute__((unused)),
-		      size_t len __attribute__((unused)))
-{
-	return 0;
-}
-
-static int
-default_selinux_validate(char **ctx)
-{
-	return security_check_context(*ctx);
-}
-
-static int
-default_selinux_setenforce(int enforcing __attribute__((unused)))
-{
-	return 0;
-}
-
-static int
-default_selinux_policyload(int seqno __attribute__((unused)))
-{
-	return 0;
-}
-
-/* callback pointers */
-int __attribute__ ((format(printf, 2, 3)))
-(*selinux_log)(int, const char *, ...) =
-	default_selinux_log;
-
-int
-(*selinux_audit) (void *, security_class_t, char *, size_t) =
-	default_selinux_audit;
-
-int
-(*selinux_validate)(char **ctx) =
-	default_selinux_validate;
-
-int
-(*selinux_netlink_setenforce) (int enforcing) =
-	default_selinux_setenforce;
-
-int
-(*selinux_netlink_policyload) (int seqno) =
-	default_selinux_policyload;
-
-/* callback setting function */
-void
-selinux_set_callback(int type, union selinux_callback cb)
-{
-	switch (type) {
-	case SELINUX_CB_LOG:
-		selinux_log = cb.func_log;
-		break;
-	case SELINUX_CB_AUDIT:
-		selinux_audit = cb.func_audit;
-		break;
-	case SELINUX_CB_VALIDATE:
-		selinux_validate = cb.func_validate;
-		break;
-	case SELINUX_CB_SETENFORCE:
-		selinux_netlink_setenforce = cb.func_setenforce;
-		break;
-	case SELINUX_CB_POLICYLOAD:
-		selinux_netlink_policyload = cb.func_policyload;
-		break;
-	}
-}
-
-/* callback getting function */
-union selinux_callback
-selinux_get_callback(int type)
-{
-	union selinux_callback cb;
-
-	switch (type) {
-	case SELINUX_CB_LOG:
-		cb.func_log = selinux_log;
-		break;
-	case SELINUX_CB_AUDIT:
-		cb.func_audit = selinux_audit;
-		break;
-	case SELINUX_CB_VALIDATE:
-		cb.func_validate = selinux_validate;
-		break;
-	case SELINUX_CB_SETENFORCE:
-		cb.func_setenforce = selinux_netlink_setenforce;
-		break;
-	case SELINUX_CB_POLICYLOAD:
-		cb.func_policyload = selinux_netlink_policyload;
-		break;
-	default:
-		memset(&cb, 0, sizeof(cb));
-		errno = EINVAL;
-		break;
-	}
-	return cb;
-}
diff --git a/src/callbacks.h b/src/callbacks.h
deleted file mode 100644
index 2a572e0..0000000
--- a/src/callbacks.h
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * This file describes the callbacks passed to selinux_init() and available
- * for use from the library code.  They all have default implementations.
- */
-#ifndef _SELINUX_CALLBACKS_H_
-#define _SELINUX_CALLBACKS_H_
-
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <selinux/selinux.h>
-#include "dso.h"
-
-/* callback pointers */
-extern int __attribute__ ((format(printf, 2, 3)))
-(*selinux_log) (int type, const char *, ...) hidden;
-
-extern int
-(*selinux_audit) (void *, security_class_t, char *, size_t) hidden;
-
-extern int
-(*selinux_validate)(char **ctx) hidden;
-
-extern int
-(*selinux_netlink_setenforce) (int enforcing) hidden;
-
-extern int
-(*selinux_netlink_policyload) (int seqno) hidden;
-
-#endif				/* _SELINUX_CALLBACKS_H_ */
diff --git a/src/canonicalize_context.c b/src/canonicalize_context.c
deleted file mode 100644
index b8f874f..0000000
--- a/src/canonicalize_context.c
+++ /dev/null
@@ -1,62 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include "selinux_internal.h"
-#include "policy.h"
-#include <limits.h>
-
-int security_canonicalize_context(const char * con,
-				      char ** canoncon)
-{
-	char path[PATH_MAX];
-	char *buf;
-	size_t size;
-	int fd, ret;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s/context", selinux_mnt);
-	fd = open(path, O_RDWR);
-	if (fd < 0)
-		return -1;
-
-	size = selinux_page_size;
-	buf = malloc(size);
-	if (!buf) {
-		ret = -1;
-		goto out;
-	}
-	strncpy(buf, con, size);
-
-	ret = write(fd, buf, strlen(buf) + 1);
-	if (ret < 0)
-		goto out2;
-
-	memset(buf, 0, size);
-	ret = read(fd, buf, size - 1);
-	if (ret < 0 && errno == EINVAL) {
-		/* Fall back to the original context for kernels
-		   that do not support the extended interface. */
-		strncpy(buf, con, size);
-	}
-
-	*canoncon = strdup(buf);
-	if (!(*canoncon)) {
-		ret = -1;
-		goto out2;
-	}
-	ret = 0;
-      out2:
-	free(buf);
-      out:
-	close(fd);
-	return ret;
-}
-
diff --git a/src/checkAccess.c b/src/checkAccess.c
deleted file mode 100644
index dc11cf7..0000000
--- a/src/checkAccess.c
+++ /dev/null
@@ -1,62 +0,0 @@
-/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/
-#include <unistd.h>
-#include <sys/types.h>
-#include <stdlib.h>
-#include <errno.h>
-#include "selinux_internal.h"
-#include <selinux/avc.h>
-#include "avc_internal.h"
-
-static pthread_once_t once = PTHREAD_ONCE_INIT;
-static int selinux_enabled;
-
-static void avc_init_once(void)
-{
-	selinux_enabled = is_selinux_enabled();
-	if (selinux_enabled == 1)
-		avc_open(NULL, 0);
-}
-
-int selinux_check_access(const char * scon, const char * tcon, const char *class, const char *perm, void *aux) {
-	int rc;
-	security_id_t scon_id;
-	security_id_t tcon_id;
-	security_class_t sclass;
-	access_vector_t av;
-
-	__selinux_once(once, avc_init_once);
-
-	if (selinux_enabled != 1)
-		return 0;
-
-	rc = avc_context_to_sid(scon, &scon_id);
-	if (rc < 0)
-		return rc;
-
-       rc = avc_context_to_sid(tcon, &tcon_id);
-       if (rc < 0)
-	       return rc;
-
-       sclass = string_to_security_class(class);
-       if (sclass == 0) {
-	       rc = errno;
-	       avc_log(SELINUX_ERROR, "Unknown class %s", class);
-	       if (security_deny_unknown() == 0)
-		       return 0;
-	       errno = rc;
-	       return -1;
-       }
-
-       av = string_to_av_perm(sclass, perm);
-       if (av == 0) {
-	       rc = errno;
-	       avc_log(SELINUX_ERROR, "Unknown permission %s for class %s", perm, class);
-	       if (security_deny_unknown() == 0)
-		       return 0;
-	       errno = rc;
-	       return -1;
-       }
-
-       return avc_has_perm (scon_id, tcon_id, sclass, av, NULL, aux);
-}
-
diff --git a/src/check_context.c b/src/check_context.c
deleted file mode 100644
index 7471194..0000000
--- a/src/check_context.c
+++ /dev/null
@@ -1,33 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include <stdio.h>
-#include "selinux_internal.h"
-#include "policy.h"
-#include <limits.h>
-
-int security_check_context(const char * con)
-{
-	char path[PATH_MAX];
-	int fd, ret;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s/context", selinux_mnt);
-	fd = open(path, O_RDWR);
-	if (fd < 0)
-		return -1;
-
-	ret = write(fd, con, strlen(con) + 1);
-	close(fd);
-	if (ret < 0)
-		return -1;
-	return 0;
-}
-
diff --git a/src/compute_av.c b/src/compute_av.c
deleted file mode 100644
index d6f76f8..0000000
--- a/src/compute_av.c
+++ /dev/null
@@ -1,72 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <limits.h>
-#include "selinux_internal.h"
-#include "policy.h"
-#include "mapping.h"
-
-int security_compute_av(const char * scon,
-			const char * tcon,
-			security_class_t tclass,
-			access_vector_t requested,
-			struct av_decision *avd)
-{
-	char path[PATH_MAX];
-	char *buf;
-	size_t len;
-	int fd, ret;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s/access", selinux_mnt);
-	fd = open(path, O_RDWR);
-	if (fd < 0)
-		return -1;
-
-	len = selinux_page_size;
-	buf = malloc(len);
-	if (!buf) {
-		ret = -1;
-		goto out;
-	}
-
-	snprintf(buf, len, "%s %s %hu %x", scon, tcon,
-		 unmap_class(tclass), unmap_perm(tclass, requested));
-
-	ret = write(fd, buf, strlen(buf));
-	if (ret < 0)
-		goto out2;
-
-	memset(buf, 0, len);
-	ret = read(fd, buf, len - 1);
-	if (ret < 0)
-		goto out2;
-
-	ret = sscanf(buf, "%x %x %x %x %u %x",
-		     &avd->allowed, &avd->decided,
-		     &avd->auditallow, &avd->auditdeny,
-		     &avd->seqno, &avd->flags);
-	if (ret < 5) {
-		ret = -1;
-		goto out2;
-	} else if (ret < 6)
-		avd->flags = 0;
-
-	map_decision(tclass, avd);
-
-	ret = 0;
-      out2:
-	free(buf);
-      out:
-	close(fd);
-	return ret;
-}
-
diff --git a/src/compute_create.c b/src/compute_create.c
deleted file mode 100644
index d3b16c9..0000000
--- a/src/compute_create.c
+++ /dev/null
@@ -1,61 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include <limits.h>
-#include "selinux_internal.h"
-#include "policy.h"
-#include "mapping.h"
-
-int security_compute_create(const char * scon,
-				const char * tcon,
-				security_class_t tclass,
-				char ** newcon)
-{
-	char path[PATH_MAX];
-	char *buf;
-	size_t size;
-	int fd, ret;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s/create", selinux_mnt);
-	fd = open(path, O_RDWR);
-	if (fd < 0)
-		return -1;
-
-	size = selinux_page_size;
-	buf = malloc(size);
-	if (!buf) {
-		ret = -1;
-		goto out;
-	}
-	snprintf(buf, size, "%s %s %hu", scon, tcon, unmap_class(tclass));
-
-	ret = write(fd, buf, strlen(buf));
-	if (ret < 0)
-		goto out2;
-
-	memset(buf, 0, size);
-	ret = read(fd, buf, size - 1);
-	if (ret < 0)
-		goto out2;
-
-	*newcon = strdup(buf);
-	if (!(*newcon)) {
-		ret = -1;
-		goto out2;
-	}
-	ret = 0;
-      out2:
-	free(buf);
-      out:
-	close(fd);
-	return ret;
-}
diff --git a/src/context.c b/src/context.c
deleted file mode 100644
index 66abea1..0000000
--- a/src/context.c
+++ /dev/null
@@ -1,197 +0,0 @@
-#include "context_internal.h"
-#include <string.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <errno.h>
-
-#define COMP_USER  0
-#define COMP_ROLE  1
-#define COMP_TYPE  2
-#define COMP_RANGE 3
-
-typedef struct {
-	char *current_str;	/* This is made up-to-date only when needed */
-	char *(component[4]);
-} context_private_t;
-
-/*
- * Allocate a new context, initialized from str.  There must be 3 or
- * 4 colon-separated components and no whitespace in any component other
- * than the MLS component.
- */
-context_t context_new(const char *str)
-{
-	int i, count;
-	errno = 0;
-	context_private_t *n =
-	    (context_private_t *) malloc(sizeof(context_private_t));
-	context_t result = (context_t) malloc(sizeof(context_s_t));
-	const char *p, *tok;
-
-	if (result)
-		result->ptr = n;
-	else
-		free(n);
-	if (n == 0 || result == 0) {
-		goto err;
-	}
-	n->current_str = n->component[0] = n->component[1] = n->component[2] =
-	    n->component[3] = 0;
-	for (i = count = 0, p = str; *p; p++) {
-		switch (*p) {
-		case ':':
-			count++;
-			break;
-		case '\n':
-		case '\t':
-		case '\r':
-			goto err;	/* sanity check */
-		case ' ':
-			if (count < 3)
-				goto err;	/* sanity check */
-		}
-	}
-	/*
-	 * Could be anywhere from 2 - 5
-	 * e.g user:role:type to user:role:type:sens1:cata-sens2:catb
-	 */
-	if (count < 2 || count > 5) {	/* might not have a range */
-		goto err;
-	}
-
-	n->component[3] = 0;
-	for (i = 0, tok = str; *tok; i++) {
-		if (i < 3)
-			for (p = tok; *p && *p != ':'; p++) {	/* empty */
-		} else {
-			/* MLS range is one component */
-			for (p = tok; *p; p++) {	/* empty */
-			}
-		}
-		n->component[i] = (char *)malloc(p - tok + 1);
-		if (n->component[i] == 0)
-			goto err;
-		strncpy(n->component[i], tok, p - tok);
-		n->component[i][p - tok] = '\0';
-		tok = *p ? p + 1 : p;
-	}
-	return result;
-      err:
-	if (errno == 0) errno = EINVAL;
-	context_free(result);
-	return 0;
-}
-
-hidden_def(context_new)
-
-static void conditional_free(char **v)
-{
-	if (*v) {
-		free(*v);
-	}
-	*v = 0;
-}
-
-/*
- * free all storage used by a context.  Safe to call with
- * null pointer. 
- */
-void context_free(context_t context)
-{
-	context_private_t *n;
-	int i;
-	if (context) {
-		n = context->ptr;
-		if (n) {
-			conditional_free(&n->current_str);
-			for (i = 0; i < 4; i++) {
-				conditional_free(&n->component[i]);
-			}
-			free(n);
-		}
-		free(context);
-	}
-}
-
-hidden_def(context_free)
-
-/*
- * Return a pointer to the string value of the context.
- */
-char *context_str(context_t context)
-{
-	context_private_t *n = context->ptr;
-	int i;
-	size_t total = 0;
-	conditional_free(&n->current_str);
-	for (i = 0; i < 4; i++) {
-		if (n->component[i]) {
-			total += strlen(n->component[i]) + 1;
-		}
-	}
-	n->current_str = malloc(total);
-	if (n->current_str != 0) {
-		char *cp = n->current_str;
-
-		strcpy(cp, n->component[0]);
-		cp += strlen(cp);
-		for (i = 1; i < 4; i++) {
-			if (n->component[i]) {
-				*cp++ = ':';
-				strcpy(cp, n->component[i]);
-				cp += strlen(cp);
-			}
-		}
-	}
-	return n->current_str;
-}
-
-hidden_def(context_str)
-
-/* Returns nonzero iff failed */
-static int set_comp(context_private_t * n, int idx, const char *str)
-{
-	char *t = NULL;
-	const char *p;
-	if (str) {
-		t = (char *)malloc(strlen(str) + 1);
-		if (!t) {
-			return 1;
-		}
-		for (p = str; *p; p++) {
-			if (*p == '\t' || *p == '\n' || *p == '\r' ||
-			    ((*p == ':' || *p == ' ') && idx != COMP_RANGE)) {
-				free(t);
-				errno = EINVAL;
-				return 1;
-			}
-		}
-		strcpy(t, str);
-	}
-	conditional_free(&n->component[idx]);
-	n->component[idx] = t;
-	return 0;
-}
-
-#define def_get(name,tag) \
-const char * context_ ## name ## _get(context_t context) \
-{ \
-        context_private_t *n = context->ptr; \
-        return n->component[tag]; \
-} \
-hidden_def(context_ ## name ## _get)
-
-def_get(type, COMP_TYPE)
-    def_get(user, COMP_USER)
-    def_get(range, COMP_RANGE)
-    def_get(role, COMP_ROLE)
-#define def_set(name,tag) \
-int context_ ## name ## _set(context_t context, const char* str) \
-{ \
-        return set_comp(context->ptr,tag,str);\
-} \
-hidden_def(context_ ## name ## _set)
-    def_set(type, COMP_TYPE)
-    def_set(role, COMP_ROLE)
-    def_set(user, COMP_USER)
-    def_set(range, COMP_RANGE)
diff --git a/src/context_internal.h b/src/context_internal.h
deleted file mode 100644
index 3c71e80..0000000
--- a/src/context_internal.h
+++ /dev/null
@@ -1,14 +0,0 @@
-#include <selinux/context.h>
-#include "dso.h"
-
-hidden_proto(context_new)
-    hidden_proto(context_free)
-    hidden_proto(context_str)
-    hidden_proto(context_type_set)
-    hidden_proto(context_type_get)
-    hidden_proto(context_role_set)
-    hidden_proto(context_role_get)
-    hidden_proto(context_user_set)
-    hidden_proto(context_user_get)
-    hidden_proto(context_range_set)
-    hidden_proto(context_range_get)
diff --git a/src/deny_unknown.c b/src/deny_unknown.c
deleted file mode 100644
index c93998a..0000000
--- a/src/deny_unknown.c
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include "selinux_internal.h"
-#include "policy.h"
-#include <stdio.h>
-#include <limits.h>
-
-int security_deny_unknown(void)
-{
-	int fd, ret, deny_unknown = 0;
-	char path[PATH_MAX];
-	char buf[20];
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof(path), "%s/deny_unknown", selinux_mnt);
-	fd = open(path, O_RDONLY);
-	if (fd < 0)
-		return -1;
-
-	memset(buf, 0, sizeof(buf));
-	ret = read(fd, buf, sizeof(buf) - 1);
-	close(fd);
-	if (ret < 0)
-		return -1;
-
-	if (sscanf(buf, "%d", &deny_unknown) != 1)
-		return -1;
-
-	return deny_unknown;
-}
-
-hidden_def(security_deny_unknown);
diff --git a/src/disable.c b/src/disable.c
deleted file mode 100644
index dac0f5b..0000000
--- a/src/disable.c
+++ /dev/null
@@ -1,38 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include "selinux_internal.h"
-#include "policy.h"
-#include <stdio.h>
-#include <limits.h>
-
-int security_disable(void)
-{
-	int fd, ret;
-	char path[PATH_MAX];
-	char buf[20];
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s/disable", selinux_mnt);
-	fd = open(path, O_WRONLY);
-	if (fd < 0)
-		return -1;
-
-	buf[0] = '1';
-	buf[1] = '\0';
-	ret = write(fd, buf, strlen(buf));
-	close(fd);
-	if (ret < 0)
-		return -1;
-
-	return 0;
-}
-
-hidden_def(security_disable)
diff --git a/src/dso.h b/src/dso.h
deleted file mode 100644
index 12c3d11..0000000
--- a/src/dso.h
+++ /dev/null
@@ -1,23 +0,0 @@
-#ifndef _SELINUX_DSO_H
-#define _SELINUX_DSO_H	1
-
-#ifdef SHARED
-# define hidden __attribute__ ((visibility ("hidden")))
-# define hidden_proto(fct) __hidden_proto (fct, fct##_internal)
-# define __hidden_proto(fct, internal)	\
-     extern __typeof (fct) internal;	\
-     extern __typeof (fct) fct __asm (#internal) hidden;
-# if defined(__alpha__) || defined(__mips__)
-#  define hidden_def(fct) \
-     asm (".globl " #fct "\n" #fct " = " #fct "_internal");
-# else
-#  define hidden_def(fct) \
-     asm (".globl " #fct "\n.set " #fct ", " #fct "_internal");
-#endif
-#else
-# define hidden
-# define hidden_proto(fct)
-# define hidden_def(fct)
-#endif
-
-#endif
diff --git a/src/enabled.c b/src/enabled.c
deleted file mode 100644
index c60eb19..0000000
--- a/src/enabled.c
+++ /dev/null
@@ -1,54 +0,0 @@
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include "selinux_internal.h"
-#include <stdlib.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdio.h>
-#include "policy.h"
-
-int is_selinux_enabled(void)
-{
-	/* init_selinuxmnt() gets called before this function. We
- 	 * will assume that if a selinux file system is mounted, then
- 	 * selinux is enabled. */
-	return (selinux_mnt ? 1 : 0);
-}
-
-hidden_def(is_selinux_enabled)
-
-/*
- * Function: is_selinux_mls_enabled()
- * Return:   1 on success
- *	     0 on failure
- */
-int is_selinux_mls_enabled(void)
-{
-	char buf[20], path[PATH_MAX];
-	int fd, ret, enabled = 0;
-
-	if (!selinux_mnt)
-		return enabled;
-
-	snprintf(path, sizeof path, "%s/mls", selinux_mnt);
-	fd = open(path, O_RDONLY);
-	if (fd < 0)
-		return enabled;
-
-	memset(buf, 0, sizeof buf);
-
-	do {
-		ret = read(fd, buf, sizeof buf - 1);
-	} while (ret < 0 && errno == EINTR);
-	close(fd);
-	if (ret < 0)
-		return enabled;
-
-	if (!strcmp(buf, "1"))
-		enabled = 1;
-
-	return enabled;
-}
-
-hidden_def(is_selinux_mls_enabled)
diff --git a/src/fgetfilecon.c b/src/fgetfilecon.c
deleted file mode 100644
index 33cdc27..0000000
--- a/src/fgetfilecon.c
+++ /dev/null
@@ -1,51 +0,0 @@
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/xattr.h>
-#include "selinux_internal.h"
-#include "policy.h"
-
-int fgetfilecon(int fd, char ** context)
-{
-	char *buf;
-	ssize_t size;
-	ssize_t ret;
-
-	size = INITCONTEXTLEN + 1;
-	buf = malloc(size);
-	if (!buf)
-		return -1;
-	memset(buf, 0, size);
-
-	ret = fgetxattr(fd, XATTR_NAME_SELINUX, buf, size - 1);
-	if (ret < 0 && errno == ERANGE) {
-		char *newbuf;
-
-		size = fgetxattr(fd, XATTR_NAME_SELINUX, NULL, 0);
-		if (size < 0)
-			goto out;
-
-		size++;
-		newbuf = realloc(buf, size);
-		if (!newbuf)
-			goto out;
-
-		buf = newbuf;
-		memset(buf, 0, size);
-		ret = fgetxattr(fd, XATTR_NAME_SELINUX, buf, size - 1);
-	}
-      out:
-	if (ret == 0) {
-		/* Re-map empty attribute values to errors. */
-		errno = EOPNOTSUPP;
-		ret = -1;
-	}
-	if (ret < 0)
-		free(buf);
-	else
-		*context = buf;
-	return ret;
-}
-
diff --git a/src/freecon.c b/src/freecon.c
deleted file mode 100644
index 5290dfa..0000000
--- a/src/freecon.c
+++ /dev/null
@@ -1,11 +0,0 @@
-#include <unistd.h>
-#include "selinux_internal.h"
-#include <stdlib.h>
-#include <errno.h>
-
-void freecon(char * con)
-{
-	free(con);
-}
-
-hidden_def(freecon)
diff --git a/src/fsetfilecon.c b/src/fsetfilecon.c
deleted file mode 100644
index 17f8875..0000000
--- a/src/fsetfilecon.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/xattr.h>
-#include "selinux_internal.h"
-#include "policy.h"
-
-int fsetfilecon(int fd, const char *context)
-{
-	return fsetxattr(fd, XATTR_NAME_SELINUX, context, strlen(context) + 1,
-			 0);
-}
-
diff --git a/src/get_initial_context.c b/src/get_initial_context.c
deleted file mode 100644
index 64863dd..0000000
--- a/src/get_initial_context.c
+++ /dev/null
@@ -1,55 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include <string.h>
-#include "selinux_internal.h"
-#include "policy.h"
-#include <limits.h>
-
-#define SELINUX_INITCON_DIR "/initial_contexts/"
-
-int security_get_initial_context(const char * name, char ** con)
-{
-	char path[PATH_MAX];
-	char *buf;
-	size_t size;
-	int fd, ret;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s%s%s", 
-		 selinux_mnt, SELINUX_INITCON_DIR, name);
-	fd = open(path, O_RDONLY);
-	if (fd < 0)
-		return -1;
-
-	size = selinux_page_size;
-	buf = malloc(size);
-	if (!buf) {
-		ret = -1;
-		goto out;
-	}
-	memset(buf, 0, size);
-	ret = read(fd, buf, size - 1);
-	if (ret < 0)
-		goto out2;
-
-	*con = strdup(buf);
-	if (!(*con)) {
-		ret = -1;
-		goto out2;
-	}
-	ret = 0;
-      out2:
-	free(buf);
-      out:
-	close(fd);
-	return ret;
-}
-
diff --git a/src/getenforce.c b/src/getenforce.c
deleted file mode 100644
index 4fb516a..0000000
--- a/src/getenforce.c
+++ /dev/null
@@ -1,40 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include "selinux_internal.h"
-#include "policy.h"
-#include <stdio.h>
-#include <limits.h>
-
-int security_getenforce(void)
-{
-	int fd, ret, enforce = 0;
-	char path[PATH_MAX];
-	char buf[20];
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s/enforce", selinux_mnt);
-	fd = open(path, O_RDONLY);
-	if (fd < 0)
-		return -1;
-
-	memset(buf, 0, sizeof buf);
-	ret = read(fd, buf, sizeof buf - 1);
-	close(fd);
-	if (ret < 0)
-		return -1;
-
-	if (sscanf(buf, "%d", &enforce) != 1)
-		return -1;
-
-	return enforce;
-}
-
-hidden_def(security_getenforce)
diff --git a/src/getfilecon.c b/src/getfilecon.c
deleted file mode 100644
index 02037de..0000000
--- a/src/getfilecon.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include "selinux_internal.h"
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/xattr.h>
-#include "policy.h"
-
-int getfilecon(const char *path, char ** context)
-{
-	char *buf;
-	ssize_t size;
-	ssize_t ret;
-
-	size = INITCONTEXTLEN + 1;
-	buf = malloc(size);
-	if (!buf)
-		return -1;
-	memset(buf, 0, size);
-
-	ret = getxattr(path, XATTR_NAME_SELINUX, buf, size - 1);
-	if (ret < 0 && errno == ERANGE) {
-		char *newbuf;
-
-		size = getxattr(path, XATTR_NAME_SELINUX, NULL, 0);
-		if (size < 0)
-			goto out;
-
-		size++;
-		newbuf = realloc(buf, size);
-		if (!newbuf)
-			goto out;
-
-		buf = newbuf;
-		memset(buf, 0, size);
-		ret = getxattr(path, XATTR_NAME_SELINUX, buf, size - 1);
-	}
-      out:
-	if (ret == 0) {
-		/* Re-map empty attribute values to errors. */
-		errno = EOPNOTSUPP;
-		ret = -1;
-	}
-	if (ret < 0)
-		free(buf);
-	else
-		*context = buf;
-	return ret;
-}
diff --git a/src/getpeercon.c b/src/getpeercon.c
deleted file mode 100644
index 3bd29dc..0000000
--- a/src/getpeercon.c
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/socket.h>
-#include "selinux_internal.h"
-#include "policy.h"
-
-#ifndef SO_PEERSEC
-#define SO_PEERSEC 31
-#endif
-
-int getpeercon(int fd, char ** context)
-{
-	char *buf;
-	socklen_t size;
-	ssize_t ret;
-
-	size = INITCONTEXTLEN + 1;
-	buf = malloc(size);
-	if (!buf)
-		return -1;
-	memset(buf, 0, size);
-
-	ret = getsockopt(fd, SOL_SOCKET, SO_PEERSEC, buf, &size);
-	if (ret < 0 && errno == ERANGE) {
-		char *newbuf;
-
-		newbuf = realloc(buf, size);
-		if (!newbuf)
-			goto out;
-
-		buf = newbuf;
-		memset(buf, 0, size);
-		ret = getsockopt(fd, SOL_SOCKET, SO_PEERSEC, buf, &size);
-	}
-      out:
-	if (ret < 0)
-		free(buf);
-	else
-		*context = buf;
-	return ret;
-}
-
diff --git a/src/init.c b/src/init.c
deleted file mode 100644
index 65bc01b..0000000
--- a/src/init.c
+++ /dev/null
@@ -1,123 +0,0 @@
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <ctype.h>
-#include <stdio.h>
-#include <dlfcn.h>
-
-#ifdef DARWIN
-#include <sys/param.h>
-#include <sys/mount.h>
-#else
-#include <sys/vfs.h>
-#endif
-
-#include <stdint.h>
-#include <limits.h>
-
-#include "dso.h"
-#include "policy.h"
-#include "selinux_internal.h"
-
-char *selinux_mnt = NULL;
-int selinux_page_size = 0;
-
-static void init_selinuxmnt(void)
-{
-	char buf[BUFSIZ], *p;
-	FILE *fp=NULL;
-	struct statfs sfbuf;
-	int rc;
-	char *bufp;
-	int exists = 0;
-
-	if (selinux_mnt)
-		return;
-
-	/* We check to see if the preferred mount point for selinux file
-	 * system has a selinuxfs. */
-	do {
-		rc = statfs(SELINUXMNT, &sfbuf);
-	} while (rc < 0 && errno == EINTR);
-	if (rc == 0) {
-		if ((uint32_t)sfbuf.f_type == (uint32_t)SELINUX_MAGIC) {
-			selinux_mnt = strdup(SELINUXMNT);
-			return;
-		}
-	} 
-
-	/* Drop back to detecting it the long way. */
-	fp = fopen("/proc/filesystems", "r");
-	if (!fp)
-		return;
-
-	while ((bufp = fgets(buf, sizeof buf - 1, fp)) != NULL) {
-		if (strstr(buf, "selinuxfs")) {
-			exists = 1;
-			break;
-		}
-	}
-
-	if (!exists) 
-		goto out;
-
-	fclose(fp);
-
-	/* At this point, the usual spot doesn't have an selinuxfs so
-	 * we look around for it */
-	fp = fopen("/proc/mounts", "r");
-	if (!fp)
-		goto out;
-
-	while ((bufp = fgets(buf, sizeof buf - 1, fp)) != NULL) {
-		char *tmp;
-		p = strchr(buf, ' ');
-		if (!p)
-			goto out;
-		p++;
-		tmp = strchr(p, ' ');
-		if (!tmp)
-			goto out;
-		if (!strncmp(tmp + 1, "selinuxfs ", 10)) {
-			*tmp = '\0';
-			break;
-		}
-	}
-
-	/* If we found something, dup it */
-	if (bufp)
-		selinux_mnt = strdup(p);
-
-      out:
-	if (fp)
-		fclose(fp);
-	return;
-}
-
-void fini_selinuxmnt(void)
-{
-	free(selinux_mnt);
-	selinux_mnt = NULL;
-}
-
-void set_selinuxmnt(const char *mnt)
-{
-	selinux_mnt = strdup(mnt);
-}
-
-hidden_def(set_selinuxmnt)
-
-static void init_lib(void) __attribute__ ((constructor));
-static void init_lib(void)
-{
-	selinux_page_size = sysconf(_SC_PAGE_SIZE);
-	init_selinuxmnt();
-}
-
-static void fini_lib(void) __attribute__ ((destructor));
-static void fini_lib(void)
-{
-	fini_selinuxmnt();
-}
diff --git a/src/label.c b/src/label.c
deleted file mode 100644
index 6a67b65..0000000
--- a/src/label.c
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Generalized labeling frontend for userspace object managers.
- *
- * Author : Eamon Walsh <ewalsh@epoch.ncsc.mil>
- */
-
-#include <sys/types.h>
-#include <ctype.h>
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <selinux/selinux.h>
-#include "callbacks.h"
-#include "label_internal.h"
-
-#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
-
-typedef int (*selabel_initfunc)(struct selabel_handle *rec,
-				const struct selinux_opt *opts,
-				unsigned nopts);
-
-static selabel_initfunc initfuncs[] = {
-	&selabel_file_init,
-	NULL,
-	NULL,
-	NULL,
-	&selabel_property_init,
-	&selabel_service_init,
-};
-
-/*
- * Validation functions
- */
-
-static inline int selabel_is_validate_set(const struct selinux_opt *opts,
-					  unsigned n)
-{
-	while (n--)
-		if (opts[n].type == SELABEL_OPT_VALIDATE)
-			return !!opts[n].value;
-
-	return 0;
-}
-
-int selabel_validate(struct selabel_handle *rec,
-		     struct selabel_lookup_rec *contexts)
-{
-	int rc = 0;
-
-	if (!rec->validating || contexts->validated)
-		goto out;
-
-	rc = selinux_validate(&contexts->ctx_raw);
-	if (rc < 0)
-		goto out;
-
-	contexts->validated = 1;
-out:
-	return rc;
-}
-
-/*
- * Public API
- */
-
-struct selabel_handle *selabel_open(unsigned int backend,
-				    const struct selinux_opt *opts,
-				    unsigned nopts)
-{
-	struct selabel_handle *rec = NULL;
-
-	if (backend >= ARRAY_SIZE(initfuncs)) {
-		errno = EINVAL;
-		goto out;
-	}
-
-	if (initfuncs[backend] == NULL)
-		goto out;
-
-	rec = (struct selabel_handle *)malloc(sizeof(*rec));
-	if (!rec)
-		goto out;
-
-	memset(rec, 0, sizeof(*rec));
-	rec->backend = backend;
-	rec->validating = selabel_is_validate_set(opts, nopts);
-
-	if ((*initfuncs[backend])(rec, opts, nopts)) {
-		free(rec->spec_file);
-		free(rec);
-		rec = NULL;
-	}
-
-out:
-	return rec;
-}
-
-static struct selabel_lookup_rec *
-selabel_lookup_common(struct selabel_handle *rec,
-		      const char *key, int type)
-{
-	struct selabel_lookup_rec *lr;
-	lr = rec->func_lookup(rec, key, type); 
-	if (!lr)
-		return NULL;
-
-	return lr;
-}
-
-int selabel_lookup(struct selabel_handle *rec, char **con,
-		   const char *key, int type)
-{
-	struct selabel_lookup_rec *lr;
-
-	lr = selabel_lookup_common(rec, key, type);
-	if (!lr)
-		return -1;
-
-	*con = strdup(lr->ctx_raw);
-	return *con ? 0 : -1;
-}
-
-bool selabel_partial_match(struct selabel_handle *rec, const char *key)
-{
-	if (!rec->func_partial_match) {
-		/*
-		 * If the label backend does not support partial matching,
-		 * then assume a match is possible.
-		 */
-		return true;
-	}
-	return rec->func_partial_match(rec, key);
-}
-
-int selabel_lookup_best_match(struct selabel_handle *rec, char **con,
-			      const char *key, const char **aliases, int type)
-{
-	struct selabel_lookup_rec *lr;
-
-	if (!rec->func_lookup_best_match) {
-		errno = ENOTSUP;
-		return -1;
-	}
-
-	lr = rec->func_lookup_best_match(rec, key, aliases, type);
-	if (!lr)
-		return -1;
-
-	*con = strdup(lr->ctx_raw);
-	return *con ? 0 : -1;
-}
-
-enum selabel_cmp_result selabel_cmp(struct selabel_handle *h1,
-				    struct selabel_handle *h2)
-{
-	if (!h1->func_cmp || h1->func_cmp != h2->func_cmp)
-		return SELABEL_INCOMPARABLE;
-
-	return h1->func_cmp(h1, h2);
-}
-
-void selabel_close(struct selabel_handle *rec)
-{
-	rec->func_close(rec);
-	free(rec->spec_file);
-	free(rec);
-}
-
-void selabel_stats(struct selabel_handle *rec)
-{
-	rec->func_stats(rec);
-}
diff --git a/src/label_android_property.c b/src/label_android_property.c
deleted file mode 100644
index b0a807c..0000000
--- a/src/label_android_property.c
+++ /dev/null
@@ -1,350 +0,0 @@
-/*
- * Property Service contexts backend for labeling Android
- * property keys
- */
-
-#include <stdarg.h>
-#include <string.h>
-#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include "callbacks.h"
-#include "label_internal.h"
-
-/* A property security context specification. */
-typedef struct spec {
-	struct selabel_lookup_rec lr;	/* holds contexts for lookup result */
-	char *property_key;		/* property key string */
-} spec_t;
-
-/* Our stored configuration */
-struct saved_data {
-	/*
-	 * The array of specifications is sorted for longest
-	 * prefix match
-	 */
-	spec_t *spec_arr;
-	unsigned int nspec;	/* total number of specifications */
-};
-
-static int cmp(const void *A, const void *B)
-{
-	const struct spec *sp1 = A, *sp2 = B;
-
-	if (strncmp(sp1->property_key, "*", 1) == 0)
-		return 1;
-	if (strncmp(sp2->property_key, "*", 1) == 0)
-		return -1;
-
-	size_t L1 = strlen(sp1->property_key);
-	size_t L2 = strlen(sp2->property_key);
-
-	return (L1 < L2) - (L1 > L2);
-}
-
-/*
- * Warn about duplicate specifications.
- */
-static int nodups_specs(struct saved_data *data, const char *path)
-{
-	int rc = 0;
-	unsigned int ii, jj;
-	struct spec *curr_spec, *spec_arr = data->spec_arr;
-
-	for (ii = 0; ii < data->nspec; ii++) {
-		curr_spec = &spec_arr[ii];
-		for (jj = ii + 1; jj < data->nspec; jj++) {
-			if (!strcmp(spec_arr[jj].property_key,
-					    curr_spec->property_key)) {
-				rc = -1;
-				errno = EINVAL;
-				if (strcmp(spec_arr[jj].lr.ctx_raw,
-						    curr_spec->lr.ctx_raw)) {
-					selinux_log
-						(SELINUX_ERROR,
-						 "%s: Multiple different specifications for %s  (%s and %s).\n",
-						 path, curr_spec->property_key,
-						 spec_arr[jj].lr.ctx_raw,
-						 curr_spec->lr.ctx_raw);
-				} else {
-					selinux_log
-						(SELINUX_ERROR,
-						 "%s: Multiple same specifications for %s.\n",
-						 path, curr_spec->property_key);
-				}
-			}
-		}
-	}
-	return rc;
-}
-
-static int process_line(struct selabel_handle *rec,
-			const char *path, char *line_buf,
-			int pass, unsigned lineno)
-{
-	int items;
-	char *prop = NULL, *context = NULL;
-	struct saved_data *data = (struct saved_data *)rec->data;
-	spec_t *spec_arr = data->spec_arr;
-	unsigned int nspec = data->nspec;
-	const char *errbuf = NULL;
-
-	items = read_spec_entries(line_buf, &errbuf, 2, &prop, &context);
-	if (items < 0) {
-		items = errno;
-		selinux_log(SELINUX_ERROR,
-			"%s:  line %u error due to: %s\n", path,
-			lineno, errbuf ?: strerror(errno));
-		errno = items;
-		return -1;
-	}
-
-	if (items == 0)
-		return items;
-
-	if (items != 2) {
-		selinux_log(SELINUX_ERROR,
-			    "%s:  line %u is missing fields\n", path,
-			    lineno);
-		free(prop);
-		errno = EINVAL;
-		return -1;
-	}
-
-	if (pass == 0) {
-		free(prop);
-		free(context);
-	} else if (pass == 1) {
-		/* On the second pass, process and store the specification in spec. */
-		spec_arr[nspec].property_key = prop;
-		spec_arr[nspec].lr.ctx_raw = context;
-
-		if (rec->validating) {
-			if (selabel_validate(rec, &spec_arr[nspec].lr) < 0) {
-				selinux_log(SELINUX_ERROR,
-					    "%s:  line %u has invalid context %s\n",
-					    path, lineno, spec_arr[nspec].lr.ctx_raw);
-				errno = EINVAL;
-				return -1;
-			}
-		}
-	}
-
-	data->nspec = ++nspec;
-	return 0;
-}
-
-static int init(struct selabel_handle *rec, const struct selinux_opt *opts,
-		unsigned n)
-{
-	struct saved_data *data = (struct saved_data *)rec->data;
-	const char *path = NULL;
-	FILE *fp;
-	char line_buf[BUFSIZ];
-	unsigned int lineno, maxnspec, pass;
-	int status = -1;
-	struct stat sb;
-
-	/* Process arguments */
-	while (n--)
-		switch (opts[n].type) {
-		case SELABEL_OPT_PATH:
-			path = opts[n].value;
-			break;
-		}
-
-	if (!path)
-		return -1;
-
-	/* Open the specification file. */
-	if ((fp = fopen(path, "r")) == NULL)
-		return -1;
-
-	if (fstat(fileno(fp), &sb) < 0)
-		goto finish;
-	errno = EINVAL;
-	if (!S_ISREG(sb.st_mode))
-		goto finish;
-
-	/*
-	 * Two passes of the specification file. First is to get the size.
-	 * After the first pass, the spec array is malloced to the appropriate
-	 * size. Second pass is to populate the spec array and check for
-	 * dups.
-	 */
-	maxnspec = UINT_MAX / sizeof(spec_t);
-	for (pass = 0; pass < 2; pass++) {
-		data->nspec = 0;
-		lineno = 0;
-
-		while (fgets(line_buf, sizeof(line_buf) - 1, fp)
-		       && data->nspec < maxnspec) {
-			if (process_line(rec, path, line_buf, pass, ++lineno)
-									  != 0)
-				goto finish;
-		}
-
-		if (pass == 1) {
-			status = nodups_specs(data, path);
-
-			if (status)
-				goto finish;
-		}
-
-		if (pass == 0) {
-			if (data->nspec == 0) {
-				status = 0;
-				goto finish;
-			}
-
-			if (NULL == (data->spec_arr =
-				     malloc(sizeof(spec_t) * data->nspec)))
-				goto finish;
-
-			memset(data->spec_arr, 0, sizeof(spec_t) * data->nspec);
-			maxnspec = data->nspec;
-			rewind(fp);
-		}
-	}
-
-	qsort(data->spec_arr, data->nspec, sizeof(struct spec), cmp);
-
-	status = 0;
-finish:
-	fclose(fp);
-	return status;
-}
-
-/*
- * Backend interface routines
- */
-static void closef(struct selabel_handle *rec)
-{
-	struct saved_data *data = (struct saved_data *)rec->data;
-	struct spec *spec;
-	unsigned int i;
-
-	for (i = 0; i < data->nspec; i++) {
-		spec = &data->spec_arr[i];
-		free(spec->property_key);
-		free(spec->lr.ctx_raw);
-		free(spec->lr.ctx_trans);
-	}
-
-	if (data->spec_arr)
-		free(data->spec_arr);
-
-	free(data);
-}
-
-static struct selabel_lookup_rec *lookup(struct selabel_handle *rec,
-					 const char *key,
-					 int __attribute__((unused)) type)
-{
-	struct saved_data *data = (struct saved_data *)rec->data;
-	spec_t *spec_arr = data->spec_arr;
-	unsigned int i;
-	struct selabel_lookup_rec *ret = NULL;
-
-	if (!data->nspec) {
-		errno = ENOENT;
-		goto finish;
-	}
-
-	for (i = 0; i < data->nspec; i++) {
-		if (strncmp(spec_arr[i].property_key, key,
-			    strlen(spec_arr[i].property_key)) == 0) {
-			break;
-		}
-		if (strncmp(spec_arr[i].property_key, "*", 1) == 0)
-			break;
-	}
-
-	if (i >= data->nspec) {
-		/* No matching specification. */
-		errno = ENOENT;
-		goto finish;
-	}
-
-	ret = &spec_arr[i].lr;
-
-finish:
-	return ret;
-}
-
-static struct selabel_lookup_rec *service_lookup(struct selabel_handle *rec,
-						 const char *key,
-						 int __attribute__((unused)) type)
-{
-	struct saved_data *data = (struct saved_data *) rec->data;
-	spec_t *spec_arr = data->spec_arr;
-	unsigned int i;
-	struct selabel_lookup_rec *ret = NULL;
-
-	if (!data->nspec) {
-		errno = ENOENT;
-		goto finish;
-	}
-
-	for (i = 0; i < data->nspec; i++) {
-		if (strcmp(spec_arr[i].property_key, key) == 0) {
-			break;
-		}
-		if (strcmp(spec_arr[i].property_key, "*") == 0) break;
-	}
-
-	if (i >= data->nspec) {
-		/* No matching specification. */
-		errno = ENOENT;
-		goto finish;
-	}
-
-	ret = &spec_arr[i].lr;
-
-finish:
-	return ret;
-}
-
-static void stats(struct selabel_handle __attribute__((unused)) *rec)
-{
-	selinux_log(SELINUX_WARNING, "'stats' functionality not implemented.\n");
-}
-
-int selabel_property_init(struct selabel_handle *rec,
-			  const struct selinux_opt *opts,
-			  unsigned nopts)
-{
-	struct saved_data *data;
-
-	data = (struct saved_data *)malloc(sizeof(*data));
-	if (!data)
-		return -1;
-	memset(data, 0, sizeof(*data));
-
-	rec->data = data;
-	rec->func_close = &closef;
-	rec->func_stats = &stats;
-	rec->func_lookup = &lookup;
-
-	return init(rec, opts, nopts);
-}
-
-int selabel_service_init(struct selabel_handle *rec,
-			 const struct selinux_opt *opts,
-			 unsigned nopts)
-{
-	struct saved_data *data;
-
-	data = (struct saved_data *)calloc(1, sizeof(*data));
-	if (!data)
-		return -1;
-
-	rec->data = data;
-	rec->func_close = &closef;
-	rec->func_stats = &stats;
-	rec->func_lookup = &service_lookup;
-
-	return init(rec, opts, nopts);
-}
diff --git a/src/label_file.c b/src/label_file.c
deleted file mode 100644
index d3e67c0..0000000
--- a/src/label_file.c
+++ /dev/null
@@ -1,859 +0,0 @@
-/*
- * File contexts backend for labeling system
- *
- * Author : Eamon Walsh <ewalsh@tycho.nsa.gov>
- * Author : Stephen Smalley <sds@tycho.nsa.gov>
- */
-
-#include <assert.h>
-#include <fcntl.h>
-#include <stdarg.h>
-#include <string.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <errno.h>
-#include <limits.h>
-#include <stdint.h>
-#include <unistd.h>
-#include <sys/mman.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-
-#include "callbacks.h"
-#include "label_internal.h"
-#include "label_file.h"
-
-/*
- * Internals, mostly moved over from matchpathcon.c
- */
-
-/* return the length of the text that is the stem of a file name */
-static int get_stem_from_file_name(const char *const buf)
-{
-	const char *tmp = strchr(buf + 1, '/');
-
-	if (!tmp)
-		return 0;
-	return tmp - buf;
-}
-
-/* find the stem of a file name, returns the index into stem_arr (or -1 if
- * there is no match - IE for a file in the root directory or a regex that is
- * too complex for us).  Makes buf point to the text AFTER the stem. */
-static int find_stem_from_file(struct saved_data *data, const char **buf)
-{
-	int i;
-	int stem_len = get_stem_from_file_name(*buf);
-
-	if (!stem_len)
-		return -1;
-	for (i = 0; i < data->num_stems; i++) {
-		if (stem_len == data->stem_arr[i].len
-		    && !strncmp(*buf, data->stem_arr[i].buf, stem_len)) {
-			*buf += stem_len;
-			return i;
-		}
-	}
-	return -1;
-}
-
-/*
- * Warn about duplicate specifications.
- */
-static int nodups_specs(struct saved_data *data, const char *path)
-{
-	int rc = 0;
-	unsigned int ii, jj;
-	struct spec *curr_spec, *spec_arr = data->spec_arr;
-
-	for (ii = 0; ii < data->nspec; ii++) {
-		curr_spec = &spec_arr[ii];
-		for (jj = ii + 1; jj < data->nspec; jj++) {
-			if ((!strcmp(spec_arr[jj].regex_str,
-				curr_spec->regex_str))
-			    && (!spec_arr[jj].mode || !curr_spec->mode
-				|| spec_arr[jj].mode == curr_spec->mode)) {
-				rc = -1;
-				errno = EINVAL;
-				if (strcmp(spec_arr[jj].lr.ctx_raw,
-					    curr_spec->lr.ctx_raw)) {
-					selinux_log
-						(SELINUX_ERROR,
-						 "%s: Multiple different specifications for %s  (%s and %s).\n",
-						 path, curr_spec->regex_str,
-						 spec_arr[jj].lr.ctx_raw,
-						 curr_spec->lr.ctx_raw);
-				} else {
-					selinux_log
-						(SELINUX_ERROR,
-						 "%s: Multiple same specifications for %s.\n",
-						 path, curr_spec->regex_str);
-				}
-			}
-		}
-	}
-	return rc;
-}
-
-static int load_mmap(struct selabel_handle *rec, const char *path,
-		     struct stat *sb, bool isbinary)
-{
-	struct saved_data *data = (struct saved_data *)rec->data;
-	char mmap_path[PATH_MAX + 1];
-	int mmapfd;
-	int rc;
-	struct stat mmap_stat;
-	char *addr, *str_buf;
-	size_t len;
-	int *stem_map;
-	struct mmap_area *mmap_area;
-	uint32_t i, magic, version;
-	uint32_t entry_len, stem_map_len, regex_array_len;
-
-	if (isbinary) {
-		len = strlen(path);
-		if (len >= sizeof(mmap_path))
-			return -1;
-		strcpy(mmap_path, path);
-	} else {
-		rc = snprintf(mmap_path, sizeof(mmap_path), "%s.bin", path);
-		if (rc >= (int)sizeof(mmap_path))
-			return -1;
-	}
-
-	mmapfd = open(mmap_path, O_RDONLY | O_CLOEXEC);
-	if (mmapfd < 0)
-		return -1;
-
-	rc = fstat(mmapfd, &mmap_stat);
-	if (rc < 0) {
-		close(mmapfd);
-		return -1;
-	}
-
-	/* if mmap is old, ignore it */
-	if (mmap_stat.st_mtime < sb->st_mtime) {
-		close(mmapfd);
-		return -1;
-	}
-
-	/* ok, read it in... */
-	len = mmap_stat.st_size;
-	len += (sysconf(_SC_PAGE_SIZE) - 1);
-	len &= ~(sysconf(_SC_PAGE_SIZE) - 1);
-
-	mmap_area = malloc(sizeof(*mmap_area));
-	if (!mmap_area) {
-		close(mmapfd);
-		return -1;
-	}
-
-	addr = mmap(NULL, len, PROT_READ, MAP_PRIVATE, mmapfd, 0);
-	close(mmapfd);
-	if (addr == MAP_FAILED) {
-		free(mmap_area);
-		perror("mmap");
-		return -1;
-	}
-
-	/* save where we mmap'd the file to cleanup on close() */
-	mmap_area->addr = mmap_area->next_addr = addr;
-	mmap_area->len = mmap_area->next_len = len;
-	mmap_area->next = data->mmap_areas;
-	data->mmap_areas = mmap_area;
-
-	/* check if this looks like an fcontext file */
-	rc = next_entry(&magic, mmap_area, sizeof(uint32_t));
-	if (rc < 0 || magic != SELINUX_MAGIC_COMPILED_FCONTEXT)
-		return -1;
-
-	/* check if this version is higher than we understand */
-	rc = next_entry(&version, mmap_area, sizeof(uint32_t));
-	if (rc < 0 || version > SELINUX_COMPILED_FCONTEXT_MAX_VERS)
-		return -1;
-
-	if (version >= SELINUX_COMPILED_FCONTEXT_PCRE_VERS) {
-		if (!regex_version()) {
-			return -1;
-		}
-		len = strlen(regex_version());
-
-		rc = next_entry(&entry_len, mmap_area, sizeof(uint32_t));
-		if (rc < 0)
-			return -1;
-
-		/* Check version lengths */
-		if (len != entry_len)
-			return -1;
-
-		/* Check if pcre version mismatch */
-		str_buf = malloc(entry_len + 1);
-		if (!str_buf)
-			return -1;
-
-		rc = next_entry(str_buf, mmap_area, entry_len);
-		if (rc < 0) {
-			free(str_buf);
-			return -1;
-		}
-
-		str_buf[entry_len] = '\0';
-		if ((strcmp(str_buf, regex_version()) != 0)) {
-			free(str_buf);
-			return -1;
-		}
-		free(str_buf);
-	}
-
-	/* allocate the stems_data array */
-	rc = next_entry(&stem_map_len, mmap_area, sizeof(uint32_t));
-	if (rc < 0 || !stem_map_len)
-		return -1;
-
-	/*
-	 * map indexed by the stem # in the mmap file and contains the stem
-	 * number in the data stem_arr
-	 */
-	stem_map = calloc(stem_map_len, sizeof(*stem_map));
-	if (!stem_map)
-		return -1;
-
-	for (i = 0; i < stem_map_len; i++) {
-		char *buf;
-		uint32_t stem_len;
-		int newid;
-
-		/* the length does not inlude the nul */
-		rc = next_entry(&stem_len, mmap_area, sizeof(uint32_t));
-		if (rc < 0 || !stem_len) {
-			rc = -1;
-			goto err;
-		}
-
-		/* Check for stem_len wrap around. */
-		if (stem_len < UINT32_MAX) {
-			buf = (char *)mmap_area->next_addr;
-			/* Check if over-run before null check. */
-			rc = next_entry(NULL, mmap_area, (stem_len + 1));
-			if (rc < 0)
-				goto err;
-
-			if (buf[stem_len] != '\0') {
-				rc = -1;
-				goto err;
-			}
-		} else {
-			rc = -1;
-			goto err;
-		}
-
-		/* store the mapping between old and new */
-		newid = find_stem(data, buf, stem_len);
-		if (newid < 0) {
-			newid = store_stem(data, buf, stem_len);
-			if (newid < 0) {
-				rc = newid;
-				goto err;
-			}
-			data->stem_arr[newid].from_mmap = 1;
-		}
-		stem_map[i] = newid;
-	}
-
-	/* allocate the regex array */
-	rc = next_entry(&regex_array_len, mmap_area, sizeof(uint32_t));
-	if (rc < 0 || !regex_array_len) {
-		rc = -1;
-		goto err;
-	}
-
-	for (i = 0; i < regex_array_len; i++) {
-		struct spec *spec;
-		int32_t stem_id, meta_chars;
-		uint32_t mode = 0, prefix_len = 0;
-
-		rc = grow_specs(data);
-		if (rc < 0)
-			goto err;
-
-		spec = &data->spec_arr[data->nspec];
-		spec->from_mmap = 1;
-		spec->regcomp = 1;
-
-		/* Process context */
-		rc = next_entry(&entry_len, mmap_area, sizeof(uint32_t));
-		if (rc < 0 || !entry_len) {
-			rc = -1;
-			goto err;
-		}
-
-		str_buf = malloc(entry_len);
-		if (!str_buf) {
-			rc = -1;
-			goto err;
-		}
-		rc = next_entry(str_buf, mmap_area, entry_len);
-		if (rc < 0)
-			goto err;
-
-		if (str_buf[entry_len - 1] != '\0') {
-			free(str_buf);
-			rc = -1;
-			goto err;
-		}
-		spec->lr.ctx_raw = str_buf;
-
-		if (strcmp(spec->lr.ctx_raw, "<<none>>") && rec->validating) {
-			if (selabel_validate(rec, &spec->lr) < 0) {
-				selinux_log(SELINUX_ERROR,
-					    "%s: context %s is invalid\n", mmap_path, spec->lr.ctx_raw);
-				goto err;
-			}
-		}
-
-		/* Process regex string */
-		rc = next_entry(&entry_len, mmap_area, sizeof(uint32_t));
-		if (rc < 0 || !entry_len) {
-			rc = -1;
-			goto err;
-		}
-
-		spec->regex_str = (char *)mmap_area->next_addr;
-		rc = next_entry(NULL, mmap_area, entry_len);
-		if (rc < 0)
-			goto err;
-
-		if (spec->regex_str[entry_len - 1] != '\0') {
-			rc = -1;
-			goto err;
-		}
-
-		/* Process mode */
-		if (version >= SELINUX_COMPILED_FCONTEXT_MODE)
-			rc = next_entry(&mode, mmap_area, sizeof(uint32_t));
-		else
-			rc = next_entry(&mode, mmap_area, sizeof(mode_t));
-		if (rc < 0)
-			goto err;
-
-		spec->mode = mode;
-
-		/* map the stem id from the mmap file to the data->stem_arr */
-		rc = next_entry(&stem_id, mmap_area, sizeof(int32_t));
-		if (rc < 0)
-			goto err;
-
-		if (stem_id < 0 || stem_id >= (int32_t)stem_map_len)
-			spec->stem_id = -1;
-		 else
-			spec->stem_id = stem_map[stem_id];
-
-		/* retrieve the hasMetaChars bit */
-		rc = next_entry(&meta_chars, mmap_area, sizeof(uint32_t));
-		if (rc < 0)
-			goto err;
-
-		spec->hasMetaChars = meta_chars;
-		/* and prefix length for use by selabel_lookup_best_match */
-               if (version >= SELINUX_COMPILED_FCONTEXT_PREFIX_LEN) {
-                       rc = next_entry(&prefix_len, mmap_area,
-                                           sizeof(uint32_t));
-                       if (rc < 0)
-                               goto err;
-
-                       spec->prefix_len = prefix_len;
-               }
-
-		rc = regex_load_mmap(mmap_area, &spec->regex);
-		if (rc < 0)
-			goto err;
-#ifndef NO_PERSISTENTLY_STORED_PATTERNS
-		spec->regcomp = 1;
-#else
-		spec->regcomp = 0;
-#endif
-
-		data->nspec++;
-	}
-
-	/* win */
-	rc = 0;
-err:
-	free(stem_map);
-
-	return rc;
-}
-
-static int process_file(const char *path, const char *suffix,
-			  struct selabel_handle *rec, const char *prefix)
-{
-	FILE *fp;
-	struct stat sb;
-	unsigned int lineno;
-	size_t line_len = 0;
-	char *line_buf = NULL;
-	int rc;
-	char stack_path[PATH_MAX + 1];
-	bool isbinary = false;
-	uint32_t magic;
-
-	/* append the path suffix if we have one */
-	if (suffix) {
-		rc = snprintf(stack_path, sizeof(stack_path),
-					    "%s.%s", path, suffix);
-		if (rc >= (int)sizeof(stack_path)) {
-			errno = ENAMETOOLONG;
-			return -1;
-		}
-		path = stack_path;
-	}
-
-	/* Open the specification file. */
-	fp = fopen(path, "r");
-	if (fp) {
-		if (fstat(fileno(fp), &sb) < 0)
-			return -1;
-		if (!S_ISREG(sb.st_mode)) {
-			errno = EINVAL;
-			return -1;
-		}
-
-		if (fread(&magic, sizeof magic, 1, fp) != 1) {
-			errno = EINVAL;
-			fclose(fp);
-			return -1;
-		}
-
-		if (magic == SELINUX_MAGIC_COMPILED_FCONTEXT) {
-			/* file_contexts.bin format */
-			fclose(fp);
-			fp = NULL;
-			isbinary = true;
-		} else {
-			rewind(fp);
-		}
-	} else {
-		/*
-		 * Text file does not exist, so clear the timestamp
-		 * so that we will always pass the timestamp comparison
-		 * with the bin file in load_mmap().
-		 */
-		sb.st_mtime = 0;
-	}
-
-	rc = load_mmap(rec, path, &sb, isbinary);
-	if (rc == 0)
-		goto out;
-
-	if (!fp)
-		return -1; /* no text or bin file */
-
-	/*
-	 * Then do detailed validation of the input and fill the spec array
-	 */
-	lineno = 0;
-	rc = 0;
-	while (getline(&line_buf, &line_len, fp) > 0) {
-		rc = process_line(rec, path, prefix, line_buf, ++lineno);
-		if (rc)
-			goto out;
-	}
-
-out:
-	free(line_buf);
-	if (fp)
-		fclose(fp);
-	return rc;
-}
-
-static void closef(struct selabel_handle *rec);
-
-static int init(struct selabel_handle *rec, const struct selinux_opt *opts,
-		unsigned n)
-{
-	struct saved_data *data = (struct saved_data *)rec->data;
-	const char *path = NULL;
-	const char *prefix = NULL;
-	int status = -1, baseonly = 0;
-
-	/* Process arguments */
-	while (n--)
-		switch(opts[n].type) {
-		case SELABEL_OPT_PATH:
-			path = opts[n].value;
-			break;
-		case SELABEL_OPT_SUBSET:
-			prefix = opts[n].value;
-			break;
-		case SELABEL_OPT_BASEONLY:
-			baseonly = !!opts[n].value;
-			break;
-		}
-
-	rec->spec_file = strdup(path);
-
-	/*
-	 * The do detailed validation of the input and fill the spec array
-	 */
-	status = process_file(path, NULL, rec, prefix);
-	if (status)
-		goto finish;
-
-	if (rec->validating) {
-		status = nodups_specs(data, path);
-		if (status)
-			goto finish;
-	}
-
-	if (!baseonly) {
-		status = process_file(path, "homedirs", rec, prefix);
-		if (status && errno != ENOENT)
-			goto finish;
-
-		status = process_file(path, "local", rec, prefix);
-		if (status && errno != ENOENT)
-			goto finish;
-	}
-
-	status = sort_specs(data);
-
-finish:
-	if (status)
-		closef(rec);
-
-	return status;
-}
-
-/*
- * Backend interface routines
- */
-static void closef(struct selabel_handle *rec)
-{
-	struct saved_data *data = (struct saved_data *)rec->data;
-	struct mmap_area *area, *last_area;
-	struct spec *spec;
-	struct stem *stem;
-	unsigned int i;
-
-	for (i = 0; i < data->nspec; i++) {
-		spec = &data->spec_arr[i];
-		free(spec->lr.ctx_trans);
-		free(spec->lr.ctx_raw);
-		if (spec->from_mmap)
-			continue;
-		free(spec->regex_str);
-		free(spec->type_str);
-		regex_data_free(spec->regex);
-	}
-
-	for (i = 0; i < (unsigned int)data->num_stems; i++) {
-		stem = &data->stem_arr[i];
-		if (stem->from_mmap)
-			continue;
-		free(stem->buf);
-	}
-
-	if (data->spec_arr)
-		free(data->spec_arr);
-	if (data->stem_arr)
-		free(data->stem_arr);
-
-	area = data->mmap_areas;
-	while (area) {
-		munmap(area->addr, area->len);
-		last_area = area;
-		area = area->next;
-		free(last_area);
-	}
-	free(data);
-}
-
-static struct spec *lookup_common(struct selabel_handle *rec,
-					     const char *key,
-					     int type,
-					     bool partial)
-{
-	struct saved_data *data = (struct saved_data *)rec->data;
-	struct spec *spec_arr = data->spec_arr;
-	int i, rc, file_stem;
-	mode_t mode = (mode_t)type;
-	const char *buf;
-	struct spec *ret = NULL;
-	char *clean_key = NULL;
-	const char *prev_slash, *next_slash;
-	unsigned int sofar = 0;
-	struct regex_error_data regex_error_data;
-
-	if (!data->nspec) {
-		errno = ENOENT;
-		goto finish;
-	}
-
-	/* Remove duplicate slashes */
-	if ((next_slash = strstr(key, "//"))) {
-		clean_key = (char *) malloc(strlen(key) + 1);
-		if (!clean_key)
-			goto finish;
-		prev_slash = key;
-		while (next_slash) {
-			memcpy(clean_key + sofar, prev_slash, next_slash - prev_slash);
-			sofar += next_slash - prev_slash;
-			prev_slash = next_slash + 1;
-			next_slash = strstr(prev_slash, "//");
-		}
-		strcpy(clean_key + sofar, prev_slash);
-		key = clean_key;
-	}
-
-	buf = key;
-	file_stem = find_stem_from_file(data, &buf);
-	mode &= S_IFMT;
-
-	/*
-	 * Check for matching specifications in reverse order, so that
-	 * the last matching specification is used.
-	 */
-	for (i = data->nspec - 1; i >= 0; i--) {
-		struct spec *spec = &spec_arr[i];
-		/* if the spec in question matches no stem or has the same
-		 * stem as the file AND if the spec in question has no mode
-		 * specified or if the mode matches the file mode then we do
-		 * a regex check        */
-		if ((spec->stem_id == -1 || spec->stem_id == file_stem) &&
-		    (!mode || !spec->mode || mode == spec->mode)) {
-			if (compile_regex(data, spec, &regex_error_data) < 0)
-				goto finish;
-			if (spec->stem_id == -1)
-				rc = regex_match(spec->regex, key, partial);
-			else
-				rc = regex_match(spec->regex, buf, partial);
-			if (rc == REGEX_MATCH) {
-				spec->matches++;
-				break;
-			} else if (partial && rc == REGEX_MATCH_PARTIAL)
-				break;
-
-			if (rc == REGEX_NO_MATCH)
-				continue;
-
-			errno = ENOENT;
-			/* else it's an error */
-			goto finish;
-		}
-	}
-
-	if (i < 0 || strcmp(spec_arr[i].lr.ctx_raw, "<<none>>") == 0) {
-		/* No matching specification. */
-		errno = ENOENT;
-		goto finish;
-	}
-
-	errno = 0;
-	ret = &spec_arr[i];
-
-finish:
-	free(clean_key);
-	return ret;
-}
-
-static struct selabel_lookup_rec *lookup(struct selabel_handle *rec,
-					 const char *key, int type)
-{
-	struct spec *spec;
-
-	spec = lookup_common(rec, key, type, false);
-	if (spec)
-		return &spec->lr;
-	return NULL;
-}
-
-static bool partial_match(struct selabel_handle *rec, const char *key)
-{
-	return lookup_common(rec, key, 0, true) ? true : false;
-}
-
-static struct selabel_lookup_rec *lookup_best_match(struct selabel_handle *rec,
-						    const char *key,
-						    const char **aliases,
-						    int type)
-{
-	size_t n, i;
-	int best = -1;
-	struct spec **specs;
-	size_t prefix_len = 0;
-	struct selabel_lookup_rec *lr = NULL;
-
-	if (!aliases || !aliases[0])
-		return lookup(rec, key, type);
-
-	for (n = 0; aliases[n]; n++)
-		;
-
-	specs = calloc(n+1, sizeof(struct spec *));
-	if (!specs)
-		return NULL;
-	specs[0] = lookup_common(rec, key, type, false);
-	if (specs[0]) {
-		if (!specs[0]->hasMetaChars) {
-			/* exact match on key */
-			lr = &specs[0]->lr;
-			goto out;
-		}
-		best = 0;
-		prefix_len = specs[0]->prefix_len;
-	}
-	for (i = 1; i <= n; i++) {
-		specs[i] = lookup_common(rec, aliases[i-1], type, false);
-		if (specs[i]) {
-			if (!specs[i]->hasMetaChars) {
-				/* exact match on alias */
-				lr = &specs[i]->lr;
-				goto out;
-			}
-			if (specs[i]->prefix_len > prefix_len) {
-				best = i;
-				prefix_len = specs[i]->prefix_len;
-			}
-		}
-	}
-
-	if (best >= 0) {
-		/* longest fixed prefix match on key or alias */
-		lr = &specs[best]->lr;
-	} else {
-		errno = ENOENT;
-	}
-
-out:
-	free(specs);
-	return lr;
-}
-
-static enum selabel_cmp_result incomp(struct spec *spec1, struct spec *spec2, const char *reason, int i, int j)
-{
-	selinux_log(SELINUX_INFO,
-		    "selabel_cmp: mismatched %s on entry %d: (%s, %x, %s) vs entry %d: (%s, %x, %s)\n",
-		    reason,
-		    i, spec1->regex_str, spec1->mode, spec1->lr.ctx_raw,
-		    j, spec2->regex_str, spec2->mode, spec2->lr.ctx_raw);
-	return SELABEL_INCOMPARABLE;
-}
-
-static enum selabel_cmp_result cmp(struct selabel_handle *h1,
-				   struct selabel_handle *h2)
-{
-	struct saved_data *data1 = (struct saved_data *)h1->data;
-	struct saved_data *data2 = (struct saved_data *)h2->data;
-	unsigned int i, nspec1 = data1->nspec, j, nspec2 = data2->nspec;
-	struct spec *spec_arr1 = data1->spec_arr, *spec_arr2 = data2->spec_arr;
-	struct stem *stem_arr1 = data1->stem_arr, *stem_arr2 = data2->stem_arr;
-	bool skipped1 = false, skipped2 = false;
-
-	i = 0;
-	j = 0;
-	while (i < nspec1 && j < nspec2) {
-		struct spec *spec1 = &spec_arr1[i];
-		struct spec *spec2 = &spec_arr2[j];
-
-		/*
-		 * Because sort_specs() moves exact pathnames to the
-		 * end, we might need to skip over additional regex
-		 * entries that only exist in one of the configurations.
-		 */
-		if (!spec1->hasMetaChars && spec2->hasMetaChars) {
-			j++;
-			skipped2 = true;
-			continue;
-		}
-
-		if (spec1->hasMetaChars && !spec2->hasMetaChars) {
-			i++;
-			skipped1 = true;
-			continue;
-		}
-
-		if (spec1->regcomp && spec2->regcomp) {
-			if (regex_cmp(spec1->regex, spec2->regex) == SELABEL_INCOMPARABLE){
-				return incomp(spec1, spec2, "regex", i, j);
-			}
-		} else {
-			if (strcmp(spec1->regex_str, spec2->regex_str))
-				return incomp(spec1, spec2, "regex_str", i, j);
-		}
-
-		if (spec1->mode != spec2->mode)
-			return incomp(spec1, spec2, "mode", i, j);
-
-		if (spec1->stem_id == -1 && spec2->stem_id != -1)
-			return incomp(spec1, spec2, "stem_id", i, j);
-		if (spec2->stem_id == -1 && spec1->stem_id != -1)
-			return incomp(spec1, spec2, "stem_id", i, j);
-		if (spec1->stem_id != -1 && spec2->stem_id != -1) {
-			struct stem *stem1 = &stem_arr1[spec1->stem_id];
-			struct stem *stem2 = &stem_arr2[spec2->stem_id];
-			if (stem1->len != stem2->len ||
-			    strncmp(stem1->buf, stem2->buf, stem1->len))
-				return incomp(spec1, spec2, "stem", i, j);
-		}
-
-		if (strcmp(spec1->lr.ctx_raw, spec2->lr.ctx_raw))
-			return incomp(spec1, spec2, "ctx_raw", i, j);
-
-		i++;
-		j++;
-	}
-
-	if ((skipped1 || i < nspec1) && !skipped2)
-		return SELABEL_SUPERSET;
-	if ((skipped2 || j < nspec2) && !skipped1)
-		return SELABEL_SUBSET;
-	if (skipped1 && skipped2)
-		return SELABEL_INCOMPARABLE;
-	return SELABEL_EQUAL;
-}
-
-
-static void stats(struct selabel_handle *rec)
-{
-	struct saved_data *data = (struct saved_data *)rec->data;
-	unsigned int i, nspec = data->nspec;
-	struct spec *spec_arr = data->spec_arr;
-
-	for (i = 0; i < nspec; i++) {
-		if (spec_arr[i].matches == 0) {
-			if (spec_arr[i].type_str) {
-				selinux_log(SELINUX_WARNING,
-				    "Warning!  No matches for (%s, %s, %s)\n",
-				    spec_arr[i].regex_str,
-				    spec_arr[i].type_str,
-				    spec_arr[i].lr.ctx_raw);
-			} else {
-				selinux_log(SELINUX_WARNING,
-				    "Warning!  No matches for (%s, %s)\n",
-				    spec_arr[i].regex_str,
-				    spec_arr[i].lr.ctx_raw);
-			}
-		}
-	}
-}
-
-int selabel_file_init(struct selabel_handle *rec, const struct selinux_opt *opts,
-		      unsigned nopts)
-{
-	struct saved_data *data;
-
-	data = (struct saved_data *)malloc(sizeof(*data));
-	if (!data)
-		return -1;
-	memset(data, 0, sizeof(*data));
-
-	rec->data = data;
-	rec->func_close = &closef;
-	rec->func_stats = &stats;
-	rec->func_lookup = &lookup;
-	rec->func_partial_match = &partial_match;
-	rec->func_lookup_best_match = &lookup_best_match;
-	rec->func_cmp = &cmp;
-
-	return init(rec, opts, nopts);
-}
diff --git a/src/label_file.h b/src/label_file.h
deleted file mode 100644
index d0ff254..0000000
--- a/src/label_file.h
+++ /dev/null
@@ -1,474 +0,0 @@
-#ifndef _SELABEL_FILE_H_
-#define _SELABEL_FILE_H_
-
-#include <errno.h>
-#include <string.h>
-
-#include <sys/stat.h>
-
-/*
- * Android: regex.h/c was introduced to hold all dependencies on the regular
- * expression back-end when we started supporting PCRE2. regex.h defines a
- * minimal interface required by libselinux, so that the remaining code
- * can be agnostic about the underlying implementation.
- */
-#include "regex.h"
-
-#include "callbacks.h"
-#include "label_internal.h"
-
-#define SELINUX_MAGIC_COMPILED_FCONTEXT	0xf97cff8a
-
-/* Version specific changes */
-#define SELINUX_COMPILED_FCONTEXT_NOPCRE_VERS	1
-#define SELINUX_COMPILED_FCONTEXT_PCRE_VERS	2
-#define SELINUX_COMPILED_FCONTEXT_MODE		3
-#define SELINUX_COMPILED_FCONTEXT_PREFIX_LEN	4
-
-#define SELINUX_COMPILED_FCONTEXT_MAX_VERS     SELINUX_COMPILED_FCONTEXT_PREFIX_LEN
-
-/* A file security context specification. */
-struct spec {
-	struct selabel_lookup_rec lr;	/* holds contexts for lookup result */
-	char *regex_str;	/* regular expession string for diagnostics */
-	char *type_str;		/* type string for diagnostic messages */
-	struct regex_data * regex; /* backend dependent regular expression data */
-	mode_t mode;		/* mode format value */
-	int matches;		/* number of matching pathnames */
-	int stem_id;		/* indicates which stem-compression item */
-	char hasMetaChars;	/* regular expression has meta-chars */
-	char regcomp;		/* regex_str has been compiled to regex */
-	char from_mmap;		/* this spec is from an mmap of the data */
-	size_t prefix_len;      /* length of fixed path prefix */
-};
-
-/* A regular expression stem */
-struct stem {
-	char *buf;
-	int len;
-	char from_mmap;
-};
-
-/* Where we map the file in during selabel_open() */
-struct mmap_area {
-	void *addr;	/* Start addr + len used to release memory at close */
-	size_t len;
-	void *next_addr;	/* Incremented by next_entry() */
-	size_t next_len;	/* Decremented by next_entry() */
-	struct mmap_area *next;
-};
-
-/* Our stored configuration */
-struct saved_data {
-	/*
-	 * The array of specifications, initially in the same order as in
-	 * the specification file. Sorting occurs based on hasMetaChars.
-	 */
-	struct spec *spec_arr;
-	unsigned int nspec;
-	unsigned int alloc_specs;
-
-	/*
-	 * The array of regular expression stems.
-	 */
-	struct stem *stem_arr;
-	int num_stems;
-	int alloc_stems;
-	struct mmap_area *mmap_areas;
-};
-
-static inline mode_t string_to_mode(char *mode)
-{
-	size_t len;
-
-	if (!mode)
-		return 0;
-	len = strlen(mode);
-	if (mode[0] != '-' || len != 2)
-		return -1;
-	switch (mode[1]) {
-	case 'b':
-		return S_IFBLK;
-	case 'c':
-		return S_IFCHR;
-	case 'd':
-		return S_IFDIR;
-	case 'p':
-		return S_IFIFO;
-	case 'l':
-		return S_IFLNK;
-	case 's':
-		return S_IFSOCK;
-	case '-':
-		return S_IFREG;
-	default:
-		return -1;
-	}
-	/* impossible to get here */
-	return 0;
-}
-
-static inline int grow_specs(struct saved_data *data)
-{
-	struct spec *specs;
-	size_t new_specs, total_specs;
-
-	if (data->nspec < data->alloc_specs)
-		return 0;
-
-	new_specs = data->nspec + 16;
-	total_specs = data->nspec + new_specs;
-
-	specs = realloc(data->spec_arr, total_specs * sizeof(*specs));
-	if (!specs) {
-		perror("realloc");
-		return -1;
-	}
-
-	/* blank the new entries */
-	memset(&specs[data->nspec], 0, new_specs * sizeof(*specs));
-
-	data->spec_arr = specs;
-	data->alloc_specs = total_specs;
-	return 0;
-}
-
-/* Determine if the regular expression specification has any meta characters. */
-static inline void spec_hasMetaChars(struct spec *spec)
-{
-	char *c;
-	int len;
-	char *end;
-
-	c = spec->regex_str;
-	len = strlen(spec->regex_str);
-	end = c + len;
-
-	spec->hasMetaChars = 0;
-	spec->prefix_len = len;
-
-	/* Look at each character in the RE specification string for a
-	 * meta character. Return when any meta character reached. */
-	while (c < end) {
-		switch (*c) {
-		case '.':
-		case '^':
-		case '$':
-		case '?':
-		case '*':
-		case '+':
-		case '|':
-		case '[':
-		case '(':
-		case '{':
-			spec->hasMetaChars = 1;
-			spec->prefix_len = c - spec->regex_str;
-			return;
-		case '\\':	/* skip the next character */
-			c++;
-			break;
-		default:
-			break;
-
-		}
-		c++;
-	}
-}
-
-/* Move exact pathname specifications to the end. */
-static inline int sort_specs(struct saved_data *data)
-{
-	struct spec *spec_copy;
-	struct spec spec;
-	unsigned int i;
-	int front, back;
-	size_t len = sizeof(*spec_copy);
-
-	spec_copy = malloc(len * data->nspec);
-	if (!spec_copy)
-		return -1;
-
-	/* first move the exact pathnames to the back */
-	front = 0;
-	back = data->nspec - 1;
-	for (i = 0; i < data->nspec; i++) {
-		if (data->spec_arr[i].hasMetaChars)
-			memcpy(&spec_copy[front++], &data->spec_arr[i], len);
-		else
-			memcpy(&spec_copy[back--], &data->spec_arr[i], len);
-	}
-
-	/*
-	 * now the exact pathnames are at the end, but they are in the reverse
-	 * order. Since 'front' is now the first of the 'exact' we can run
-	 * that part of the array switching the front and back element.
-	 */
-	back = data->nspec - 1;
-	while (front < back) {
-		/* save the front */
-		memcpy(&spec, &spec_copy[front], len);
-		/* move the back to the front */
-		memcpy(&spec_copy[front], &spec_copy[back], len);
-		/* put the old front in the back */
-		memcpy(&spec_copy[back], &spec, len);
-		front++;
-		back--;
-	}
-
-	free(data->spec_arr);
-	data->spec_arr = spec_copy;
-
-	return 0;
-}
-
-/* Return the length of the text that can be considered the stem, returns 0
- * if there is no identifiable stem */
-static inline int get_stem_from_spec(const char *const buf)
-{
-	const char *tmp = strchr(buf + 1, '/');
-	const char *ind;
-
-	if (!tmp)
-		return 0;
-
-	for (ind = buf; ind < tmp; ind++) {
-		if (strchr(".^$?*+|[({", (int)*ind))
-			return 0;
-	}
-	return tmp - buf;
-}
-
-/*
- * return the stemid given a string and a length
- */
-static inline int find_stem(struct saved_data *data, const char *buf,
-						    int stem_len)
-{
-	int i;
-
-	for (i = 0; i < data->num_stems; i++) {
-		if (stem_len == data->stem_arr[i].len &&
-		    !strncmp(buf, data->stem_arr[i].buf, stem_len))
-			return i;
-	}
-
-	return -1;
-}
-
-/* returns the index of the new stored object */
-static inline int store_stem(struct saved_data *data, char *buf, int stem_len)
-{
-	int num = data->num_stems;
-
-	if (data->alloc_stems == num) {
-		struct stem *tmp_arr;
-
-		data->alloc_stems = data->alloc_stems * 2 + 16;
-		tmp_arr = realloc(data->stem_arr,
-				  sizeof(*tmp_arr) * data->alloc_stems);
-		if (!tmp_arr)
-			return -1;
-		data->stem_arr = tmp_arr;
-	}
-	data->stem_arr[num].len = stem_len;
-	data->stem_arr[num].buf = buf;
-	data->stem_arr[num].from_mmap = 0;
-	data->num_stems++;
-
-	return num;
-}
-
-/* find the stem of a file spec, returns the index into stem_arr for a new
- * or existing stem, (or -1 if there is no possible stem - IE for a file in
- * the root directory or a regex that is too complex for us). */
-static inline int find_stem_from_spec(struct saved_data *data, const char *buf)
-{
-	int stem_len = get_stem_from_spec(buf);
-	int stemid;
-	char *stem;
-
-	if (!stem_len)
-		return -1;
-
-	stemid = find_stem(data, buf, stem_len);
-	if (stemid >= 0)
-		return stemid;
-
-	/* not found, allocate a new one */
-	stem = strndup(buf, stem_len);
-	if (!stem)
-		return -1;
-
-	return store_stem(data, stem, stem_len);
-}
-
-/* This will always check for buffer over-runs and either read the next entry
- * if buf != NULL or skip over the entry (as these areas are mapped in the
- * current buffer). */
-static inline int next_entry(void *buf, struct mmap_area *fp, size_t bytes)
-{
-	if (bytes > fp->next_len)
-		return -1;
-
-	if (buf)
-		memcpy(buf, fp->next_addr, bytes);
-
-	fp->next_addr = (char *)fp->next_addr + bytes;
-	fp->next_len -= bytes;
-	return 0;
-}
-
-static inline int compile_regex(struct saved_data *data, struct spec *spec,
-					    struct regex_error_data * error_data)
-{
-	char *reg_buf, *anchored_regex, *cp;
-	struct stem *stem_arr = data->stem_arr;
-	size_t len;
-	int rc;
-
-	if (spec->regcomp)
-		return 0; /* already done */
-
-	/* Skip the fixed stem. */
-	reg_buf = spec->regex_str;
-	if (spec->stem_id >= 0)
-		reg_buf += stem_arr[spec->stem_id].len;
-
-	/* Anchor the regular expression. */
-	len = strlen(reg_buf);
-	cp = anchored_regex = malloc(len + 3);
-	if (!anchored_regex)
-		return -1;
-
-	/* Create ^...$ regexp.  */
-	*cp++ = '^';
-	memcpy(cp, reg_buf, len);
-	cp += len;
-	*cp++ = '$';
-	*cp = '\0';
-
-	/* Compile the regular expression. */
-	rc = regex_prepare_data(&spec->regex, anchored_regex, error_data);
-	free(anchored_regex);
-	if (rc < 0) {
-		return -1;
-	}
-
-	/* Done. */
-	spec->regcomp = 1;
-
-	return 0;
-}
-
-/* This service is used by label_file.c process_file() and
- * utils/sefcontext_compile.c */
-static inline int process_line(struct selabel_handle *rec,
-			const char *path, const char *prefix,
-			char *line_buf, unsigned lineno)
-{
-	int items, len, rc;
-	char *regex = NULL, *type = NULL, *context = NULL;
-	struct saved_data *data = (struct saved_data *)rec->data;
-	struct spec *spec_arr;
-	unsigned int nspec = data->nspec;
-	char const *errbuf;
-	struct regex_error_data error_data;
-
-	items = read_spec_entries(line_buf, &errbuf, 3, &regex, &type, &context);
-	if (items < 0) {
-		rc = errno;
-		selinux_log(SELINUX_ERROR,
-			"%s:  line %u error due to: %s\n", path,
-			lineno, errbuf ?: strerror(errno));
-		errno = rc;
-		return -1;
-	}
-
-	if (items == 0)
-		return items;
-
-	if (items < 2) {
-		selinux_log(SELINUX_ERROR,
-			    "%s:  line %u is missing fields\n", path,
-			    lineno);
-		if (items == 1)
-			free(regex);
-		errno = EINVAL;
-		return -1;
-	} else if (items == 2) {
-		/* The type field is optional. */
-		context = type;
-		type = 0;
-	}
-
-	len = get_stem_from_spec(regex);
-	if (len && prefix && strncmp(prefix, regex, len)) {
-		/* Stem of regex does not match requested prefix, discard. */
-		free(regex);
-		free(type);
-		free(context);
-		return 0;
-	}
-
-	rc = grow_specs(data);
-	if (rc)
-		return rc;
-
-	spec_arr = data->spec_arr;
-
-	/* process and store the specification in spec. */
-	spec_arr[nspec].stem_id = find_stem_from_spec(data, regex);
-	spec_arr[nspec].regex_str = regex;
-
-	spec_arr[nspec].type_str = type;
-	spec_arr[nspec].mode = 0;
-
-	spec_arr[nspec].lr.ctx_raw = context;
-
-	/*
-	 * bump data->nspecs to cause closef() to cover it in its free
-	 * but do not bump nspec since it's used below.
-	 */
-	data->nspec++;
-
-	if (rec->validating &&
-			    compile_regex(data, &spec_arr[nspec], &error_data)) {
-		selinux_log(SELINUX_ERROR,
-			   "%s:  line %u has invalid regex %s:  %s\n",
-			   path, lineno, regex,
-			   (errbuf ? errbuf : "out of memory"));
-		errno = EINVAL;
-		return -1;
-	}
-
-	if (type) {
-		mode_t mode = string_to_mode(type);
-
-		if (mode == (mode_t)-1) {
-			selinux_log(SELINUX_ERROR,
-				   "%s:  line %u has invalid file type %s\n",
-				   path, lineno, type);
-			errno = EINVAL;
-			return -1;
-		}
-		spec_arr[nspec].mode = mode;
-	}
-
-	/* Determine if specification has
-	 * any meta characters in the RE */
-	spec_hasMetaChars(&spec_arr[nspec]);
-
-	if (strcmp(context, "<<none>>") && rec->validating) {
-		if (selabel_validate(rec, &spec_arr[nspec].lr) < 0) {
-			selinux_log(SELINUX_ERROR,
-				    "%s:  line %u has invalid context %s\n",
-				    path, lineno, spec_arr[nspec].lr.ctx_raw);
-			errno = EINVAL;
-			return -1;
-		}
-	}
-
-	return 0;
-}
-
-#endif /* _SELABEL_FILE_H_ */
diff --git a/src/label_internal.h b/src/label_internal.h
deleted file mode 100644
index cca44d5..0000000
--- a/src/label_internal.h
+++ /dev/null
@@ -1,95 +0,0 @@
-/*
- * This file describes the internal interface used by the labeler
- * for calling the user-supplied memory allocation, validation,
- * and locking routine.
- *
- * Author : Eamon Walsh <ewalsh@epoch.ncsc.mil>
- */
-#ifndef _SELABEL_INTERNAL_H_
-#define _SELABEL_INTERNAL_H_
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <selinux/selinux.h>
-#include <selinux/label.h>
-#include "dso.h"
-
-/*
- * Installed backends
- */
-int selabel_file_init(struct selabel_handle *rec, const struct selinux_opt *opts,
-		      unsigned nopts) hidden;
-int selabel_media_init(struct selabel_handle *rec, const struct selinux_opt *opts,
-		      unsigned nopts) hidden;
-int selabel_x_init(struct selabel_handle *rec, const struct selinux_opt *opts,
-		   unsigned nopts) hidden;
-int selabel_db_init(struct selabel_handle *rec,
-		    const struct selinux_opt *opts, unsigned nopts) hidden;
-int selabel_property_init(struct selabel_handle *rec,
-			  const struct selinux_opt *opts, unsigned nopts) hidden;
-int selabel_service_init(struct selabel_handle *rec,
-			 const struct selinux_opt *opts, unsigned nopts) hidden;
-
-/*
- * Labeling internal structures
- */
-struct selabel_sub {
-	char *src;
-	int slen;
-	char *dst;
-	struct selabel_sub *next;
-};
-
-struct selabel_lookup_rec {
-	char * ctx_raw;
-	char * ctx_trans;
-	int validated;
-};
-
-struct selabel_handle {
-	/* arguments that were passed to selabel_open */
-	unsigned int backend;
-	int validating;
-
-	/* labeling operations */
-	struct selabel_lookup_rec *(*func_lookup) (struct selabel_handle *h,
-						   const char *key, int type);
-	void (*func_close) (struct selabel_handle *h);
-	void (*func_stats) (struct selabel_handle *h);
-	bool (*func_partial_match) (struct selabel_handle *h, const char *key);
-	struct selabel_lookup_rec *(*func_lookup_best_match)
-						    (struct selabel_handle *h,
-						    const char *key,
-						    const char **aliases,
-						    int type);
-	enum selabel_cmp_result (*func_cmp)(struct selabel_handle *h1,
-					    struct selabel_handle *h2);
-
-	/* supports backend-specific state information */
-	void *data;
-
-	/*
-	 * The main spec file used. Note for file contexts the local and/or
-	 * homedirs could also have been used to resolve a context.
-	 */
-	char *spec_file;
-
-	/* substitution support */
-	struct selabel_sub *dist_subs;
-	struct selabel_sub *subs;
-};
-
-/*
- * Validation function
- */
-extern int
-selabel_validate(struct selabel_handle *rec,
-		 struct selabel_lookup_rec *contexts) hidden;
-
-/*
- * The read_spec_entries function may be used to
- * replace sscanf to read entries from spec files.
- */
-extern int read_spec_entries(char *line_buf, const char **errbuf, int num_args, ...);
-
-#endif				/* _SELABEL_INTERNAL_H_ */
diff --git a/src/label_support.c b/src/label_support.c
deleted file mode 100644
index e226d51..0000000
--- a/src/label_support.c
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * This file contains helper functions for labeling support.
- *
- * Author : Richard Haines <richard_c_haines@btinternet.com>
- */
-
-#include <stdlib.h>
-#include <stdarg.h>
-#include <ctype.h>
-#include <string.h>
-#include <errno.h>
-#include "label_internal.h"
-
-/*
- * The read_spec_entries and read_spec_entry functions may be used to
- * replace sscanf to read entries from spec files. The file and
- * property services now use these.
- */
-
-/*
- * Read an entry from a spec file (e.g. file_contexts)
- * entry - Buffer to allocate for the entry.
- * ptr - current location of the line to be processed.
- * returns  - 0 on success and *entry is set to be a null
- *            terminated value. On Error it returns -1 and
-              errno will be set.
- *
- */
-static inline int read_spec_entry(char **entry, char **ptr, int *len, const char **errbuf)
-{
-	*entry = NULL;
-	char *tmp_buf = NULL;
-
-	while (isspace(**ptr) && **ptr != '\0')
-		(*ptr)++;
-
-	tmp_buf = *ptr;
-	*len = 0;
-
-	while (!isspace(**ptr) && **ptr != '\0') {
-		if (!isascii(**ptr)) {
-			errno = EINVAL;
-			*errbuf = "Non-ASCII characters found";
-			return -1;
-		}
-		(*ptr)++;
-		(*len)++;
-	}
-
-	if (*len) {
-		*entry = strndup(tmp_buf, *len);
-		if (!*entry)
-			return -1;
-	}
-
-	return 0;
-}
-
-/*
- * line_buf - Buffer containing the spec entries .
- * errbuf   - Double pointer used for passing back specific error messages.
- * num_args - The number of spec parameter entries to process.
- * ...      - A 'char **spec_entry' for each parameter.
- * returns  - The number of items processed. On error, it returns -1 with errno
- *            set and may set errbuf to a specific error message.
- *
- * This function calls read_spec_entry() to do the actual string processing.
- * As such, can return anything from that function as well.
- */
-int hidden read_spec_entries(char *line_buf, const char **errbuf, int num_args, ...)
-{
-	char **spec_entry, *buf_p;
-	int len, rc, items, entry_len = 0;
-	va_list ap;
-
-	*errbuf = NULL;
-
-	len = strlen(line_buf);
-	if (line_buf[len - 1] == '\n')
-		line_buf[len - 1] = '\0';
-	else
-		/* Handle case if line not \n terminated by bumping
-		 * the len for the check below (as the line is NUL
-		 * terminated by getline(3)) */
-		len++;
-
-	buf_p = line_buf;
-	while (isspace(*buf_p))
-		buf_p++;
-
-	/* Skip comment lines and empty lines. */
-	if (*buf_p == '#' || *buf_p == '\0')
-		return 0;
-
-	/* Process the spec file entries */
-	va_start(ap, num_args);
-
-	items = 0;
-	while (items < num_args) {
-		spec_entry = va_arg(ap, char **);
-
-		if (len - 1 == buf_p - line_buf) {
-			va_end(ap);
-			return items;
-		}
-
-		rc = read_spec_entry(spec_entry, &buf_p, &entry_len, errbuf);
-		if (rc < 0) {
-			va_end(ap);
-			return rc;
-		}
-		if (entry_len)
-			items++;
-	}
-	va_end(ap);
-	return items;
-}
diff --git a/src/lgetfilecon.c b/src/lgetfilecon.c
deleted file mode 100644
index 22851a4..0000000
--- a/src/lgetfilecon.c
+++ /dev/null
@@ -1,50 +0,0 @@
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/xattr.h>
-#include "selinux_internal.h"
-#include "policy.h"
-
-int lgetfilecon(const char *path, char ** context)
-{
-	char *buf;
-	ssize_t size;
-	ssize_t ret;
-
-	size = INITCONTEXTLEN + 1;
-	buf = malloc(size);
-	if (!buf)
-		return -1;
-	memset(buf, 0, size);
-
-	ret = lgetxattr(path, XATTR_NAME_SELINUX, buf, size - 1);
-	if (ret < 0 && errno == ERANGE) {
-		char *newbuf;
-
-		size = lgetxattr(path, XATTR_NAME_SELINUX, NULL, 0);
-		if (size < 0)
-			goto out;
-
-		size++;
-		newbuf = realloc(buf, size);
-		if (!newbuf)
-			goto out;
-
-		buf = newbuf;
-		memset(buf, 0, size);
-		ret = lgetxattr(path, XATTR_NAME_SELINUX, buf, size - 1);
-	}
-      out:
-	if (ret == 0) {
-		/* Re-map empty attribute values to errors. */
-		errno = EOPNOTSUPP;
-		ret = -1;
-	}
-	if (ret < 0)
-		free(buf);
-	else
-		*context = buf;
-	return ret;
-}
diff --git a/src/load_policy.c b/src/load_policy.c
deleted file mode 100644
index 51a178a..0000000
--- a/src/load_policy.c
+++ /dev/null
@@ -1,41 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <sys/mman.h>
-#include <sys/mount.h>
-#include <sys/utsname.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <ctype.h>
-#include <string.h>
-#include <errno.h>
-#include "selinux_internal.h"
-#include <dlfcn.h>
-#include "policy.h"
-#include <limits.h>
-#include "callbacks.h"
-
-int security_load_policy(void *data, size_t len)
-{
-	char path[PATH_MAX];
-	int fd, ret;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s/load", selinux_mnt);
-	fd = open(path, O_RDWR | O_CLOEXEC);
-	if (fd < 0)
-		return -1;
-
-	ret = write(fd, data, len);
-	close(fd);
-	if (ret < 0)
-		return -1;
-	return 0;
-}
-
-hidden_def(security_load_policy)
diff --git a/src/lsetfilecon.c b/src/lsetfilecon.c
deleted file mode 100644
index 7147f9e..0000000
--- a/src/lsetfilecon.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/xattr.h>
-#include "selinux_internal.h"
-#include "policy.h"
-
-int lsetfilecon(const char *path, const char *context)
-{
-	return lsetxattr(path, XATTR_NAME_SELINUX, context, strlen(context) + 1,
-			 0);
-}
-
diff --git a/src/mapping.c b/src/mapping.c
deleted file mode 100644
index f205804..0000000
--- a/src/mapping.c
+++ /dev/null
@@ -1,210 +0,0 @@
-/*
- * Class and permission mappings.
- */
-
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <stdarg.h>
-#include <selinux/selinux.h>
-#include <selinux/avc.h>
-#include "mapping.h"
-
-/*
- * Class and permission mappings
- */
-
-struct selinux_mapping {
-	security_class_t value; /* real, kernel value */
-	unsigned num_perms;
-	access_vector_t perms[sizeof(access_vector_t) * 8];
-};
-
-static struct selinux_mapping *current_mapping = NULL;
-static security_class_t current_mapping_size = 0;
-
-/*
- * Mapping setting function
- */
-
-int
-selinux_set_mapping(struct security_class_mapping *map)
-{
-	size_t size = sizeof(struct selinux_mapping);
-	security_class_t i, j;
-	unsigned k;
-
-	free(current_mapping);
-	current_mapping = NULL;
-	current_mapping_size = 0;
-
-	if (avc_reset() < 0)
-		goto err;
-
-	/* Find number of classes in the input mapping */
-	if (!map) {
-		errno = EINVAL;
-		goto err;
-	}
-	i = 0;
-	while (map[i].name)
-		i++;
-
-	/* Allocate space for the class records, plus one for class zero */
-	current_mapping = (struct selinux_mapping *)calloc(++i, size);
-	if (!current_mapping)
-		goto err;
-
-	/* Store the raw class and permission values */
-	j = 0;
-	while (map[j].name) {
-		struct security_class_mapping *p_in = map + (j++);
-		struct selinux_mapping *p_out = current_mapping + j;
-
-		p_out->value = string_to_security_class(p_in->name);
-		if (!p_out->value)
-			goto err2;
-
-		k = 0;
-		while (p_in->perms[k]) {
-			/* An empty permission string skips ahead */
-			if (!*p_in->perms[k]) {
-				k++;
-				continue;
-			}
-			p_out->perms[k] = string_to_av_perm(p_out->value,
-							    p_in->perms[k]);
-			if (!p_out->perms[k])
-				goto err2;
-			k++;
-		}
-		p_out->num_perms = k;
-	}
-
-	/* Set the mapping size here so the above lookups are "raw" */
-	current_mapping_size = i;
-	return 0;
-err2:
-	free(current_mapping);
-	current_mapping = NULL;
-	current_mapping_size = 0;
-err:
-	return -1;
-}
-
-/*
- * Get real, kernel values from mapped values
- */
-
-security_class_t
-unmap_class(security_class_t tclass)
-{
-	if (tclass < current_mapping_size)
-		return current_mapping[tclass].value;
-
-	/* If here no mapping set or the class requested is not valid. */
-	if (current_mapping_size != 0) {
-		errno = EINVAL;
-		return 0;
-	}
-	else
-		return tclass;
-}
-
-access_vector_t
-unmap_perm(security_class_t tclass, access_vector_t tperm)
-{
-	if (tclass < current_mapping_size) {
-		unsigned i;
-		access_vector_t kperm = 0;
-
-		for (i=0; i<current_mapping[tclass].num_perms; i++)
-			if (tperm & (1<<i)) {
-				kperm |= current_mapping[tclass].perms[i];
-				tperm &= ~(1<<i);
-			}
-		return kperm;
-	}
-
-	/* If here no mapping set or the perm requested is not valid. */
-	if (current_mapping_size != 0) {
-		errno = EINVAL;
-		return 0;
-	}
-	else
-		return tperm;
-}
-
-/*
- * Get mapped values from real, kernel values
- */
-
-security_class_t
-map_class(security_class_t kclass)
-{
-	security_class_t i;
-
-	for (i=0; i<current_mapping_size; i++)
-		if (current_mapping[i].value == kclass)
-			return i;
-
-/* If here no mapping set or the class requested is not valid. */
-	if (current_mapping_size != 0) {
-		errno = EINVAL;
-		return 0;
-	}
-	else
-		return kclass;
-}
-
-access_vector_t
-map_perm(security_class_t tclass, access_vector_t kperm)
-{
-	if (tclass < current_mapping_size) {
-		unsigned i;
-		access_vector_t tperm = 0;
-
-		for (i=0; i<current_mapping[tclass].num_perms; i++)
-			if (kperm & current_mapping[tclass].perms[i]) {
-				tperm |= 1<<i;
-				kperm &= ~current_mapping[tclass].perms[i];
-			}
-
-		if (tperm == 0) {
-			errno = EINVAL;
-			return 0;
-		}
-		else
-			return tperm;
-	}
-	return kperm;
-}
-
-void
-map_decision(security_class_t tclass, struct av_decision *avd)
-{
-	if (tclass < current_mapping_size) {
-		unsigned i;
-		access_vector_t result;
-
-		for (i=0, result=0; i<current_mapping[tclass].num_perms; i++)
-			if (avd->allowed & current_mapping[tclass].perms[i])
-				result |= 1<<i;
-		avd->allowed = result;
-
-		for (i=0, result=0; i<current_mapping[tclass].num_perms; i++)
-			if (avd->decided & current_mapping[tclass].perms[i])
-				result |= 1<<i;
-		avd->decided = result;
-
-		for (i=0, result=0; i<current_mapping[tclass].num_perms; i++)
-			if (avd->auditallow & current_mapping[tclass].perms[i])
-				result |= 1<<i;
-		avd->auditallow = result;
-
-		for (i=0, result=0; i<current_mapping[tclass].num_perms; i++)
-			if (avd->auditdeny & current_mapping[tclass].perms[i])
-				result |= 1<<i;
-		avd->auditdeny = result;
-	}
-}
diff --git a/src/mapping.h b/src/mapping.h
deleted file mode 100644
index b96756b..0000000
--- a/src/mapping.h
+++ /dev/null
@@ -1,41 +0,0 @@
-/*
- * This file describes the class and permission mappings used to 
- * hide the kernel numbers from userspace by allowing userspace object
- * managers to specify a list of classes and permissions.
- */
-#ifndef _SELINUX_MAPPING_H_
-#define _SELINUX_MAPPING_H_
-
-#include <selinux/selinux.h>
-
-/*
- * Get real, kernel values from mapped values
- */
-
-extern security_class_t
-unmap_class(security_class_t tclass);
-
-extern access_vector_t
-unmap_perm(security_class_t tclass, access_vector_t tperm);
-
-/*
- * Get mapped values from real, kernel values
- */
-
-extern security_class_t
-map_class(security_class_t kclass);
-
-extern access_vector_t
-map_perm(security_class_t tclass, access_vector_t kperm);
-
-extern void
-map_decision(security_class_t tclass, struct av_decision *avd);
-
-/*mapping is not used for embedded build*/
-#ifdef DISABLE_AVC 
-#define unmap_perm(x,y) y
-#define unmap_class(x) x
-#define map_decision(x,y) 
-#endif
-
-#endif				/* _SELINUX_MAPPING_H_ */
diff --git a/src/policy.h b/src/policy.h
deleted file mode 100644
index 92a416e..0000000
--- a/src/policy.h
+++ /dev/null
@@ -1,28 +0,0 @@
-#ifndef _POLICY_H_
-#define _POLICY_H_
-
-/* Private definitions used internally by libselinux. */
-
-/* xattr name for SELinux attributes. */
-#define XATTR_NAME_SELINUX "security.selinux"
-
-/* Initial length guess for getting contexts. */
-#define INITCONTEXTLEN 255
-
-/* selinuxfs magic number */
-#define SELINUX_MAGIC 0xf97cff8c
-
-/* Preferred selinuxfs mount point directory paths. */
-#define SELINUXMNT "/sys/fs/selinux"
-#define OLDSELINUXMNT "/selinux"
-
-/* selinuxfs filesystem type string. */
-#define SELINUXFS "selinuxfs"
-
-/* selinuxfs mount point determined at runtime */
-extern char *selinux_mnt;
-
-/* First version of policy supported in mainline Linux. */
-#define DEFAULT_POLICY_VERSION 15
-
-#endif
diff --git a/src/policyvers.c b/src/policyvers.c
deleted file mode 100644
index 284a7f7..0000000
--- a/src/policyvers.c
+++ /dev/null
@@ -1,45 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include "selinux_internal.h"
-#include <stdio.h>
-#include "policy.h"
-#include "dso.h"
-#include <limits.h>
-
-int security_policyvers(void)
-{
-	int fd, ret;
-	char path[PATH_MAX];
-	char buf[20];
-	unsigned vers = DEFAULT_POLICY_VERSION;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s/policyvers", selinux_mnt);
-	fd = open(path, O_RDONLY);
-	if (fd < 0) {
-		if (errno == ENOENT)
-			return vers;
-		else
-			return -1;
-	}
-	memset(buf, 0, sizeof buf);
-	ret = read(fd, buf, sizeof buf - 1);
-	close(fd);
-	if (ret < 0)
-		return -1;
-
-	if (sscanf(buf, "%u", &vers) != 1)
-		return -1;
-
-	return vers;
-}
-
-hidden_def(security_policyvers)
diff --git a/src/procattr.c b/src/procattr.c
deleted file mode 100644
index 74c0012..0000000
--- a/src/procattr.c
+++ /dev/null
@@ -1,176 +0,0 @@
-#include <sys/syscall.h>
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <stdio.h>
-#include <errno.h>
-#include "selinux_internal.h"
-#include "policy.h"
-
-#ifdef HOST
-static pid_t gettid(void)
-{
-	return syscall(__NR_gettid);
-}
-#endif
-
-static int openattr(pid_t pid, const char *attr, int flags)
-{
-	int fd, rc;
-	char *path;
-	pid_t tid;
-
-	if (pid > 0) {
-		rc = asprintf(&path, "/proc/%d/attr/%s", pid, attr);
-	} else if (pid == 0) {
-		rc = asprintf(&path, "/proc/thread-self/attr/%s", attr);
-		if (rc < 0)
-			return -1;
-		fd = open(path, flags | O_CLOEXEC);
-		if (fd >= 0 || errno != ENOENT)
-			goto out;
-		free(path);
-		tid = gettid();
-		rc = asprintf(&path, "/proc/self/task/%d/attr/%s", tid, attr);
-	} else {
-		errno = EINVAL;
-		return -1;
-	}
-	if (rc < 0)
-		return -1;
-
-	fd = open(path, flags | O_CLOEXEC);
-out:
-	free(path);
-	return fd;
-}
-
-static int getprocattrcon(char ** context,
-			  pid_t pid, const char *attr)
-{
-	char *buf;
-	size_t size;
-	int fd;
-	ssize_t ret;
-	int errno_hold;
-
-	fd = openattr(pid, attr, O_RDONLY);
-	if (fd < 0)
-		return -1;
-
-	size = selinux_page_size;
-	buf = malloc(size);
-	if (!buf) {
-		ret = -1;
-		goto out;
-	}
-	memset(buf, 0, size);
-
-	do {
-		ret = read(fd, buf, size - 1);
-	} while (ret < 0 && errno == EINTR);
-	if (ret < 0)
-		goto out2;
-
-	if (ret == 0) {
-		*context = NULL;
-		goto out2;
-	}
-
-	*context = strdup(buf);
-	if (!(*context)) {
-		ret = -1;
-		goto out2;
-	}
-	ret = 0;
-      out2:
-	free(buf);
-      out:
-	errno_hold = errno;
-	close(fd);
-	errno = errno_hold;
-	return ret;
-}
-
-static int setprocattrcon(const char * context,
-			  pid_t pid, const char *attr)
-{
-	int fd;
-	ssize_t ret;
-	int errno_hold;
-
-	fd = openattr(pid, attr, O_RDWR);
-	if (fd < 0)
-		return -1;
-	if (context)
-		do {
-			ret = write(fd, context, strlen(context) + 1);
-		} while (ret < 0 && errno == EINTR);
-	else
-		do {
-			ret = write(fd, NULL, 0);	/* clear */
-		} while (ret < 0 && errno == EINTR);
-	errno_hold = errno;
-	close(fd);
-	errno = errno_hold;
-	if (ret < 0)
-		return -1;
-	else
-		return 0;
-}
-
-#define getselfattr_def(fn, attr) \
-	int get##fn(char **c) \
-	{ \
-		return getprocattrcon(c, 0, #attr); \
-	}
-
-#define setselfattr_def(fn, attr) \
-	int set##fn(const char * c) \
-	{ \
-		return setprocattrcon(c, 0, #attr); \
-	}
-
-#define all_selfattr_def(fn, attr) \
-	getselfattr_def(fn, attr)	 \
-	setselfattr_def(fn, attr)
-
-#define getpidattr_def(fn, attr) \
-	int get##fn(pid_t pid, char **c)	\
-	{ \
-		if (pid <= 0) { \
-			errno = EINVAL; \
-			return -1; \
-		} else { \
-			return getprocattrcon(c, pid, #attr); \
-		} \
-	}
-
-all_selfattr_def(con, current)
-    getpidattr_def(pidcon, current)
-    getselfattr_def(prevcon, prev)
-    all_selfattr_def(execcon, exec)
-    all_selfattr_def(fscreatecon, fscreate)
-    all_selfattr_def(sockcreatecon, sockcreate)
-    all_selfattr_def(keycreatecon, keycreate)
-
-    hidden_def(getcon_raw)
-    hidden_def(getcon)
-    hidden_def(getexeccon_raw)
-    hidden_def(getfilecon_raw)
-    hidden_def(getfilecon)
-    hidden_def(getfscreatecon_raw)
-    hidden_def(getkeycreatecon_raw)
-    hidden_def(getpeercon_raw)
-    hidden_def(getpidcon_raw)
-    hidden_def(getprevcon_raw)
-    hidden_def(getprevcon)
-    hidden_def(getsockcreatecon_raw)
-    hidden_def(setcon_raw)
-    hidden_def(setexeccon_raw)
-    hidden_def(setexeccon)
-    hidden_def(setfilecon_raw)
-    hidden_def(setfscreatecon_raw)
-    hidden_def(setkeycreatecon_raw)
-    hidden_def(setsockcreatecon_raw)
diff --git a/src/regex.c b/src/regex.c
deleted file mode 100644
index 32fe6ab..0000000
--- a/src/regex.c
+++ /dev/null
@@ -1,391 +0,0 @@
-#include <assert.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-
-#include "regex.h"
-#include "label_file.h"
-
-int regex_prepare_data(struct regex_data ** regex, char const * pattern_string,
-			struct regex_error_data * errordata) {
-	memset(errordata, 0, sizeof(struct regex_error_data));
-	*regex = regex_data_create();
-	if (!(*regex))
-		return -1;
-#ifdef USE_PCRE2
-	(*regex)->regex = pcre2_compile((PCRE2_SPTR)pattern_string,
-			PCRE2_ZERO_TERMINATED,
-			PCRE2_DOTALL,
-			&errordata->error_code,
-			&errordata->error_offset, NULL);
-#else
-	(*regex)->regex = pcre_compile(pattern_string, PCRE_DOTALL,
-					&errordata->error_buffer,
-					&errordata->error_offset, NULL);
-#endif
-	if (!(*regex)->regex) {
-		goto err;
-	}
-
-#ifdef USE_PCRE2
-	(*regex)->match_data =
-		pcre2_match_data_create_from_pattern((*regex)->regex, NULL);
-	if (!(*regex)->match_data) {
-		goto err;
-	}
-#else
-	(*regex)->sd = pcre_study((*regex)->regex, 0, &errordata->error_buffer);
-	if (!(*regex)->sd && errordata->error_buffer) {
-		goto err;
-	}
-	(*regex)->extra_owned = !!(*regex)->sd;
-#endif
-	return 0;
-
-err:	regex_data_free(*regex);
-	*regex = NULL;
-	return -1;
-}
-
-char const * regex_version() {
-#ifdef USE_PCRE2
-	static int initialized = 0;
-	static char * version_string = NULL;
-	size_t version_string_len;
-	if (!initialized) {
-		version_string_len = pcre2_config(PCRE2_CONFIG_VERSION, NULL);
-		version_string = (char*) malloc(version_string_len);
-		if (!version_string) {
-			return NULL;
-		}
-		pcre2_config(PCRE2_CONFIG_VERSION, version_string);
-		initialized = 1;
-	}
-	return version_string;
-#else
-	return pcre_version();
-#endif
-}
-
-int regex_load_mmap(struct mmap_area * mmap_area, struct regex_data ** regex) {
-	int rc;
-	size_t entry_len, info_len;
-
-	rc = next_entry(&entry_len, mmap_area, sizeof(uint32_t));
-#ifdef USE_PCRE2
-	if (rc < 0)
-		return -1;
-
-#ifndef NO_PERSISTENTLY_STORED_PATTERNS
-	/* this should yield exactly one because we store one pattern at a time
-	 */
-	rc = pcre2_serialize_get_number_of_codes(mmap_area->next_addr);
-	if (rc != 1)
-		return -1;
-
-	*regex = regex_data_create();
-	if (!*regex)
-		return -1;
-
-	rc = pcre2_serialize_decode(&(*regex)->regex, 1,
-			(PCRE2_SPTR)mmap_area->next_addr, NULL);
-	if (rc != 1)
-		goto err;
-
-	(*regex)->match_data =
-		pcre2_match_data_create_from_pattern((*regex)->regex, NULL);
-	if (!(*regex)->match_data)
-		goto err;
-
-#endif /* NO_PERSISTENTLY_STORED_PATTERNS */
-	/* and skip the decoded bit */
-	rc = next_entry(NULL, mmap_area, entry_len);
-	if (rc < 0)
-		goto err;
-
-	return 0;
-#else
-	if (rc < 0 || !entry_len) {
-		rc = -1;
-		return -1;
-	}
-	*regex = regex_data_create();
-	if (!(*regex))
-		return -1;
-
-	(*regex)->regex = (pcre *) mmap_area->next_addr;
-	rc = next_entry(NULL, mmap_area, entry_len);
-	if (rc < 0)
-		goto err;
-
-	/* Check that regex lengths match. pcre_fullinfo()
-	 * also validates its magic number. */
-	rc = pcre_fullinfo((*regex)->regex, NULL, PCRE_INFO_SIZE, &info_len);
-	if (rc < 0 || info_len != entry_len) {
-		goto err;
-	}
-
-	rc = next_entry(&entry_len, mmap_area, sizeof(uint32_t));
-	if (rc < 0 || !entry_len) {
-		goto err;
-	}
-	(*regex)->lsd.study_data = (void *) mmap_area->next_addr;
-	(*regex)->lsd.flags |= PCRE_EXTRA_STUDY_DATA;
-	rc = next_entry(NULL, mmap_area, entry_len);
-	if (rc < 0)
-		goto err;
-
-	/* Check that study data lengths match. */
-	rc = pcre_fullinfo((*regex)->regex, &(*regex)->lsd,
-	PCRE_INFO_STUDYSIZE,
-				&info_len);
-	if (rc < 0 || info_len != entry_len) {
-		goto err;
-	}
-	(*regex)->extra_owned = 0;
-	return 0;
-#endif
-	err: regex_data_free(*regex);
-	*regex = NULL;
-	return -1;
-}
-
-int regex_writef(struct regex_data * regex, FILE * fp) {
-	int rc;
-	size_t len;
-#ifdef USE_PCRE2
-	PCRE2_UCHAR * bytes;
-	PCRE2_SIZE to_write;
-
-#ifndef NO_PERSISTENTLY_STORED_PATTERNS
-	/* encode the patter for serialization */
-	rc = pcre2_serialize_encode(&regex->regex, 1, &bytes, &to_write, NULL);
-	if (rc != 1)
-		return -1;
-
-#else
-	(void)regex; // silence unused parameter warning
-	to_write = 0;
-#endif
-	/* write serialized pattern's size */
-	len = fwrite(&to_write, sizeof(uint32_t), 1, fp);
-	if (len != 1) {
-#ifndef NO_PERSISTENTLY_STORED_PATTERNS
-		pcre2_serialize_free(bytes);
-#endif
-		return -1;
-	}
-
-#ifndef NO_PERSISTENTLY_STORED_PATTERNS
-	/* write serialized pattern */
-	len = fwrite(bytes, 1, to_write, fp);
-	if (len != to_write) {
-		pcre2_serialize_free(bytes);
-		return -1;
-	}
-	pcre2_serialize_free(bytes);
-#endif
-#else
-	uint32_t to_write;
-	size_t size;
-	pcre_extra * sd = regex->extra_owned ? regex->sd : &regex->lsd;
-
-	/* determine the size of the pcre data in bytes */
-	rc = pcre_fullinfo(regex->regex, NULL, PCRE_INFO_SIZE, &size);
-	if (rc < 0)
-		return -1;
-
-	/* write the number of bytes in the pcre data */
-	to_write = size;
-	len = fwrite(&to_write, sizeof(uint32_t), 1, fp);
-	if (len != 1)
-		return -1;
-
-	/* write the actual pcre data as a char array */
-	len = fwrite(regex->regex, 1, to_write, fp);
-	if (len != to_write)
-		return -1;
-
-	/* determine the size of the pcre study info */
-	rc = pcre_fullinfo(regex->regex, sd, PCRE_INFO_STUDYSIZE, &size);
-	if (rc < 0)
-		return -1;
-
-	/* write the number of bytes in the pcre study data */
-	to_write = size;
-	len = fwrite(&to_write, sizeof(uint32_t), 1, fp);
-	if (len != 1)
-		return -1;
-
-	/* write the actual pcre study data as a char array */
-	len = fwrite(sd->study_data, 1, to_write, fp);
-	if (len != to_write)
-		return -1;
-#endif
-	return 0;
-}
-
-struct regex_data * regex_data_create() {
-	struct regex_data * dummy = (struct regex_data*) malloc(
-			sizeof(struct regex_data));
-	if (dummy) {
-		memset(dummy, 0, sizeof(struct regex_data));
-	}
-	return dummy;
-}
-
-void regex_data_free(struct regex_data * regex) {
-	if (regex) {
-#ifdef USE_PCRE2
-		if (regex->regex) {
-			pcre2_code_free(regex->regex);
-		}
-		if (regex->match_data) {
-			pcre2_match_data_free(regex->match_data);
-		}
-#else
-		if (regex->regex)
-			pcre_free(regex->regex);
-		if (regex->extra_owned && regex->sd) {
-			pcre_free_study(regex->sd);
-		}
-#endif
-		free(regex);
-	}
-}
-
-int regex_match(struct regex_data * regex, char const * subject, int partial) {
-	int rc;
-#ifdef USE_PCRE2
-	rc = pcre2_match(regex->regex,
-			(PCRE2_SPTR)subject, PCRE2_ZERO_TERMINATED, 0,
-			partial ? PCRE2_PARTIAL_SOFT : 0, regex->match_data,
-			NULL);
-	if (rc > 0)
-	return REGEX_MATCH;
-	switch (rc) {
-		case PCRE2_ERROR_PARTIAL:
-			return REGEX_MATCH_PARTIAL;
-		case PCRE2_ERROR_NOMATCH:
-			return REGEX_NO_MATCH;
-		default:
-			return REGEX_ERROR;
-	}
-#else
-	rc = pcre_exec(regex->regex,
-			regex->extra_owned ? regex->sd : &regex->lsd, subject,
-			strlen(subject), 0, partial ? PCRE_PARTIAL_SOFT : 0,
-			NULL,
-			0);
-	switch (rc) {
-		case 0:
-			return REGEX_MATCH;
-		case PCRE_ERROR_PARTIAL:
-			return REGEX_MATCH_PARTIAL;
-		case PCRE_ERROR_NOMATCH:
-			return REGEX_NO_MATCH;
-		default:
-			return REGEX_ERROR;
-	}
-#endif
-}
-
-/* TODO Replace this compare function with something that actually compares the
- * regular expressions.
- * This compare function basically just compares the binary representations of
- * the automatons, and because this representation contains pointers and
- * metadata, it can only return a match if regex1 == regex2.
- * Preferably, this function would be replaced with an algorithm that computes
- * the equivalence of the automatons systematically.
- */
-int regex_cmp(struct regex_data * regex1, struct regex_data * regex2) {
-	int rc;
-	size_t len1, len2;
-#ifdef USE_PCRE2
-	rc = pcre2_pattern_info(regex1->regex, PCRE2_INFO_SIZE, &len1);
-	assert(rc == 0);
-	rc = pcre2_pattern_info(regex2->regex, PCRE2_INFO_SIZE, &len2);
-	assert(rc == 0);
-	if (len1 != len2 || memcmp(regex1->regex, regex2->regex, len1))
-		return SELABEL_INCOMPARABLE;
-#else
-	rc = pcre_fullinfo(regex1->regex, NULL, PCRE_INFO_SIZE, &len1);
-	assert(rc == 0);
-	rc = pcre_fullinfo(regex2->regex, NULL, PCRE_INFO_SIZE, &len2);
-	assert(rc == 0);
-	if (len1 != len2 || memcmp(regex1->regex, regex2->regex, len1))
-		return SELABEL_INCOMPARABLE;
-#endif
-	return SELABEL_EQUAL;
-}
-
-void regex_format_error(struct regex_error_data const * error_data,
-			char * buffer, size_t buf_size) {
-	unsigned the_end_length = buf_size > 4 ? 4 : buf_size;
-	char * ptr = &buffer[buf_size - the_end_length];
-	int rc = 0;
-	size_t pos = 0;
-	if (!buffer || !buf_size)
-		return;
-	rc = snprintf(buffer, buf_size, "REGEX back-end error: ");
-	if (rc < 0)
-		/* If snprintf fails it constitutes a logical error that needs
-		 * fixing.
-		 */
-		abort();
-
-	pos += rc;
-	if (pos >= buf_size)
-		goto truncated;
-
-	if (error_data->error_offset > 0) {
-#ifdef USE_PCRE2
-		rc = snprintf(buffer + pos, buf_size - pos, "At offset %zu: ",
-				error_data->error_offset);
-#else
-		rc = snprintf(buffer + pos, buf_size - pos, "At offset %d: ",
-				error_data->error_offset);
-#endif
-		if (rc < 0)
-			abort();
-
-	}
-	pos += rc;
-	if (pos >= buf_size)
-		goto truncated;
-
-#ifdef USE_PCRE2
-	rc = pcre2_get_error_message(error_data->error_code,
-			(PCRE2_UCHAR*)(buffer + pos),
-			buf_size - pos);
-	if (rc == PCRE2_ERROR_NOMEMORY)
-		goto truncated;
-#else
-	rc = snprintf(buffer + pos, buf_size - pos, "%s",
-			error_data->error_buffer);
-	if (rc < 0)
-		abort();
-
-	if ((size_t)rc < strlen(error_data->error_buffer))
-		goto truncated;
-#endif
-
-	return;
-
-truncated:
-	/* replace end of string with "..." to indicate that it was truncated */
-	switch (the_end_length) {
-		/* no break statements, fall-through is intended */
-		case 4:
-			*ptr++ = '.';
-		case 3:
-			*ptr++ = '.';
-		case 2:
-			*ptr++ = '.';
-		case 1:
-			*ptr++ = '\0';
-		default:
-			break;
-	}
-	return;
-}
diff --git a/src/regex.h b/src/regex.h
deleted file mode 100644
index 7b74f32..0000000
--- a/src/regex.h
+++ /dev/null
@@ -1,166 +0,0 @@
-#ifndef SRC_REGEX_H_
-#define SRC_REGEX_H_
-
-#include <stdio.h>
-
-#ifdef USE_PCRE2
-#include <pcre2.h>
-#else
-#include <pcre.h>
-#endif
-
-enum {
-	REGEX_MATCH,
-	REGEX_MATCH_PARTIAL,
-	REGEX_NO_MATCH,
-	REGEX_ERROR = -1,
-};
-
-#ifdef USE_PCRE2
-struct regex_data {
-	pcre2_code * regex; /* compiled regular expression */
-	pcre2_match_data * match_data; /* match data block required for the compiled
-	 pattern in regex2 */
-};
-
-struct regex_error_data {
-	int error_code;
-	PCRE2_SIZE error_offset;
-};
-
-/* ^^^^^^ USE_PCRE2  ^^^^^^ */
-#else
-/* vvvvvv USE_PCRE vvvvvv */
-
-/* Prior to version 8.20, libpcre did not have pcre_free_study() */
-#if (PCRE_MAJOR < 8 || (PCRE_MAJOR == 8 && PCRE_MINOR < 20))
-#define pcre_free_study  pcre_free
-#endif
-
-struct regex_data {
-	pcre *regex; /* compiled regular expression */
-	int extra_owned;
-	union {
-		pcre_extra *sd; /* pointer to extra compiled stuff */
-		pcre_extra lsd; /* used to hold the mmap'd version */
-	};
-};
-
-struct regex_error_data {
-	char const * error_buffer;
-	int error_offset;
-};
-
-#endif /* USE_PCRE2 */
-
-struct mmap_area;
-
-/**
- * regex_verison returns the version string of the underlying regular
- * regular expressions library. In the case of PCRE it just returns the
- * result of pcre_version(). In the case of PCRE2, the very first time this
- * function is called it allocates a buffer large enough to hold the version
- * string and reads the PCRE2_CONFIG_VERSION option to fill the buffer.
- * The allocated buffer will linger in memory until the calling process is being
- * reaped.
- *
- * It may return NULL on error.
- */
-char const * regex_version();
-/**
- * This constructor function allocates a buffer for a regex_data structure.
- * The buffer is being initialized with zeroes.
- */
-struct regex_data * regex_data_create();
-/**
- * This complementary destructor function frees the a given regex_data buffer.
- * It also frees any non NULL member pointers with the appropriate pcreX_X_free
- * function. For PCRE this function respects the extra_owned field and frees
- * the pcre_extra data conditionally. Calling this function on a NULL pointer is
- * save.
- */
-void regex_data_free(struct regex_data * regex);
-/**
- * This function compiles the regular expression. Additionally, it prepares
- * data structures required by the different underlying engines. For PCRE
- * it calls pcre_study to generate optional data required for optimized
- * execution of the compiled pattern. In the case of PCRE2, it allocates
- * a pcre2_match_data structure of appropriate size to hold all possible
- * matches created by the pattern.
- *
- * @arg regex If successful, the structure returned through *regex was allocated
- *            with regex_data_create and must be freed with regex_data_free.
- * @arg pattern_string The pattern string that is to be compiled.
- * @arg errordata A pointer to a regex_error_data structure must be passed
- *                to this function. This structure depends on the underlying
- *                implementation. It can be passed to regex_format_error
- *                to generate a human readable error message.
- * @retval 0 on success
- * @retval -1 on error
- */
-int regex_prepare_data(struct regex_data ** regex, char const * pattern_string,
-			struct regex_error_data * errordata);
-/**
- * This function loads a serialized precompiled pattern from a contiguous
- * data region given by map_area.
- *
- * @arg map_area Description of the memory region holding a serialized
- *               representation of the precompiled pattern.
- * @arg regex If successful, the structure returned through *regex was allocated
- *            with regex_data_create and must be freed with regex_data_free.
- *
- * @retval 0 on success
- * @retval -1 on error
- */
-int regex_load_mmap(struct mmap_area * map_area, struct regex_data ** regex);
-/**
- * This function stores a precompiled regular expression to a file.
- * In the case of PCRE, it just dumps the binary representation of the
- * precomplied pattern into a file. In the case of PCRE2, it uses the
- * serialization function provided by the library.
- *
- * @arg regex The precomplied regular expression data.
- * @arg fp A file stream specifying the output file.
- */
-int regex_writef(struct regex_data * regex, FILE * fp);
-/**
- * This function applies a precompiled pattern to a subject string and
- * returns whether or not a match was found.
- *
- * @arg regex The precompiled pattern.
- * @arg subject The subject string.
- * @arg partial Boolean indicating if partial matches are wanted. A nonzero
- *              value is equivalent to specifying PCRE[2]_PARTIAL_SOFT as
- *              option to pcre_exec of pcre2_match.
- * @retval REGEX_MATCH if a match was found
- * @retval REGEX_MATCH_PARTIAL if a partial match was found
- * @retval REGEX_NO_MATCH if no match was found
- * @retval REGEX_ERROR if an error was encountered during the execution of the
- *                     regular expression
- */
-int regex_match(struct regex_data * regex, char const * subject, int partial);
-/**
- * This function compares two compiled regular expressions (regex1 and regex2).
- * It compares the binary representations of the compiled patterns. It is a very
- * crude approximation because the binary representation holds data like
- * reference counters, that has nothing to do with the actual state machine.
- *
- * @retval SELABEL_EQUAL if the pattern's binary representations are exactly
- *                       the same
- * @retval SELABEL_INCOMPARABLE otherwise
- */
-int regex_cmp(struct regex_data * regex1, struct regex_data * regex2);
-/**
- * This function takes the error data returned by regex_prepare_data and turns
- * it in to a human readable error message.
- * If the buffer given to hold the error message is to small it truncates the
- * message and indicates the truncation with an ellipsis ("...") at the end of
- * the buffer.
- *
- * @arg error_data Error data as returned by regex_prepare_data.
- * @arg buffer String buffer to hold the formated error string.
- * @arg buf_size Total size of the given bufer in bytes.
- */
-void regex_format_error(struct regex_error_data const * error_data,
-			char * buffer, size_t buf_size);
-#endif  /* SRC_REGEX_H_ */
diff --git a/src/selinux_internal.h b/src/selinux_internal.h
deleted file mode 100644
index 5087bb6..0000000
--- a/src/selinux_internal.h
+++ /dev/null
@@ -1,132 +0,0 @@
-#include <selinux/selinux.h>
-#include <pthread.h>
-#include "dso.h"
-
-hidden_proto(selinux_mkload_policy)
-    hidden_proto(set_selinuxmnt)
-    hidden_proto(security_disable)
-    hidden_proto(security_policyvers)
-    hidden_proto(security_load_policy)
-    hidden_proto(security_get_boolean_active)
-    hidden_proto(security_get_boolean_names)
-    hidden_proto(security_set_boolean)
-    hidden_proto(security_commit_booleans)
-    hidden_proto(security_check_context)
-    hidden_proto(security_check_context_raw)
-    hidden_proto(security_canonicalize_context)
-    hidden_proto(security_canonicalize_context_raw)
-    hidden_proto(security_compute_av)
-    hidden_proto(security_compute_av_raw)
-    hidden_proto(security_compute_av_flags)
-    hidden_proto(security_compute_av_flags_raw)
-    hidden_proto(security_compute_user)
-    hidden_proto(security_compute_user_raw)
-    hidden_proto(security_compute_create)
-    hidden_proto(security_compute_create_raw)
-    hidden_proto(security_compute_member_raw)
-    hidden_proto(security_compute_relabel_raw)
-    hidden_proto(is_selinux_enabled)
-    hidden_proto(is_selinux_mls_enabled)
-    hidden_proto(freecon)
-    hidden_proto(freeconary)
-    hidden_proto(getprevcon)
-    hidden_proto(getprevcon_raw)
-    hidden_proto(getcon)
-    hidden_proto(getcon_raw)
-    hidden_proto(setcon_raw)
-    hidden_proto(getpeercon_raw)
-    hidden_proto(getpidcon_raw)
-    hidden_proto(getexeccon_raw)
-    hidden_proto(getfilecon)
-    hidden_proto(getfilecon_raw)
-    hidden_proto(lgetfilecon_raw)
-    hidden_proto(fgetfilecon_raw)
-    hidden_proto(setfilecon_raw)
-    hidden_proto(lsetfilecon_raw)
-    hidden_proto(fsetfilecon_raw)
-    hidden_proto(setexeccon)
-    hidden_proto(setexeccon_raw)
-    hidden_proto(getfscreatecon_raw)
-    hidden_proto(getkeycreatecon_raw)
-    hidden_proto(getsockcreatecon_raw)
-    hidden_proto(setfscreatecon_raw)
-    hidden_proto(setkeycreatecon_raw)
-    hidden_proto(setsockcreatecon_raw)
-    hidden_proto(security_getenforce)
-    hidden_proto(security_setenforce)
-    hidden_proto(security_deny_unknown)
-    hidden_proto(selinux_binary_policy_path)
-    hidden_proto(selinux_default_context_path)
-    hidden_proto(selinux_securetty_types_path)
-    hidden_proto(selinux_failsafe_context_path)
-    hidden_proto(selinux_removable_context_path)
-    hidden_proto(selinux_virtual_domain_context_path)
-    hidden_proto(selinux_virtual_image_context_path)
-    hidden_proto(selinux_file_context_path)
-    hidden_proto(selinux_file_context_homedir_path)
-    hidden_proto(selinux_file_context_local_path)
-    hidden_proto(selinux_file_context_subs_path)
-    hidden_proto(selinux_netfilter_context_path)
-    hidden_proto(selinux_homedir_context_path)
-    hidden_proto(selinux_user_contexts_path)
-    hidden_proto(selinux_booleans_path)
-    hidden_proto(selinux_customizable_types_path)
-    hidden_proto(selinux_media_context_path)
-    hidden_proto(selinux_x_context_path)
-    hidden_proto(selinux_sepgsql_context_path)
-    hidden_proto(selinux_path)
-    hidden_proto(selinux_check_passwd_access)
-    hidden_proto(selinux_check_securetty_context)
-    hidden_proto(matchpathcon_init_prefix)
-    hidden_proto(selinux_users_path)
-    hidden_proto(selinux_usersconf_path);
-hidden_proto(selinux_translations_path);
-hidden_proto(selinux_colors_path);
-hidden_proto(selinux_getenforcemode);
-hidden_proto(selinux_getpolicytype);
-hidden_proto(selinux_raw_to_trans_context);
-hidden_proto(selinux_trans_to_raw_context);
-    hidden_proto(selinux_raw_context_to_color);
-hidden_proto(security_get_initial_context);
-hidden_proto(security_get_initial_context_raw);
-hidden_proto(selinux_reset_config);
-
-extern int selinux_page_size hidden;
-
-/* Make pthread_once optional */
-#pragma weak pthread_once
-#pragma weak pthread_key_create
-#pragma weak pthread_key_delete
-#pragma weak pthread_setspecific
-
-/* Call handler iff the first call.  */
-#define __selinux_once(ONCE_CONTROL, INIT_FUNCTION)	\
-	do {						\
-		if (pthread_once != NULL)		\
-			pthread_once (&(ONCE_CONTROL), (INIT_FUNCTION));  \
-		else if ((ONCE_CONTROL) == PTHREAD_ONCE_INIT) {		  \
-			INIT_FUNCTION ();		\
-			(ONCE_CONTROL) = 2;		\
-		}					\
-	} while (0)
-
-/* Pthread key macros */
-#define __selinux_key_create(KEY, DESTRUCTOR)			\
-	do {							\
-		if (pthread_key_create != NULL)			\
-			pthread_key_create(KEY, DESTRUCTOR);	\
-	} while (0)
-
-#define __selinux_key_delete(KEY)				\
-	do {							\
-		if (pthread_key_delete != NULL)			\
-			pthread_key_delete(KEY);		\
-	} while (0)
-
-#define __selinux_setspecific(KEY, VALUE)			\
-	do {							\
-		if (pthread_setspecific != NULL)		\
-			pthread_setspecific(KEY, VALUE);	\
-	} while (0)
-
-
diff --git a/src/selinux_netlink.h b/src/selinux_netlink.h
deleted file mode 100644
index 88ef551..0000000
--- a/src/selinux_netlink.h
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Netlink event notifications for SELinux.
- *
- * Author: James Morris <jmorris@redhat.com>
- */
-#ifndef _LINUX_SELINUX_NETLINK_H
-#define _LINUX_SELINUX_NETLINK_H
-
-/* Message types. */
-#define SELNL_MSG_BASE 0x10
-enum {
-	SELNL_MSG_SETENFORCE = SELNL_MSG_BASE,
-	SELNL_MSG_POLICYLOAD,
-	SELNL_MSG_MAX
-};
-
-/* Multicast groups */
-#define SELNL_GRP_NONE		0x00000000
-#define SELNL_GRP_AVC		0x00000001	/* AVC notifications */
-#define SELNL_GRP_ALL		0xffffffff
-
-/* Message structures */
-struct selnl_msg_setenforce {
-	int32_t val;
-};
-
-struct selnl_msg_policyload {
-	uint32_t seqno;
-};
-
-#endif				/* _LINUX_SELINUX_NETLINK_H */
diff --git a/src/sestatus.c b/src/sestatus.c
deleted file mode 100644
index ed29dc5..0000000
--- a/src/sestatus.c
+++ /dev/null
@@ -1,349 +0,0 @@
-/*
- * sestatus.c
- *
- * APIs to reference SELinux kernel status page (/selinux/status)
- *
- * Author: KaiGai Kohei <kaigai@ak.jp.nec.com>
- *
- */
-#include <fcntl.h>
-#include <limits.h>
-#include <sched.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
-#include <sys/types.h>
-#include <unistd.h>
-#include "avc_internal.h"
-#include "policy.h"
-
-/*
- * copied from the selinux/include/security.h
- */
-struct selinux_status_t
-{
-	uint32_t	version;	/* version number of thie structure */
-	uint32_t	sequence;	/* sequence number of seqlock logic */
-	uint32_t	enforcing;	/* current setting of enforcing mode */
-	uint32_t	policyload;	/* times of policy reloaded */
-	uint32_t	deny_unknown;	/* current setting of deny_unknown */
-	/* version > 0 support above status */
-} __attribute((packed));
-
-/*
- * `selinux_status'
- *
- * NULL : not initialized yet
- * MAP_FAILED : opened, but fallback-mode
- * Valid Pointer : opened and mapped correctly
- */
-static struct selinux_status_t *selinux_status = NULL;
-static int			selinux_status_fd;
-static uint32_t			last_seqno;
-
-static uint32_t			fallback_sequence;
-static int			fallback_enforcing;
-static int			fallback_policyload;
-
-/*
- * read_sequence
- *
- * A utility routine to reference kernel status page according to
- * seqlock logic. Since selinux_status->sequence is an odd value during
- * the kernel status page being updated, we try to synchronize completion
- * of this updating, but we assume it is rare.
- * The sequence is almost even number.
- *
- * __sync_synchronize is a portable memory barrier for various kind
- * of architecture that is supported by GCC.
- */
-static inline uint32_t read_sequence(struct selinux_status_t *status)
-{
-	uint32_t	seqno = 0;
-
-	do {
-		/*
-		 * No need for sched_yield() in the first trial of
-		 * this loop.
-		 */
-		if (seqno & 0x0001)
-			sched_yield();
-
-		seqno = status->sequence;
-
-		__sync_synchronize();
-
-	} while (seqno & 0x0001);
-
-	return seqno;
-}
-
-/*
- * selinux_status_updated
- *
- * It returns whether something has been happened since the last call.
- * Because `selinux_status->sequence' shall be always incremented on
- * both of setenforce/policyreload events, so differences from the last
- * value informs us something has been happened.
- */
-int selinux_status_updated(void)
-{
-	uint32_t	curr_seqno;
-	int		result = 0;
-
-	if (selinux_status == NULL) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	if (selinux_status == MAP_FAILED) {
-		if (avc_netlink_check_nb() < 0)
-			return -1;
-
-		curr_seqno = fallback_sequence;
-	} else {
-		curr_seqno = read_sequence(selinux_status);
-	}
-
-	/*
-	 * `curr_seqno' is always even-number, so it does not match with
-	 * `last_seqno' being initialized to odd-number in the first call.
-	 * We never return 'something was updated' in the first call,
-	 * because this function focuses on status-updating since the last
-	 * invocation.
-	 */
-	if (last_seqno & 0x0001)
-		last_seqno = curr_seqno;
-
-	if (last_seqno != curr_seqno)
-	{
-		last_seqno = curr_seqno;
-		result = 1;
-	}
-	return result;
-}
-
-/*
- * selinux_status_getenforce
- *
- * It returns the current performing mode of SELinux.
- * 1 means currently we run in enforcing mode, or 0 means permissive mode.
- */
-int selinux_status_getenforce(void)
-{
-	uint32_t	seqno;
-	uint32_t	enforcing;
-
-	if (selinux_status == NULL) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	if (selinux_status == MAP_FAILED) {
-		if (avc_netlink_check_nb() < 0)
-			return -1;
-
-		return fallback_enforcing;
-	}
-
-	/* sequence must not be changed during references */
-	do {
-		seqno = read_sequence(selinux_status);
-
-		enforcing = selinux_status->enforcing;
-
-	} while (seqno != read_sequence(selinux_status));
-
-	return enforcing ? 1 : 0;
-}
-
-/*
- * selinux_status_policyload
- *
- * It returns times of policy reloaded on the running system.
- * Note that it is not a reliable value on fallback-mode until it receives
- * the first event message via netlink socket, so, a correct usage of this
- * value is to compare it with the previous value to detect policy reloaded
- * event.
- */
-int selinux_status_policyload(void)
-{
-	uint32_t	seqno;
-	uint32_t	policyload;
-
-	if (selinux_status == NULL) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	if (selinux_status == MAP_FAILED) {
-		if (avc_netlink_check_nb() < 0)
-			return -1;
-
-		return fallback_policyload;
-	}
-
-	/* sequence must not be changed during references */
-	do {
-		seqno = read_sequence(selinux_status);
-
-		policyload = selinux_status->policyload;
-
-	} while (seqno != read_sequence(selinux_status));
-
-	return policyload;
-}
-
-/*
- * selinux_status_deny_unknown
- *
- * It returns a guideline to handle undefined object classes or permissions.
- * 0 means SELinux treats policy queries on undefined stuff being allowed,
- * however, 1 means such queries are denied.
- */
-int selinux_status_deny_unknown(void)
-{
-	uint32_t	seqno;
-	uint32_t	deny_unknown;
-
-	if (selinux_status == NULL) {
-		errno = EINVAL;
-		return -1;
-	}
-
-	if (selinux_status == MAP_FAILED)
-		return security_deny_unknown();
-
-	/* sequence must not be changed during references */
-	do {
-		seqno = read_sequence(selinux_status);
-
-		deny_unknown = selinux_status->deny_unknown;
-
-	} while (seqno != read_sequence(selinux_status));
-
-	return deny_unknown ? 1 : 0;
-}
-
-/*
- * callback routines for fallback case using netlink socket
- */
-static int fallback_cb_setenforce(int enforcing)
-{
-	fallback_sequence += 2;
-	fallback_enforcing = enforcing;
-
-	return 0;
-}
-
-static int fallback_cb_policyload(int policyload)
-{
-	fallback_sequence += 2;
-	fallback_policyload = policyload;
-
-	return 0;
-}
-
-/*
- * selinux_status_open
- *
- * It tries to open and mmap kernel status page (/selinux/status).
- * Since Linux 2.6.37 or later supports this feature, we may run
- * fallback routine using a netlink socket on older kernels, if
- * the supplied `fallback' is not zero.
- * It returns 0 on success, or -1 on error.
- */
-int selinux_status_open(int fallback)
-{
-	int	fd;
-	char	path[PATH_MAX];
-	long	pagesize;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	pagesize = sysconf(_SC_PAGESIZE);
-	if (pagesize < 0)
-		return -1;
-
-	snprintf(path, sizeof(path), "%s/status", selinux_mnt);
-	fd = open(path, O_RDONLY | O_CLOEXEC);
-	if (fd < 0)
-		goto error;
-
-	selinux_status = mmap(NULL, pagesize, PROT_READ, MAP_SHARED, fd, 0);
-	if (selinux_status == MAP_FAILED) {
-		close(fd);
-		goto error;
-	}
-	selinux_status_fd = fd;
-	last_seqno = (uint32_t)(-1);
-
-	return 0;
-
-error:
-	/*
-	 * If caller wants fallback routine, we try to provide
-	 * an equivalent functionality using existing netlink
-	 * socket, although it needs system call invocation to
-	 * receive event notification.
-	 */
-	if (fallback && avc_netlink_open(0) == 0) {
-		union selinux_callback	cb;
-
-		/* register my callbacks */
-		cb.func_setenforce = fallback_cb_setenforce;
-		selinux_set_callback(SELINUX_CB_SETENFORCE, cb);
-		cb.func_policyload = fallback_cb_policyload;
-		selinux_set_callback(SELINUX_CB_POLICYLOAD, cb);
-
-		/* mark as fallback mode */
-		selinux_status = MAP_FAILED;
-		selinux_status_fd = avc_netlink_acquire_fd();
-		last_seqno = (uint32_t)(-1);
-
-		fallback_sequence = 0;
-		fallback_enforcing = security_getenforce();
-		fallback_policyload = 0;
-
-		return 1;
-	}
-	selinux_status = NULL;
-
-	return -1;
-}
-
-/*
- * selinux_status_close
- *
- * It unmap and close the kernel status page, or close netlink socket
- * if fallback mode.
- */
-void selinux_status_close(void)
-{
-	long pagesize;
-
-	/* not opened */
-	if (selinux_status == NULL)
-		return;
-
-	/* fallback-mode */
-	if (selinux_status == MAP_FAILED)
-	{
-		avc_netlink_release_fd();
-		avc_netlink_close();
-		selinux_status = NULL;
-		return;
-	}
-
-	pagesize = sysconf(_SC_PAGESIZE);
-	/* not much we can do other than leak memory */
-	if (pagesize > 0)
-		munmap(selinux_status, pagesize);
-	selinux_status = NULL;
-
-	close(selinux_status_fd);
-	selinux_status_fd = -1;
-	last_seqno = (uint32_t)(-1);
-}
diff --git a/src/setenforce.c b/src/setenforce.c
deleted file mode 100644
index e5e7612..0000000
--- a/src/setenforce.c
+++ /dev/null
@@ -1,37 +0,0 @@
-#include <unistd.h>
-#include <sys/types.h>
-#include <fcntl.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <string.h>
-#include "selinux_internal.h"
-#include "policy.h"
-#include <stdio.h>
-#include <limits.h>
-
-int security_setenforce(int value)
-{
-	int fd, ret;
-	char path[PATH_MAX];
-	char buf[20];
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return -1;
-	}
-
-	snprintf(path, sizeof path, "%s/enforce", selinux_mnt);
-	fd = open(path, O_RDWR);
-	if (fd < 0)
-		return -1;
-
-	snprintf(buf, sizeof buf, "%d", value);
-	ret = write(fd, buf, strlen(buf));
-	close(fd);
-	if (ret < 0)
-		return -1;
-
-	return 0;
-}
-
-hidden_def(security_setenforce)
diff --git a/src/setfilecon.c b/src/setfilecon.c
deleted file mode 100644
index 81322f8..0000000
--- a/src/setfilecon.c
+++ /dev/null
@@ -1,15 +0,0 @@
-#include <unistd.h>
-#include <fcntl.h>
-#include <string.h>
-#include <stdlib.h>
-#include <errno.h>
-#include <sys/xattr.h>
-#include "selinux_internal.h"
-#include "policy.h"
-
-int setfilecon(const char *path, const char *context)
-{
-	return setxattr(path, XATTR_NAME_SELINUX, context, strlen(context) + 1,
-			0);
-}
-
diff --git a/src/stringrep.c b/src/stringrep.c
deleted file mode 100644
index c867222..0000000
--- a/src/stringrep.c
+++ /dev/null
@@ -1,277 +0,0 @@
-/*
- * String representation support for classes and permissions.
- */
-#include <sys/stat.h>
-#include <dirent.h>
-#include <fcntl.h>
-#include <limits.h>
-#include <unistd.h>
-#include <errno.h>
-#include <stddef.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include <ctype.h>
-#include "selinux_internal.h"
-#include "policy.h"
-#include "mapping.h"
-
-#define MAXVECTORS 8*sizeof(access_vector_t)
-
-struct discover_class_node {
-	char *name;
-	security_class_t value;
-	char **perms;
-
-	struct discover_class_node *next;
-};
-
-static struct discover_class_node *discover_class_cache = NULL;
-
-static struct discover_class_node * get_class_cache_entry_name(const char *s)
-{
-	struct discover_class_node *node = discover_class_cache;
-
-	for (; node != NULL && strcmp(s,node->name) != 0; node = node->next);
-
-	return node;
-}
-
-static struct discover_class_node * get_class_cache_entry_value(security_class_t c)
-{
-	struct discover_class_node *node = discover_class_cache;
-
-	for (; node != NULL && c != node->value; node = node->next);
-
-	return node;
-}
-
-static struct discover_class_node * discover_class(const char *s)
-{
-	int fd, ret;
-	char path[PATH_MAX];
-	char buf[20];
-	DIR *dir;
-	struct dirent *dentry;
-	size_t i;
-
-	struct discover_class_node *node;
-
-	if (!selinux_mnt) {
-		errno = ENOENT;
-		return NULL;
-	}
-
-	/* allocate a node */
-	node = malloc(sizeof(struct discover_class_node));
-	if (node == NULL)
-		return NULL;
-
-	/* allocate array for perms */
-	node->perms = calloc(MAXVECTORS,sizeof(char*));
-	if (node->perms == NULL)
-		goto err1;
-
-	/* load up the name */
-	node->name = strdup(s);
-	if (node->name == NULL)
-		goto err2;
-
-	/* load up class index */
-	snprintf(path, sizeof path, "%s/class/%s/index", selinux_mnt,s);
-	fd = open(path, O_RDONLY);
-	if (fd < 0)
-		goto err3;
-
-	memset(buf, 0, sizeof(buf));
-	ret = read(fd, buf, sizeof(buf) - 1);
-	close(fd);
-	if (ret < 0)
-		goto err3;
-
-	if (sscanf(buf, "%hu", &node->value) != 1)
-		goto err3;
-
-	/* load up permission indicies */
-	snprintf(path, sizeof path, "%s/class/%s/perms",selinux_mnt,s);
-	dir = opendir(path);
-	if (dir == NULL)
-		goto err3;
-
-	dentry = readdir(dir);
-	while (dentry != NULL) {
-		unsigned int value;
-		struct stat m;
-
-		snprintf(path, sizeof path, "%s/class/%s/perms/%s", selinux_mnt,s,dentry->d_name);
-		fd = open(path, O_RDONLY | O_CLOEXEC);
-		if (fd < 0)
-			goto err4;
-
-		if (fstat(fd, &m) < 0) {
-			close(fd);
-			goto err4;
-		}
-
-		if (m.st_mode & S_IFDIR) {
-			close(fd);
-			dentry = readdir(dir);
-			continue;
-		}
-
-		memset(buf, 0, sizeof(buf));
-		ret = read(fd, buf, sizeof(buf) - 1);
-		close(fd);
-		if (ret < 0)
-			goto err4;
-
-		if (sscanf(buf, "%u", &value) != 1)
-			goto err4;
-
-		if (value == 0 || value > MAXVECTORS)
-			goto err4;
-
-		node->perms[value-1] = strdup(dentry->d_name);
-		if (node->perms[value-1] == NULL)
-			goto err4;
-
-		dentry = readdir(dir);
-	}
-	closedir(dir);
-
-	node->next = discover_class_cache;
-	discover_class_cache = node;
-
-	return node;
-
-err4:
-	closedir(dir);
-	for (i=0; i<MAXVECTORS; i++)
-		free(node->perms[i]);
-err3:
-	free(node->name);
-err2:
-	free(node->perms);
-err1:
-	free(node);
-	return NULL;
-}
-
-security_class_t string_to_security_class(const char *s)
-{
-	struct discover_class_node *node;
-
-	node = get_class_cache_entry_name(s);
-	if (node == NULL) {
-		node = discover_class(s);
-
-		if (node == NULL) {
-			errno = EINVAL;
-			return 0;
-		}
-	}
-
-	return map_class(node->value);
-}
-
-access_vector_t string_to_av_perm(security_class_t tclass, const char *s)
-{
-	struct discover_class_node *node;
-	security_class_t kclass = unmap_class(tclass);
-
-	node = get_class_cache_entry_value(kclass);
-	if (node != NULL) {
-		size_t i;
-		for (i=0; i<MAXVECTORS && node->perms[i] != NULL; i++)
-			if (strcmp(node->perms[i],s) == 0)
-				return map_perm(tclass, 1<<i);
-	}
-
-	errno = EINVAL;
-	return 0;
-}
-
-const char *security_class_to_string(security_class_t tclass)
-{
-	struct discover_class_node *node;
-
-	tclass = unmap_class(tclass);
-
-	node = get_class_cache_entry_value(tclass);
-	if (node)
-		return node->name;
-	return NULL;
-}
-
-const char *security_av_perm_to_string(security_class_t tclass,
-				       access_vector_t av)
-{
-	struct discover_class_node *node;
-	size_t i;
-
-	av = unmap_perm(tclass, av);
-	tclass = unmap_class(tclass);
-
-	node = get_class_cache_entry_value(tclass);
-	if (av && node)
-		for (i = 0; i<MAXVECTORS; i++)
-			if ((1<<i) & av)
-				return node->perms[i];
-
-	return NULL;
-}
-
-int security_av_string(security_class_t tclass, access_vector_t av, char **res)
-{
-	unsigned int i = 0;
-	size_t len = 5;
-	access_vector_t tmp = av;
-	int rc = 0;
-	const char *str;
-	char *ptr;
-
-	/* first pass computes the required length */
-	while (tmp) {
-		if (tmp & 1) {
-			str = security_av_perm_to_string(tclass, av & (1<<i));
-			if (str)
-				len += strlen(str) + 1;
-			else {
-				rc = -1;
-				errno = EINVAL;
-				goto out;
-			}
-		}
-		tmp >>= 1;
-		i++;
-	}
-
-	*res = malloc(len);
-	if (!*res) {
-		rc = -1;
-		goto out;
-	}
-
-	/* second pass constructs the string */
-	i = 0;
-	tmp = av;
-	ptr = *res;
-
-	if (!av) {
-		sprintf(ptr, "null");
-		goto out;
-	}
-
-	ptr += sprintf(ptr, "{ ");
-	while (tmp) {
-		if (tmp & 1)
-			ptr += sprintf(ptr, "%s ", security_av_perm_to_string(
-					       tclass, av & (1<<i)));
-		tmp >>= 1;
-		i++;
-	}
-	sprintf(ptr, "}");
-out:
-	return rc;
-}
diff --git a/utils/sefcontext_compile.c b/utils/sefcontext_compile.c
deleted file mode 100644
index f88c756..0000000
--- a/utils/sefcontext_compile.c
+++ /dev/null
@@ -1,363 +0,0 @@
-#include <ctype.h>
-#include <errno.h>
-#include <stdint.h>
-#include <stdio.h>
-#include <string.h>
-#include <unistd.h>
-#include <sys/types.h>
-#include <sys/stat.h>
-#include <getopt.h>
-#include <limits.h>
-#include <selinux/selinux.h>
-
-#include "../src/label_file.h"
-#include "../src/regex.h"
-
-static int validate_context(char __attribute__ ((unused)) **ctx)
-{
-	return 0;
-}
-
-static int process_file(struct selabel_handle *rec, const char *filename)
-{
-	unsigned int line_num;
-	int rc;
-	char *line_buf = NULL;
-	size_t line_len = 0;
-	FILE *context_file;
-	const char *prefix = NULL;
-
-	context_file = fopen(filename, "r");
-	if (!context_file) {
-		fprintf(stderr, "Error opening %s: %s\n",
-			    filename, strerror(errno));
-		return -1;
-	}
-
-	line_num = 0;
-	rc = 0;
-	while (getline(&line_buf, &line_len, context_file) > 0) {
-		rc = process_line(rec, filename, prefix, line_buf, ++line_num);
-		if (rc)
-			goto out;
-	}
-out:
-	free(line_buf);
-	fclose(context_file);
-	return rc;
-}
-
-/*
- * File Format
- *
- * u32 - magic number
- * u32 - version
- * u32 - length of pcre version EXCLUDING nul
- * char - pcre version string EXCLUDING nul
- * u32 - number of stems
- * ** Stems
- *	u32  - length of stem EXCLUDING nul
- *	char - stem char array INCLUDING nul
- * u32 - number of regexs
- * ** Regexes
- *	u32  - length of upcoming context INCLUDING nul
- *	char - char array of the raw context
- *	u32  - length of the upcoming regex_str
- *	char - char array of the original regex string including the stem.
- *	u32  - mode bits for >= SELINUX_COMPILED_FCONTEXT_MODE
- *	       mode_t for <= SELINUX_COMPILED_FCONTEXT_PCRE_VERS
- *	s32  - stemid associated with the regex
- *	u32  - spec has meta characters
- *	u32  - The specs prefix_len if >= SELINUX_COMPILED_FCONTEXT_PREFIX_LEN
- *	u32  - data length of the pcre regex
- *	char - a bufer holding the raw pcre regex info
- *	u32  - data length of the pcre regex study daya
- *	char - a buffer holding the raw pcre regex study data
- */
-static int write_binary_file(struct saved_data *data, int fd)
-{
-	struct spec *specs = data->spec_arr;
-	FILE *bin_file;
-	size_t len;
-	uint32_t magic = SELINUX_MAGIC_COMPILED_FCONTEXT;
-	uint32_t section_len;
-	uint32_t i;
-	int rc;
-
-	bin_file = fdopen(fd, "w");
-	if (!bin_file) {
-		perror("fopen output_file");
-		exit(EXIT_FAILURE);
-	}
-
-	/* write some magic number */
-	len = fwrite(&magic, sizeof(uint32_t), 1, bin_file);
-	if (len != 1)
-		goto err;
-
-	/* write the version */
-	section_len = SELINUX_COMPILED_FCONTEXT_MAX_VERS;
-	len = fwrite(&section_len, sizeof(uint32_t), 1, bin_file);
-	if (len != 1)
-		goto err;
-
-	/* write version of the regex back-end */
-	if (!regex_version())
-		goto err;
-	section_len = strlen(regex_version());
-	len = fwrite(&section_len, sizeof(uint32_t), 1, bin_file);
-	if (len != 1)
-		goto err;
-	len = fwrite(regex_version(), sizeof(char), section_len, bin_file);
-	if (len != section_len)
-		goto err;
-
-	/* write the number of stems coming */
-	section_len = data->num_stems;
-	len = fwrite(&section_len, sizeof(uint32_t), 1, bin_file);
-	if (len != 1)
-		goto err;
-
-	for (i = 0; i < section_len; i++) {
-		char *stem = data->stem_arr[i].buf;
-		uint32_t stem_len = data->stem_arr[i].len;
-
-		/* write the strlen (aka no nul) */
-		len = fwrite(&stem_len, sizeof(uint32_t), 1, bin_file);
-		if (len != 1)
-			goto err;
-
-		/* include the nul in the file */
-		stem_len += 1;
-		len = fwrite(stem, sizeof(char), stem_len, bin_file);
-		if (len != stem_len)
-			goto err;
-	}
-
-	/* write the number of regexes coming */
-	section_len = data->nspec;
-	len = fwrite(&section_len, sizeof(uint32_t), 1, bin_file);
-	if (len != 1)
-		goto err;
-
-	for (i = 0; i < section_len; i++) {
-		char *context = specs[i].lr.ctx_raw;
-		char *regex_str = specs[i].regex_str;
-		mode_t mode = specs[i].mode;
-		size_t prefix_len = specs[i].prefix_len;
-		int32_t stem_id = specs[i].stem_id;
-		struct regex_data *re = specs[i].regex;
-		uint32_t to_write;
-		size_t size;
-
-		/* length of the context string (including nul) */
-		to_write = strlen(context) + 1;
-		len = fwrite(&to_write, sizeof(uint32_t), 1, bin_file);
-		if (len != 1)
-			goto err;
-
-		/* original context strin (including nul) */
-		len = fwrite(context, sizeof(char), to_write, bin_file);
-		if (len != to_write)
-			goto err;
-
-		/* length of the original regex string (including nul) */
-		to_write = strlen(regex_str) + 1;
-		len = fwrite(&to_write, sizeof(uint32_t), 1, bin_file);
-		if (len != 1)
-			goto err;
-
-		/* original regex string */
-		len = fwrite(regex_str, sizeof(char), to_write, bin_file);
-		if (len != to_write)
-			goto err;
-
-		/* binary F_MODE bits */
-		to_write = mode;
-		len = fwrite(&to_write, sizeof(uint32_t), 1, bin_file);
-		if (len != 1)
-			goto err;
-
-		/* stem for this regex (could be -1) */
-		len = fwrite(&stem_id, sizeof(stem_id), 1, bin_file);
-		if (len != 1)
-			goto err;
-
-		/* does this spec have a metaChar? */
-		to_write = specs[i].hasMetaChars;
-		len = fwrite(&to_write, sizeof(to_write), 1, bin_file);
-		if (len != 1)
-			goto err;
-
-		/* For SELINUX_COMPILED_FCONTEXT_PREFIX_LEN */
-		to_write = prefix_len;
-		len = fwrite(&to_write, sizeof(to_write), 1, bin_file);
-		if (len != 1)
-			goto err;
-
-		/* Write regex related data */
-		rc = regex_writef(re, bin_file);
-		if (rc < 0)
-			goto err;
-	}
-
-	rc = 0;
-out:
-	fclose(bin_file);
-	return rc;
-err:
-	rc = -1;
-	goto out;
-}
-
-static void free_specs(struct saved_data *data)
-{
-	struct spec *specs = data->spec_arr;
-	unsigned int num_entries = data->nspec;
-	unsigned int i;
-
-	for (i = 0; i < num_entries; i++) {
-		free(specs[i].lr.ctx_raw);
-		free(specs[i].lr.ctx_trans);
-		free(specs[i].regex_str);
-		free(specs[i].type_str);
-		regex_data_free(specs[i].regex);
-	}
-	free(specs);
-
-	num_entries = data->num_stems;
-	for (i = 0; i < num_entries; i++)
-		free(data->stem_arr[i].buf);
-	free(data->stem_arr);
-
-	memset(data, 0, sizeof(*data));
-}
-
-static void usage(const char *progname)
-{
-	fprintf(stderr,
-		"usage: %s [-o out_file] fc_file\n"
-		"Where:\n\t"
-		"-o      Optional file name of the PCRE formatted binary\n\t"
-		"        file to be output. If not specified the default\n\t"
-		"        will be fc_file with the .bin suffix appended.\n\t"
-		"fc_file The text based file contexts file to be processed.\n",
-		progname);
-		exit(EXIT_FAILURE);
-}
-
-int main(int argc, char *argv[])
-{
-	const char *path = NULL;
-	const char *out_file = NULL;
-	char stack_path[PATH_MAX + 1];
-	char *tmp = NULL;
-	int fd, rc, opt;
-	struct stat buf;
-	struct selabel_handle *rec = NULL;
-	struct saved_data *data = NULL;
-
-	if (argc < 2)
-		usage(argv[0]);
-
-	while ((opt = getopt(argc, argv, "o:")) > 0) {
-		switch (opt) {
-		case 'o':
-			out_file = optarg;
-			break;
-		default:
-			usage(argv[0]);
-		}
-	}
-
-	if (optind >= argc)
-		usage(argv[0]);
-
-	path = argv[optind];
-	if (stat(path, &buf) < 0) {
-		fprintf(stderr, "Can not stat: %s: %m\n", path);
-		exit(EXIT_FAILURE);
-	}
-
-	/* Generate dummy handle for process_line() function */
-	rec = (struct selabel_handle *)calloc(1, sizeof(*rec));
-	if (!rec) {
-		fprintf(stderr, "Failed to calloc handle\n");
-		exit(EXIT_FAILURE);
-	}
-	rec->backend = SELABEL_CTX_FILE;
-
-	/* Need to set validation on to get the bin file generated by the
-	 * process_line function, however as the bin file being generated
-	 * may not be related to the currently loaded policy (that it
-	 * would be validated against), then set callback to ignore any
-	 * validation. */
-	rec->validating = 1;
-	selinux_set_callback(SELINUX_CB_VALIDATE,
-			    (union selinux_callback)&validate_context);
-
-	data = (struct saved_data *)calloc(1, sizeof(*data));
-	if (!data) {
-		fprintf(stderr, "Failed to calloc saved_data\n");
-		free(rec);
-		exit(EXIT_FAILURE);
-	}
-
-	rec->data = data;
-
-	rc = process_file(rec, path);
-	if (rc < 0)
-		goto err;
-
-	rc = sort_specs(data);
-	if (rc)
-		goto err;
-
-	if (out_file)
-		rc = snprintf(stack_path, sizeof(stack_path), "%s", out_file);
-	else
-		rc = snprintf(stack_path, sizeof(stack_path), "%s.bin", path);
-
-	if (rc < 0 || rc >= (int)sizeof(stack_path))
-		goto err;
-
-	tmp = malloc(strlen(stack_path) + 7);
-	if (!tmp)
-		goto err;
-
-	rc = sprintf(tmp, "%sXXXXXX", stack_path);
-	if (rc < 0)
-		goto err;
-
-	fd  = mkstemp(tmp);
-	if (fd < 0)
-		goto err;
-
-	rc = fchmod(fd, buf.st_mode);
-	if (rc < 0) {
-		perror("fchmod failed to set permission on compiled regexs");
-		goto err_unlink;
-	}
-
-	rc = write_binary_file(data, fd);
-	if (rc < 0)
-		goto err_unlink;
-
-	rc = rename(tmp, stack_path);
-	if (rc < 0)
-		goto err_unlink;
-
-	rc = 0;
-out:
-	free_specs(data);
-	free(rec);
-	free(data);
-	free(tmp);
-	return rc;
-
-err_unlink:
-	unlink(tmp);
-err:
-	rc = -1;
-	goto out;
-}
