135124Sjb/*
235124Sjb * Copyright (c) 1998 John Birrell <jb@cimlogic.com.au>.
335124Sjb * All rights reserved.
435124Sjb *
535124Sjb * Redistribution and use in source and binary forms, with or without
635124Sjb * modification, are permitted provided that the following conditions
735124Sjb * are met:
835124Sjb * 1. Redistributions of source code must retain the above copyright
935124Sjb *    notice, this list of conditions and the following disclaimer.
1035124Sjb * 2. Redistributions in binary form must reproduce the above copyright
1135124Sjb *    notice, this list of conditions and the following disclaimer in the
1235124Sjb *    documentation and/or other materials provided with the distribution.
13165968Simp * 3. Neither the name of the author nor the names of any co-contributors
1435124Sjb *    may be used to endorse or promote products derived from this software
1535124Sjb *    without specific prior written permission.
1635124Sjb *
1735124Sjb * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
1835124Sjb * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
1935124Sjb * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2035124Sjb * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2135124Sjb * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2235124Sjb * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
2335124Sjb * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
2435124Sjb * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
2535124Sjb * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
2635124Sjb * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
2735124Sjb * SUCH DAMAGE.
2835124Sjb *
2950476Speter * $FreeBSD: releng/10.2/lib/libc/include/libc_private.h 287872 2015-09-16 20:59:41Z delphij $
3035124Sjb *
3135124Sjb * Private definitions for libc, libc_r and libpthread.
3235124Sjb *
3335124Sjb */
3435124Sjb
3535124Sjb#ifndef _LIBC_PRIVATE_H_
3635124Sjb#define _LIBC_PRIVATE_H_
37237434Skib#include <sys/_types.h>
38199606Sjhb#include <sys/_pthreadtypes.h>
3935124Sjb
4035124Sjb/*
4135124Sjb * This global flag is non-zero when a process has created one
4235124Sjb * or more threads. It is used to avoid calling locking functions
4335124Sjb * when they are not required.
4435124Sjb */
4535124Sjbextern int	__isthreaded;
4635124Sjb
4735124Sjb/*
48231868Skib * Elf_Auxinfo *__elf_aux_vector, the pointer to the ELF aux vector
49231868Skib * provided by kernel. Either set for us by rtld, or found at runtime
50231868Skib * on stack for static binaries.
51231868Skib *
52231868Skib * Type is void to avoid polluting whole libc with ELF types.
53231868Skib */
54231868Skibextern void	*__elf_aux_vector;
55231868Skib
56231868Skib/*
57228843Scperciva * libc should use libc_dlopen internally, which respects a global
58228843Scperciva * flag where loading of new shared objects can be restricted.
59228843Scperciva */
60228843Scpercivavoid *libc_dlopen(const char *, int);
61228843Scperciva
62228843Scperciva/*
63228843Scperciva * For dynamic linker.
64228843Scperciva */
65228843Scpercivavoid _rtld_error(const char *fmt, ...);
66228843Scperciva
67228843Scperciva/*
6835124Sjb * File lock contention is difficult to diagnose without knowing
6935124Sjb * where locks were set. Allow a debug library to be built which
7035124Sjb * records the source file and line number of each lock call.
7135124Sjb */
7235124Sjb#ifdef	_FLOCK_DEBUG
7335124Sjb#define _FLOCKFILE(x)	_flockfile_debug(x, __FILE__, __LINE__)
7435124Sjb#else
7571579Sdeischen#define _FLOCKFILE(x)	_flockfile(x)
7635124Sjb#endif
7735124Sjb
7835124Sjb/*
7935124Sjb * Macros for locking and unlocking FILEs. These test if the
8035124Sjb * process is threaded to avoid locking when not required.
8135124Sjb */
8235124Sjb#define	FLOCKFILE(fp)		if (__isthreaded) _FLOCKFILE(fp)
8371579Sdeischen#define	FUNLOCKFILE(fp)		if (__isthreaded) _funlockfile(fp)
8435124Sjb
85234657Skibstruct _spinlock;
86254706Sjillesextern struct _spinlock __stdio_thread_lock __hidden;
87234657Skib#define STDIO_THREAD_LOCK()				\
88234657Skibdo {							\
89234657Skib	if (__isthreaded)				\
90234657Skib		_SPINLOCK(&__stdio_thread_lock);	\
91234657Skib} while (0)
92234657Skib#define STDIO_THREAD_UNLOCK()				\
93234657Skibdo {							\
94234657Skib	if (__isthreaded)				\
95234657Skib		_SPINUNLOCK(&__stdio_thread_lock);	\
96234657Skib} while (0)
97234657Skib
98278875Skibvoid		__libc_spinlock_stub(struct _spinlock *);
99278875Skibvoid		__libc_spinunlock_stub(struct _spinlock *);
100278875Skib
10193399Smarkm/*
102106866Sdeischen * Indexes into the pthread jump table.
103106866Sdeischen *
104106866Sdeischen * Warning! If you change this type, you must also change the threads
105106866Sdeischen * libraries that reference it (libc_r, libpthread).
106106866Sdeischen */
107106866Sdeischentypedef enum {
108156319Sdeischen	PJT_ATFORK,
109156319Sdeischen	PJT_ATTR_DESTROY,
110156319Sdeischen	PJT_ATTR_GETDETACHSTATE,
111156319Sdeischen	PJT_ATTR_GETGUARDSIZE,
112156319Sdeischen	PJT_ATTR_GETINHERITSCHED,
113156319Sdeischen	PJT_ATTR_GETSCHEDPARAM,
114156319Sdeischen	PJT_ATTR_GETSCHEDPOLICY,
115156319Sdeischen	PJT_ATTR_GETSCOPE,
116156319Sdeischen	PJT_ATTR_GETSTACKADDR,
117156319Sdeischen	PJT_ATTR_GETSTACKSIZE,
118156319Sdeischen	PJT_ATTR_INIT,
119156319Sdeischen	PJT_ATTR_SETDETACHSTATE,
120156319Sdeischen	PJT_ATTR_SETGUARDSIZE,
121156319Sdeischen	PJT_ATTR_SETINHERITSCHED,
122156319Sdeischen	PJT_ATTR_SETSCHEDPARAM,
123156319Sdeischen	PJT_ATTR_SETSCHEDPOLICY,
124156319Sdeischen	PJT_ATTR_SETSCOPE,
125156319Sdeischen	PJT_ATTR_SETSTACKADDR,
126156319Sdeischen	PJT_ATTR_SETSTACKSIZE,
127156319Sdeischen	PJT_CANCEL,
128156319Sdeischen	PJT_CLEANUP_POP,
129156319Sdeischen	PJT_CLEANUP_PUSH,
130106866Sdeischen	PJT_COND_BROADCAST,
131106866Sdeischen	PJT_COND_DESTROY,
132106866Sdeischen	PJT_COND_INIT,
133106866Sdeischen	PJT_COND_SIGNAL,
134156319Sdeischen	PJT_COND_TIMEDWAIT,
135106866Sdeischen	PJT_COND_WAIT,
136156319Sdeischen	PJT_DETACH,
137156319Sdeischen	PJT_EQUAL,
138156319Sdeischen	PJT_EXIT,
139106866Sdeischen	PJT_GETSPECIFIC,
140156319Sdeischen	PJT_JOIN,
141106866Sdeischen	PJT_KEY_CREATE,
142106866Sdeischen	PJT_KEY_DELETE,
143156319Sdeischen	PJT_KILL,
144106866Sdeischen	PJT_MAIN_NP,
145156319Sdeischen	PJT_MUTEXATTR_DESTROY,
146156319Sdeischen	PJT_MUTEXATTR_INIT,
147156319Sdeischen	PJT_MUTEXATTR_SETTYPE,
148106866Sdeischen	PJT_MUTEX_DESTROY,
149106866Sdeischen	PJT_MUTEX_INIT,
150106866Sdeischen	PJT_MUTEX_LOCK,
151106866Sdeischen	PJT_MUTEX_TRYLOCK,
152106866Sdeischen	PJT_MUTEX_UNLOCK,
153106866Sdeischen	PJT_ONCE,
154106866Sdeischen	PJT_RWLOCK_DESTROY,
155106866Sdeischen	PJT_RWLOCK_INIT,
156106866Sdeischen	PJT_RWLOCK_RDLOCK,
157106866Sdeischen	PJT_RWLOCK_TRYRDLOCK,
158106866Sdeischen	PJT_RWLOCK_TRYWRLOCK,
159106866Sdeischen	PJT_RWLOCK_UNLOCK,
160106866Sdeischen	PJT_RWLOCK_WRLOCK,
161106866Sdeischen	PJT_SELF,
162156319Sdeischen	PJT_SETCANCELSTATE,
163156319Sdeischen	PJT_SETCANCELTYPE,
164106866Sdeischen	PJT_SETSPECIFIC,
165106866Sdeischen	PJT_SIGMASK,
166156319Sdeischen	PJT_TESTCANCEL,
167201546Sdavidxu	PJT_CLEANUP_POP_IMP,
168201546Sdavidxu	PJT_CLEANUP_PUSH_IMP,
169213153Sdavidxu	PJT_CANCEL_ENTER,
170213153Sdavidxu	PJT_CANCEL_LEAVE,
171106866Sdeischen	PJT_MAX
172106866Sdeischen} pjt_index_t;
173106866Sdeischen
174106870Sdeischentypedef int (*pthread_func_t)(void);
175106880Sdeischentypedef pthread_func_t pthread_func_entry_t[2];
176106866Sdeischen
177106880Sdeischenextern pthread_func_entry_t __thr_jtable[];
178106866Sdeischen
179277317Skibvoid	__set_error_selector(int *(*arg)(void));
180277317Skibint	_pthread_mutex_init_calloc_cb_stub(pthread_mutex_t *mutex,
181277317Skib	    void *(calloc_cb)(__size_t, __size_t));
182277317Skib
183277317Skibtypedef int (*interpos_func_t)(void);
184277317Skibinterpos_func_t *__libc_interposing_slot(int interposno);
185277317Skibextern interpos_func_t __libc_interposing[] __hidden;
186277317Skib
187277317Skibenum {
188277317Skib	INTERPOS_accept,
189277317Skib	INTERPOS_accept4,
190277317Skib	INTERPOS_aio_suspend,
191277317Skib	INTERPOS_close,
192277317Skib	INTERPOS_connect,
193277317Skib	INTERPOS_fcntl,
194277317Skib	INTERPOS_fsync,
195277317Skib	INTERPOS_fork,
196277317Skib	INTERPOS_msync,
197277317Skib	INTERPOS_nanosleep,
198277317Skib	INTERPOS_openat,
199277317Skib	INTERPOS_poll,
200277317Skib	INTERPOS_pselect,
201277317Skib	INTERPOS_recvfrom,
202277317Skib	INTERPOS_recvmsg,
203277317Skib	INTERPOS_select,
204277317Skib	INTERPOS_sendmsg,
205277317Skib	INTERPOS_sendto,
206277317Skib	INTERPOS_setcontext,
207277317Skib	INTERPOS_sigaction,
208277317Skib	INTERPOS_sigprocmask,
209277317Skib	INTERPOS_sigsuspend,
210277317Skib	INTERPOS_sigwait,
211277317Skib	INTERPOS_sigtimedwait,
212277317Skib	INTERPOS_sigwaitinfo,
213277317Skib	INTERPOS_swapcontext,
214277317Skib	INTERPOS_system,
215277317Skib	INTERPOS_tcdrain,
216277317Skib	INTERPOS_read,
217277317Skib	INTERPOS_readv,
218277317Skib	INTERPOS_wait4,
219277317Skib	INTERPOS_write,
220277317Skib	INTERPOS_writev,
221277317Skib	INTERPOS__pthread_mutex_init_calloc_cb,
222278875Skib	INTERPOS_spinlock,
223278875Skib	INTERPOS_spinunlock,
224281454Skib	INTERPOS_kevent,
225281981Skib	INTERPOS_wait6,
226281981Skib	INTERPOS_ppoll,
227277317Skib	INTERPOS_MAX
228277317Skib};
229277317Skib
230106866Sdeischen/*
231111618Snectar * yplib internal interfaces
232111618Snectar */
233111618Snectar#ifdef YP
234111618Snectarint _yp_check(char **);
235111618Snectar#endif
236111618Snectar
237133754Sdfr/*
238133754Sdfr * Initialise TLS for static programs
239133754Sdfr */
240133754Sdfrvoid _init_tls(void);
241111618Snectar
242111618Snectar/*
243199606Sjhb * Provides pthread_once()-like functionality for both single-threaded
244199606Sjhb * and multi-threaded applications.
245199606Sjhb */
246199606Sjhbint _once(pthread_once_t *, void (*)(void));
247199606Sjhb
248199606Sjhb/*
249133754Sdfr * Set the TLS thread pointer
250133754Sdfr */
251133754Sdfrvoid _set_tp(void *tp);
252133754Sdfr
253133754Sdfr/*
25493399Smarkm * This is a pointer in the C run-time startup code. It is used
25593399Smarkm * by getprogname() and setprogname().
25693399Smarkm */
25793399Smarkmextern const char *__progname;
25893399Smarkm
259122069Sdeischen/*
260182225Sjasone * This function is used by the threading libraries to notify malloc that a
261182225Sjasone * thread is exiting.
262182225Sjasone */
263182225Sjasonevoid _malloc_thread_cleanup(void);
264182225Sjasone
265182225Sjasone/*
266154248Sjasone * These functions are used by the threading libraries in order to protect
267154248Sjasone * malloc across fork().
268122069Sdeischen */
269154248Sjasonevoid _malloc_prefork(void);
270154248Sjasonevoid _malloc_postfork(void);
271122069Sdeischen
272277317Skibvoid _malloc_first_thread(void);
273277317Skib
274150040Sstefanf/*
275150040Sstefanf * Function to clean up streams, called from abort() and exit().
276150040Sstefanf */
277279049Skibextern void (*__cleanup)(void) __hidden;
278150040Sstefanf
279171219Speter/*
280171219Speter * Get kern.osreldate to detect ABI revisions.  Explicitly
281171219Speter * ignores value of $OSVERSION and caches result.  Prototypes
282171219Speter * for the wrapped "new" pad-less syscalls are here for now.
283171219Speter */
284277317Skibint __getosreldate(void);
285171219Speter#include <sys/_types.h>
286277317Skib#include <sys/_sigset.h>
287171219Speter
288171219Speter/* With pad */
289277317Skib__off_t	__sys_freebsd6_lseek(int, int, __off_t, int);
290277317Skibint	__sys_freebsd6_ftruncate(int, int, __off_t);
291277317Skibint	__sys_freebsd6_truncate(const char *, int, __off_t);
292277317Skib__ssize_t __sys_freebsd6_pread(int, void *, __size_t, int, __off_t);
293277317Skib__ssize_t __sys_freebsd6_pwrite(int, const void *, __size_t, int, __off_t);
294277317Skibvoid *	__sys_freebsd6_mmap(void *, __size_t, int, int, int, int, __off_t);
295171219Speter
296277317Skibstruct aiocb;
297277317Skibstruct fd_set;
298277317Skibstruct iovec;
299281454Skibstruct kevent;
300277317Skibstruct msghdr;
301277317Skibstruct pollfd;
302277317Skibstruct rusage;
303277317Skibstruct sigaction;
304277317Skibstruct sockaddr;
305237434Skibstruct timespec;
306237434Skibstruct timeval;
307237434Skibstruct timezone;
308277317Skibstruct __siginfo;
309277317Skibstruct __ucontext;
310281981Skibstruct __wrusage;
311281981Skibenum idtype;
312277317Skibint		__sys_aio_suspend(const struct aiocb * const[], int,
313277317Skib		    const struct timespec *);
314277317Skibint		__sys_accept(int, struct sockaddr *, __socklen_t *);
315277317Skibint		__sys_accept4(int, struct sockaddr *, __socklen_t *, int);
316277317Skibint		__sys_clock_gettime(__clockid_t, struct timespec *ts);
317277317Skibint		__sys_close(int);
318277317Skibint		__sys_connect(int, const struct sockaddr *, __socklen_t);
319277317Skibint		__sys_fcntl(int, int, ...);
320277317Skibint		__sys_fsync(int);
321277317Skib__pid_t		__sys_fork(void);
322277317Skibint		__sys_ftruncate(int, __off_t);
323277317Skibint		__sys_gettimeofday(struct timeval *, struct timezone *);
324281454Skibint		__sys_kevent(int, const struct kevent *, int, struct kevent *,
325281454Skib		    int, const struct timespec *);
326277317Skib__off_t		__sys_lseek(int, __off_t, int);
327277317Skibvoid	       *__sys_mmap(void *, __size_t, int, int, int, __off_t);
328277317Skibint		__sys_msync(void *, __size_t, int);
329277317Skibint		__sys_nanosleep(const struct timespec *, struct timespec *);
330277317Skibint		__sys_open(const char *, int, ...);
331277317Skibint		__sys_openat(int, const char *, int, ...);
332277317Skibint		__sys_pselect(int, struct fd_set *, struct fd_set *,
333277317Skib		    struct fd_set *, const struct timespec *,
334277317Skib		    const __sigset_t *);
335277317Skibint		__sys_poll(struct pollfd *, unsigned, int);
336281981Skibint		__sys_ppoll(struct pollfd *, unsigned, const struct timespec *,
337281981Skib		    const __sigset_t *);
338277317Skib__ssize_t	__sys_pread(int, void *, __size_t, __off_t);
339277317Skib__ssize_t	__sys_pwrite(int, const void *, __size_t, __off_t);
340277317Skib__ssize_t	__sys_read(int, void *, __size_t);
341277317Skib__ssize_t	__sys_readv(int, const struct iovec *, int);
342277317Skib__ssize_t	__sys_recv(int, void *, __size_t, int);
343277317Skib__ssize_t	__sys_recvfrom(int, void *, __size_t, int, struct sockaddr *,
344277317Skib		    __socklen_t *);
345277317Skib__ssize_t	__sys_recvmsg(int, struct msghdr *, int);
346277317Skibint		__sys_select(int, struct fd_set *, struct fd_set *,
347277317Skib		    struct fd_set *, struct timeval *);
348277317Skib__ssize_t	__sys_sendmsg(int, const struct msghdr *, int);
349277317Skib__ssize_t	__sys_sendto(int, const void *, __size_t, int,
350277317Skib		    const struct sockaddr *, __socklen_t);
351277317Skibint		__sys_setcontext(const struct __ucontext *);
352277317Skibint		__sys_sigaction(int, const struct sigaction *,
353277317Skib		    struct sigaction *);
354277317Skibint		__sys_sigprocmask(int, const __sigset_t *, __sigset_t *);
355277317Skibint		__sys_sigsuspend(const __sigset_t *);
356277317Skibint		__sys_sigtimedwait(const __sigset_t *, struct __siginfo *,
357277317Skib		    const struct timespec *);
358277317Skibint		__sys_sigwait(const __sigset_t *, int *);
359277317Skibint		__sys_sigwaitinfo(const __sigset_t *, struct __siginfo *);
360277317Skibint		__sys_swapcontext(struct __ucontext *,
361277317Skib		    const struct __ucontext *);
362277317Skibint		__sys_thr_kill(long, int);
363277317Skibint		__sys_thr_self(long *);
364277317Skibint		__sys_truncate(const char *, __off_t);
365277317Skib__pid_t		__sys_wait4(__pid_t, int *, int, struct rusage *);
366281981Skib__pid_t		__sys_wait6(enum idtype, __id_t, int *, int,
367281981Skib		    struct __wrusage *, struct __siginfo *);
368277317Skib__ssize_t	__sys_write(int, const void *, __size_t);
369277317Skib__ssize_t	__sys_writev(int, const struct iovec *, int);
370237434Skib
371287872Sdelphijint		__libc_sigaction(int, const struct sigaction *,
372287872Sdelphij		    struct sigaction *) __hidden;
373287872Sdelphijint		__libc_sigprocmask(int, const __sigset_t *, __sigset_t *)
374287872Sdelphij		    __hidden;
375287872Sdelphijint		__libc_sigsuspend(const __sigset_t *) __hidden;
376277317Skibint		__libc_sigwait(const __sigset_t * __restrict,
377277317Skib		    int * restrict sig);
378277317Skibint		__libc_system(const char *);
379277317Skibint		__libc_tcdrain(int);
380277317Skibint		__fcntl_compat(int fd, int cmd, ...);
381277317Skib
382179947Sed/* execve() with PATH processing to implement posix_spawnp() */
383179947Sedint _execvpe(const char *, char * const *, char * const *);
384179947Sed
385211416Skibint _elf_aux_info(int aux, void *buf, int buflen);
386211706Skibstruct dl_phdr_info;
387211706Skibint __elf_phdr_match_addr(struct dl_phdr_info *, void *);
388231868Skibvoid __init_elf_aux_vector(void);
389211416Skib
390213153Sdavidxuvoid	_pthread_cancel_enter(int);
391213153Sdavidxuvoid	_pthread_cancel_leave(int);
392213153Sdavidxu
39335124Sjb#endif /* _LIBC_PRIVATE_H_ */
394