16cd6a6acSopenharmony_ci#ifndef SELINUX_INTERNAL_H_
26cd6a6acSopenharmony_ci#define SELINUX_INTERNAL_H_
36cd6a6acSopenharmony_ci
46cd6a6acSopenharmony_ci#include <selinux/selinux.h>
56cd6a6acSopenharmony_ci#include <pthread.h>
66cd6a6acSopenharmony_ci
76cd6a6acSopenharmony_ci
86cd6a6acSopenharmony_ciextern int require_seusers ;
96cd6a6acSopenharmony_ciextern int selinux_page_size ;
106cd6a6acSopenharmony_ci
116cd6a6acSopenharmony_ci/* Make pthread_once optional */
126cd6a6acSopenharmony_ci#pragma weak pthread_once
136cd6a6acSopenharmony_ci#pragma weak pthread_key_create
146cd6a6acSopenharmony_ci#pragma weak pthread_key_delete
156cd6a6acSopenharmony_ci#pragma weak pthread_setspecific
166cd6a6acSopenharmony_ci#pragma weak pthread_getspecific
176cd6a6acSopenharmony_ci
186cd6a6acSopenharmony_ci/* Call handler iff the first call.  */
196cd6a6acSopenharmony_ci#define __selinux_once(ONCE_CONTROL, INIT_FUNCTION)	\
206cd6a6acSopenharmony_ci	do {						\
216cd6a6acSopenharmony_ci		if (pthread_once != NULL)		\
226cd6a6acSopenharmony_ci			pthread_once (&(ONCE_CONTROL), (INIT_FUNCTION));  \
236cd6a6acSopenharmony_ci		else if ((ONCE_CONTROL) == PTHREAD_ONCE_INIT) {		  \
246cd6a6acSopenharmony_ci			INIT_FUNCTION ();		\
256cd6a6acSopenharmony_ci			(ONCE_CONTROL) = 2;		\
266cd6a6acSopenharmony_ci		}					\
276cd6a6acSopenharmony_ci	} while (0)
286cd6a6acSopenharmony_ci
296cd6a6acSopenharmony_ci/* Pthread key macros */
306cd6a6acSopenharmony_ci#define __selinux_key_create(KEY, DESTRUCTOR)			\
316cd6a6acSopenharmony_ci	(pthread_key_create != NULL ? pthread_key_create(KEY, DESTRUCTOR) : -1)
326cd6a6acSopenharmony_ci
336cd6a6acSopenharmony_ci#define __selinux_key_delete(KEY)				\
346cd6a6acSopenharmony_ci	do {							\
356cd6a6acSopenharmony_ci		if (pthread_key_delete != NULL)			\
366cd6a6acSopenharmony_ci			pthread_key_delete(KEY);		\
376cd6a6acSopenharmony_ci	} while (0)
386cd6a6acSopenharmony_ci
396cd6a6acSopenharmony_ci#define __selinux_setspecific(KEY, VALUE)			\
406cd6a6acSopenharmony_ci	do {							\
416cd6a6acSopenharmony_ci		if (pthread_setspecific != NULL)		\
426cd6a6acSopenharmony_ci			pthread_setspecific(KEY, VALUE);	\
436cd6a6acSopenharmony_ci	} while (0)
446cd6a6acSopenharmony_ci
456cd6a6acSopenharmony_ci#define __selinux_getspecific(KEY)				\
466cd6a6acSopenharmony_ci	(pthread_getspecific != NULL ? pthread_getspecific(KEY) : NULL)
476cd6a6acSopenharmony_ci
486cd6a6acSopenharmony_ci/* selabel_lookup() is only thread safe if we're compiled with pthreads */
496cd6a6acSopenharmony_ci
506cd6a6acSopenharmony_ci#pragma weak pthread_mutex_init
516cd6a6acSopenharmony_ci#pragma weak pthread_mutex_destroy
526cd6a6acSopenharmony_ci#pragma weak pthread_mutex_lock
536cd6a6acSopenharmony_ci#pragma weak pthread_mutex_unlock
546cd6a6acSopenharmony_ci
556cd6a6acSopenharmony_ci#define __pthread_mutex_init(LOCK, ATTR) 			\
566cd6a6acSopenharmony_ci	do {							\
576cd6a6acSopenharmony_ci		if (pthread_mutex_init != NULL)			\
586cd6a6acSopenharmony_ci			pthread_mutex_init(LOCK, ATTR);		\
596cd6a6acSopenharmony_ci	} while (0)
606cd6a6acSopenharmony_ci
616cd6a6acSopenharmony_ci#define __pthread_mutex_destroy(LOCK) 				\
626cd6a6acSopenharmony_ci	do {							\
636cd6a6acSopenharmony_ci		if (pthread_mutex_destroy != NULL)		\
646cd6a6acSopenharmony_ci			pthread_mutex_destroy(LOCK);		\
656cd6a6acSopenharmony_ci	} while (0)
666cd6a6acSopenharmony_ci
676cd6a6acSopenharmony_ci#define __pthread_mutex_lock(LOCK) 				\
686cd6a6acSopenharmony_ci	do {							\
696cd6a6acSopenharmony_ci		if (pthread_mutex_lock != NULL)			\
706cd6a6acSopenharmony_ci			pthread_mutex_lock(LOCK);		\
716cd6a6acSopenharmony_ci	} while (0)
726cd6a6acSopenharmony_ci
736cd6a6acSopenharmony_ci#define __pthread_mutex_unlock(LOCK) 				\
746cd6a6acSopenharmony_ci	do {							\
756cd6a6acSopenharmony_ci		if (pthread_mutex_unlock != NULL)		\
766cd6a6acSopenharmony_ci			pthread_mutex_unlock(LOCK);		\
776cd6a6acSopenharmony_ci	} while (0)
786cd6a6acSopenharmony_ci
796cd6a6acSopenharmony_ci#pragma weak pthread_create
806cd6a6acSopenharmony_ci#pragma weak pthread_join
816cd6a6acSopenharmony_ci#pragma weak pthread_cond_init
826cd6a6acSopenharmony_ci#pragma weak pthread_cond_signal
836cd6a6acSopenharmony_ci#pragma weak pthread_cond_destroy
846cd6a6acSopenharmony_ci#pragma weak pthread_cond_wait
856cd6a6acSopenharmony_ci
866cd6a6acSopenharmony_ci/* check if all functions needed to do parallel operations are available */
876cd6a6acSopenharmony_ci#define __pthread_supported (					\
886cd6a6acSopenharmony_ci	pthread_create &&					\
896cd6a6acSopenharmony_ci	pthread_join &&						\
906cd6a6acSopenharmony_ci	pthread_cond_init &&					\
916cd6a6acSopenharmony_ci	pthread_cond_destroy &&					\
926cd6a6acSopenharmony_ci	pthread_cond_signal &&					\
936cd6a6acSopenharmony_ci	pthread_cond_wait					\
946cd6a6acSopenharmony_ci)
956cd6a6acSopenharmony_ci
966cd6a6acSopenharmony_ci#define SELINUXDIR "/etc/selinux/"
976cd6a6acSopenharmony_ci#define SELINUXCONFIG SELINUXDIR "config"
986cd6a6acSopenharmony_ci
996cd6a6acSopenharmony_ciextern int has_selinux_config ;
1006cd6a6acSopenharmony_ci
1016cd6a6acSopenharmony_ci#ifndef HAVE_STRLCPY
1026cd6a6acSopenharmony_cisize_t strlcpy(char *dest, const char *src, size_t size);
1036cd6a6acSopenharmony_ci#endif
1046cd6a6acSopenharmony_ci
1056cd6a6acSopenharmony_ci#endif /* SELINUX_INTERNAL_H_ */
106