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