libc_private.h revision 278875
1169689Skan/* 2169689Skan * Copyright (c) 1998 John Birrell <jb@cimlogic.com.au>. 3169689Skan * All rights reserved. 4169689Skan * 5169689Skan * Redistribution and use in source and binary forms, with or without 6169689Skan * modification, are permitted provided that the following conditions 7169689Skan * are met: 8169689Skan * 1. Redistributions of source code must retain the above copyright 9169689Skan * notice, this list of conditions and the following disclaimer. 10169689Skan * 2. Redistributions in binary form must reproduce the above copyright 11169689Skan * notice, this list of conditions and the following disclaimer in the 12169689Skan * documentation and/or other materials provided with the distribution. 13169689Skan * 3. Neither the name of the author nor the names of any co-contributors 14169689Skan * may be used to endorse or promote products derived from this software 15169689Skan * without specific prior written permission. 16169689Skan * 17169689Skan * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND 18169689Skan * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19169689Skan * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20169689Skan * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 21169689Skan * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22169689Skan * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23169689Skan * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24169689Skan * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25169689Skan * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26169689Skan * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27169689Skan * SUCH DAMAGE. 28169689Skan * 29169689Skan * $FreeBSD: stable/10/lib/libc/include/libc_private.h 278875 2015-02-17 01:03:06Z kib $ 30169689Skan * 31169689Skan * Private definitions for libc, libc_r and libpthread. 32169689Skan * 33169689Skan */ 34169689Skan 35169689Skan#ifndef _LIBC_PRIVATE_H_ 36169689Skan#define _LIBC_PRIVATE_H_ 37169689Skan#include <sys/_types.h> 38169689Skan#include <sys/_pthreadtypes.h> 39169689Skan 40169689Skan/* 41169689Skan * This global flag is non-zero when a process has created one 42169689Skan * or more threads. It is used to avoid calling locking functions 43169689Skan * when they are not required. 44169689Skan */ 45169689Skanextern int __isthreaded; 46169689Skan 47169689Skan/* 48169689Skan * Elf_Auxinfo *__elf_aux_vector, the pointer to the ELF aux vector 49169689Skan * provided by kernel. Either set for us by rtld, or found at runtime 50169689Skan * on stack for static binaries. 51169689Skan * 52169689Skan * Type is void to avoid polluting whole libc with ELF types. 53169689Skan */ 54169689Skanextern void *__elf_aux_vector; 55169689Skan 56169689Skan/* 57169689Skan * libc should use libc_dlopen internally, which respects a global 58169689Skan * flag where loading of new shared objects can be restricted. 59169689Skan */ 60169689Skanvoid *libc_dlopen(const char *, int); 61169689Skan 62169689Skan/* 63169689Skan * For dynamic linker. 64169689Skan */ 65169689Skanvoid _rtld_error(const char *fmt, ...); 66169689Skan 67169689Skan/* 68169689Skan * File lock contention is difficult to diagnose without knowing 69169689Skan * where locks were set. Allow a debug library to be built which 70169689Skan * records the source file and line number of each lock call. 71169689Skan */ 72169689Skan#ifdef _FLOCK_DEBUG 73169689Skan#define _FLOCKFILE(x) _flockfile_debug(x, __FILE__, __LINE__) 74169689Skan#else 75169689Skan#define _FLOCKFILE(x) _flockfile(x) 76169689Skan#endif 77169689Skan 78169689Skan/* 79169689Skan * Macros for locking and unlocking FILEs. These test if the 80169689Skan * process is threaded to avoid locking when not required. 81169689Skan */ 82169689Skan#define FLOCKFILE(fp) if (__isthreaded) _FLOCKFILE(fp) 83169689Skan#define FUNLOCKFILE(fp) if (__isthreaded) _funlockfile(fp) 84169689Skan 85169689Skanstruct _spinlock; 86169689Skanextern struct _spinlock __stdio_thread_lock __hidden; 87169689Skan#define STDIO_THREAD_LOCK() \ 88169689Skando { \ 89169689Skan if (__isthreaded) \ 90169689Skan _SPINLOCK(&__stdio_thread_lock); \ 91169689Skan} while (0) 92169689Skan#define STDIO_THREAD_UNLOCK() \ 93169689Skando { \ 94169689Skan if (__isthreaded) \ 95169689Skan _SPINUNLOCK(&__stdio_thread_lock); \ 96169689Skan} while (0) 97169689Skan 98169689Skanvoid __libc_spinlock_stub(struct _spinlock *); 99169689Skanvoid __libc_spinunlock_stub(struct _spinlock *); 100169689Skan 101169689Skan/* 102169689Skan * Indexes into the pthread jump table. 103169689Skan * 104169689Skan * Warning! If you change this type, you must also change the threads 105169689Skan * libraries that reference it (libc_r, libpthread). 106169689Skan */ 107169689Skantypedef enum { 108169689Skan PJT_ATFORK, 109169689Skan PJT_ATTR_DESTROY, 110169689Skan PJT_ATTR_GETDETACHSTATE, 111169689Skan PJT_ATTR_GETGUARDSIZE, 112169689Skan PJT_ATTR_GETINHERITSCHED, 113169689Skan PJT_ATTR_GETSCHEDPARAM, 114169689Skan PJT_ATTR_GETSCHEDPOLICY, 115169689Skan PJT_ATTR_GETSCOPE, 116169689Skan PJT_ATTR_GETSTACKADDR, 117169689Skan PJT_ATTR_GETSTACKSIZE, 118169689Skan PJT_ATTR_INIT, 119169689Skan PJT_ATTR_SETDETACHSTATE, 120169689Skan PJT_ATTR_SETGUARDSIZE, 121169689Skan PJT_ATTR_SETINHERITSCHED, 122169689Skan PJT_ATTR_SETSCHEDPARAM, 123169689Skan PJT_ATTR_SETSCHEDPOLICY, 124169689Skan PJT_ATTR_SETSCOPE, 125169689Skan PJT_ATTR_SETSTACKADDR, 126169689Skan PJT_ATTR_SETSTACKSIZE, 127169689Skan PJT_CANCEL, 128169689Skan PJT_CLEANUP_POP, 129169689Skan PJT_CLEANUP_PUSH, 130169689Skan PJT_COND_BROADCAST, 131169689Skan PJT_COND_DESTROY, 132169689Skan PJT_COND_INIT, 133169689Skan PJT_COND_SIGNAL, 134169689Skan PJT_COND_TIMEDWAIT, 135169689Skan PJT_COND_WAIT, 136169689Skan PJT_DETACH, 137169689Skan PJT_EQUAL, 138169689Skan PJT_EXIT, 139169689Skan PJT_GETSPECIFIC, 140169689Skan PJT_JOIN, 141169689Skan PJT_KEY_CREATE, 142169689Skan PJT_KEY_DELETE, 143169689Skan PJT_KILL, 144169689Skan PJT_MAIN_NP, 145169689Skan PJT_MUTEXATTR_DESTROY, 146169689Skan PJT_MUTEXATTR_INIT, 147169689Skan PJT_MUTEXATTR_SETTYPE, 148169689Skan PJT_MUTEX_DESTROY, 149169689Skan PJT_MUTEX_INIT, 150169689Skan PJT_MUTEX_LOCK, 151169689Skan PJT_MUTEX_TRYLOCK, 152169689Skan PJT_MUTEX_UNLOCK, 153169689Skan PJT_ONCE, 154169689Skan PJT_RWLOCK_DESTROY, 155169689Skan PJT_RWLOCK_INIT, 156169689Skan PJT_RWLOCK_RDLOCK, 157169689Skan PJT_RWLOCK_TRYRDLOCK, 158169689Skan PJT_RWLOCK_TRYWRLOCK, 159169689Skan PJT_RWLOCK_UNLOCK, 160169689Skan PJT_RWLOCK_WRLOCK, 161169689Skan PJT_SELF, 162169689Skan PJT_SETCANCELSTATE, 163169689Skan PJT_SETCANCELTYPE, 164169689Skan PJT_SETSPECIFIC, 165169689Skan PJT_SIGMASK, 166169689Skan PJT_TESTCANCEL, 167169689Skan PJT_CLEANUP_POP_IMP, 168169689Skan PJT_CLEANUP_PUSH_IMP, 169169689Skan PJT_CANCEL_ENTER, 170169689Skan PJT_CANCEL_LEAVE, 171169689Skan PJT_MAX 172169689Skan} pjt_index_t; 173169689Skan 174169689Skantypedef int (*pthread_func_t)(void); 175169689Skantypedef pthread_func_t pthread_func_entry_t[2]; 176169689Skan 177169689Skanextern pthread_func_entry_t __thr_jtable[]; 178169689Skan 179169689Skanvoid __set_error_selector(int *(*arg)(void)); 180169689Skanint _pthread_mutex_init_calloc_cb_stub(pthread_mutex_t *mutex, 181169689Skan void *(calloc_cb)(__size_t, __size_t)); 182169689Skan 183169689Skantypedef int (*interpos_func_t)(void); 184169689Skaninterpos_func_t *__libc_interposing_slot(int interposno); 185169689Skanextern interpos_func_t __libc_interposing[] __hidden; 186169689Skan 187169689Skanenum { 188169689Skan INTERPOS_accept, 189169689Skan INTERPOS_accept4, 190169689Skan INTERPOS_aio_suspend, 191169689Skan INTERPOS_close, 192169689Skan INTERPOS_connect, 193169689Skan INTERPOS_fcntl, 194169689Skan INTERPOS_fsync, 195169689Skan INTERPOS_fork, 196169689Skan INTERPOS_msync, 197169689Skan INTERPOS_nanosleep, 198169689Skan INTERPOS_openat, 199169689Skan INTERPOS_poll, 200169689Skan INTERPOS_pselect, 201169689Skan INTERPOS_recvfrom, 202169689Skan INTERPOS_recvmsg, 203169689Skan INTERPOS_select, 204169689Skan INTERPOS_sendmsg, 205169689Skan INTERPOS_sendto, 206169689Skan INTERPOS_setcontext, 207169689Skan INTERPOS_sigaction, 208169689Skan INTERPOS_sigprocmask, 209169689Skan INTERPOS_sigsuspend, 210169689Skan INTERPOS_sigwait, 211169689Skan INTERPOS_sigtimedwait, 212169689Skan INTERPOS_sigwaitinfo, 213169689Skan INTERPOS_swapcontext, 214169689Skan INTERPOS_system, 215169689Skan INTERPOS_tcdrain, 216169689Skan INTERPOS_read, 217169689Skan INTERPOS_readv, 218169689Skan INTERPOS_wait4, 219169689Skan INTERPOS_write, 220169689Skan INTERPOS_writev, 221169689Skan INTERPOS__pthread_mutex_init_calloc_cb, 222169689Skan INTERPOS_spinlock, 223169689Skan INTERPOS_spinunlock, 224169689Skan INTERPOS_MAX 225169689Skan}; 226169689Skan 227169689Skan/* 228169689Skan * yplib internal interfaces 229169689Skan */ 230169689Skan#ifdef YP 231169689Skanint _yp_check(char **); 232169689Skan#endif 233169689Skan 234169689Skan/* 235169689Skan * Initialise TLS for static programs 236169689Skan */ 237169689Skanvoid _init_tls(void); 238169689Skan 239169689Skan/* 240169689Skan * Provides pthread_once()-like functionality for both single-threaded 241169689Skan * and multi-threaded applications. 242169689Skan */ 243169689Skanint _once(pthread_once_t *, void (*)(void)); 244169689Skan 245169689Skan/* 246169689Skan * Set the TLS thread pointer 247169689Skan */ 248169689Skanvoid _set_tp(void *tp); 249169689Skan 250169689Skan/* 251169689Skan * This is a pointer in the C run-time startup code. It is used 252169689Skan * by getprogname() and setprogname(). 253169689Skan */ 254169689Skanextern const char *__progname; 255169689Skan 256169689Skan/* 257169689Skan * This function is used by the threading libraries to notify malloc that a 258169689Skan * thread is exiting. 259169689Skan */ 260169689Skanvoid _malloc_thread_cleanup(void); 261169689Skan 262169689Skan/* 263169689Skan * These functions are used by the threading libraries in order to protect 264169689Skan * malloc across fork(). 265169689Skan */ 266169689Skanvoid _malloc_prefork(void); 267169689Skanvoid _malloc_postfork(void); 268169689Skan 269169689Skanvoid _malloc_first_thread(void); 270169689Skan 271169689Skan/* 272169689Skan * Function to clean up streams, called from abort() and exit(). 273169689Skan */ 274169689Skanvoid (*__cleanup)(void) __hidden; 275169689Skan 276169689Skan/* 277169689Skan * Get kern.osreldate to detect ABI revisions. Explicitly 278169689Skan * ignores value of $OSVERSION and caches result. Prototypes 279169689Skan * for the wrapped "new" pad-less syscalls are here for now. 280169689Skan */ 281169689Skanint __getosreldate(void); 282169689Skan#include <sys/_types.h> 283169689Skan#include <sys/_sigset.h> 284169689Skan 285169689Skan/* With pad */ 286169689Skan__off_t __sys_freebsd6_lseek(int, int, __off_t, int); 287169689Skanint __sys_freebsd6_ftruncate(int, int, __off_t); 288169689Skanint __sys_freebsd6_truncate(const char *, int, __off_t); 289169689Skan__ssize_t __sys_freebsd6_pread(int, void *, __size_t, int, __off_t); 290169689Skan__ssize_t __sys_freebsd6_pwrite(int, const void *, __size_t, int, __off_t); 291169689Skanvoid * __sys_freebsd6_mmap(void *, __size_t, int, int, int, int, __off_t); 292169689Skan 293169689Skanstruct aiocb; 294169689Skanstruct fd_set; 295169689Skanstruct iovec; 296169689Skanstruct msghdr; 297169689Skanstruct pollfd; 298169689Skanstruct rusage; 299169689Skanstruct sigaction; 300169689Skanstruct sockaddr; 301169689Skanstruct timespec; 302169689Skanstruct timeval; 303169689Skanstruct timezone; 304169689Skanstruct __siginfo; 305169689Skanstruct __ucontext; 306169689Skanint __sys_aio_suspend(const struct aiocb * const[], int, 307169689Skan const struct timespec *); 308169689Skanint __sys_accept(int, struct sockaddr *, __socklen_t *); 309169689Skanint __sys_accept4(int, struct sockaddr *, __socklen_t *, int); 310169689Skanint __sys_clock_gettime(__clockid_t, struct timespec *ts); 311169689Skanint __sys_close(int); 312169689Skanint __sys_connect(int, const struct sockaddr *, __socklen_t); 313169689Skanint __sys_fcntl(int, int, ...); 314169689Skanint __sys_fsync(int); 315169689Skan__pid_t __sys_fork(void); 316169689Skanint __sys_ftruncate(int, __off_t); 317169689Skanint __sys_gettimeofday(struct timeval *, struct timezone *); 318169689Skan__off_t __sys_lseek(int, __off_t, int); 319169689Skanvoid *__sys_mmap(void *, __size_t, int, int, int, __off_t); 320169689Skanint __sys_msync(void *, __size_t, int); 321169689Skanint __sys_nanosleep(const struct timespec *, struct timespec *); 322169689Skanint __sys_open(const char *, int, ...); 323169689Skanint __sys_openat(int, const char *, int, ...); 324169689Skanint __sys_pselect(int, struct fd_set *, struct fd_set *, 325169689Skan struct fd_set *, const struct timespec *, 326169689Skan const __sigset_t *); 327169689Skanint __sys_poll(struct pollfd *, unsigned, int); 328169689Skan__ssize_t __sys_pread(int, void *, __size_t, __off_t); 329169689Skan__ssize_t __sys_pwrite(int, const void *, __size_t, __off_t); 330169689Skan__ssize_t __sys_read(int, void *, __size_t); 331169689Skan__ssize_t __sys_readv(int, const struct iovec *, int); 332169689Skan__ssize_t __sys_recv(int, void *, __size_t, int); 333169689Skan__ssize_t __sys_recvfrom(int, void *, __size_t, int, struct sockaddr *, 334169689Skan __socklen_t *); 335169689Skan__ssize_t __sys_recvmsg(int, struct msghdr *, int); 336169689Skanint __sys_select(int, struct fd_set *, struct fd_set *, 337169689Skan struct fd_set *, struct timeval *); 338169689Skan__ssize_t __sys_sendmsg(int, const struct msghdr *, int); 339169689Skan__ssize_t __sys_sendto(int, const void *, __size_t, int, 340169689Skan const struct sockaddr *, __socklen_t); 341169689Skanint __sys_setcontext(const struct __ucontext *); 342169689Skanint __sys_sigaction(int, const struct sigaction *, 343169689Skan struct sigaction *); 344169689Skanint __sys_sigprocmask(int, const __sigset_t *, __sigset_t *); 345169689Skanint __sys_sigsuspend(const __sigset_t *); 346169689Skanint __sys_sigtimedwait(const __sigset_t *, struct __siginfo *, 347169689Skan const struct timespec *); 348169689Skanint __sys_sigwait(const __sigset_t *, int *); 349169689Skanint __sys_sigwaitinfo(const __sigset_t *, struct __siginfo *); 350169689Skanint __sys_swapcontext(struct __ucontext *, 351169689Skan const struct __ucontext *); 352169689Skanint __sys_thr_kill(long, int); 353169689Skanint __sys_thr_self(long *); 354169689Skanint __sys_truncate(const char *, __off_t); 355169689Skan__pid_t __sys_wait4(__pid_t, int *, int, struct rusage *); 356169689Skan__ssize_t __sys_write(int, const void *, __size_t); 357169689Skan__ssize_t __sys_writev(int, const struct iovec *, int); 358169689Skan 359169689Skanint __libc_sigwait(const __sigset_t * __restrict, 360169689Skan int * restrict sig); 361169689Skanint __libc_system(const char *); 362169689Skanint __libc_tcdrain(int); 363169689Skanint __fcntl_compat(int fd, int cmd, ...); 364169689Skan 365169689Skan/* execve() with PATH processing to implement posix_spawnp() */ 366169689Skanint _execvpe(const char *, char * const *, char * const *); 367169689Skan 368169689Skanint _elf_aux_info(int aux, void *buf, int buflen); 369169689Skanstruct dl_phdr_info; 370169689Skanint __elf_phdr_match_addr(struct dl_phdr_info *, void *); 371169689Skanvoid __init_elf_aux_vector(void); 372169689Skan 373169689Skanvoid _pthread_cancel_enter(int); 374169689Skanvoid _pthread_cancel_leave(int); 375169689Skan 376169689Skan#endif /* _LIBC_PRIVATE_H_ */ 377169689Skan