1#ifndef SELINUX_INTERNAL_H_
2#define SELINUX_INTERNAL_H_
3
4#include <selinux/selinux.h>
5#include <pthread.h>
6
7
8extern int require_seusers ;
9extern int selinux_page_size ;
10
11/* Make pthread_once optional */
12#pragma weak pthread_once
13#pragma weak pthread_key_create
14#pragma weak pthread_key_delete
15#pragma weak pthread_setspecific
16#pragma weak pthread_getspecific
17
18/* Call handler iff the first call.  */
19#define __selinux_once(ONCE_CONTROL, INIT_FUNCTION)	\
20	do {						\
21		if (pthread_once != NULL)		\
22			pthread_once (&(ONCE_CONTROL), (INIT_FUNCTION));  \
23		else if ((ONCE_CONTROL) == PTHREAD_ONCE_INIT) {		  \
24			INIT_FUNCTION ();		\
25			(ONCE_CONTROL) = 2;		\
26		}					\
27	} while (0)
28
29/* Pthread key macros */
30#define __selinux_key_create(KEY, DESTRUCTOR)			\
31	(pthread_key_create != NULL ? pthread_key_create(KEY, DESTRUCTOR) : -1)
32
33#define __selinux_key_delete(KEY)				\
34	do {							\
35		if (pthread_key_delete != NULL)			\
36			pthread_key_delete(KEY);		\
37	} while (0)
38
39#define __selinux_setspecific(KEY, VALUE)			\
40	do {							\
41		if (pthread_setspecific != NULL)		\
42			pthread_setspecific(KEY, VALUE);	\
43	} while (0)
44
45#define __selinux_getspecific(KEY)				\
46	(pthread_getspecific != NULL ? pthread_getspecific(KEY) : NULL)
47
48/* selabel_lookup() is only thread safe if we're compiled with pthreads */
49
50#pragma weak pthread_mutex_init
51#pragma weak pthread_mutex_destroy
52#pragma weak pthread_mutex_lock
53#pragma weak pthread_mutex_unlock
54
55#define __pthread_mutex_init(LOCK, ATTR) 			\
56	do {							\
57		if (pthread_mutex_init != NULL)			\
58			pthread_mutex_init(LOCK, ATTR);		\
59	} while (0)
60
61#define __pthread_mutex_destroy(LOCK) 				\
62	do {							\
63		if (pthread_mutex_destroy != NULL)		\
64			pthread_mutex_destroy(LOCK);		\
65	} while (0)
66
67#define __pthread_mutex_lock(LOCK) 				\
68	do {							\
69		if (pthread_mutex_lock != NULL)			\
70			pthread_mutex_lock(LOCK);		\
71	} while (0)
72
73#define __pthread_mutex_unlock(LOCK) 				\
74	do {							\
75		if (pthread_mutex_unlock != NULL)		\
76			pthread_mutex_unlock(LOCK);		\
77	} while (0)
78
79#pragma weak pthread_create
80#pragma weak pthread_join
81#pragma weak pthread_cond_init
82#pragma weak pthread_cond_signal
83#pragma weak pthread_cond_destroy
84#pragma weak pthread_cond_wait
85
86/* check if all functions needed to do parallel operations are available */
87#define __pthread_supported (					\
88	pthread_create &&					\
89	pthread_join &&						\
90	pthread_cond_init &&					\
91	pthread_cond_destroy &&					\
92	pthread_cond_signal &&					\
93	pthread_cond_wait					\
94)
95
96#define SELINUXDIR "/etc/selinux/"
97#define SELINUXCONFIG SELINUXDIR "config"
98
99extern int has_selinux_config ;
100
101#ifndef HAVE_STRLCPY
102size_t strlcpy(char *dest, const char *src, size_t size);
103#endif
104
105#endif /* SELINUX_INTERNAL_H_ */
106