thr_syscalls.c revision 160662
1112918Sjeff/*
2144518Sdavidxu * Copyright (C) 2005 David Xu <davidxu@freebsd.org>.
3144518Sdavidxu * Copyright (c) 2003 Daniel Eischen <deischen@freebsd.org>.
4144518Sdavidxu * Copyright (C) 2000 Jason Evans <jasone@freebsd.org>.
5112918Sjeff * All rights reserved.
6112918Sjeff *
7112918Sjeff * Redistribution and use in source and binary forms, with or without
8112918Sjeff * modification, are permitted provided that the following conditions
9112918Sjeff * are met:
10112918Sjeff * 1. Redistributions of source code must retain the above copyright
11112918Sjeff *    notice(s), this list of conditions and the following disclaimer as
12112918Sjeff *    the first lines of this file unmodified other than the possible
13112918Sjeff *    addition of one or more copyright notices.
14112918Sjeff * 2. Redistributions in binary form must reproduce the above copyright
15112918Sjeff *    notice(s), this list of conditions and the following disclaimer in
16112918Sjeff *    the documentation and/or other materials provided with the
17112918Sjeff *    distribution.
18112918Sjeff *
19112918Sjeff * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDER(S) ``AS IS'' AND ANY
20112918Sjeff * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
21112918Sjeff * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22112918Sjeff * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) BE
23112918Sjeff * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24112918Sjeff * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25112918Sjeff * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
26112918Sjeff * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
27112918Sjeff * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
28112918Sjeff * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
29112918Sjeff * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
30112918Sjeff *
31112918Sjeff * $FreeBSD: head/lib/libthr/thread/thr_syscalls.c 160662 2006-07-25 12:50:05Z davidxu $
32112918Sjeff */
33112918Sjeff
34112918Sjeff/*
35112918Sjeff * Copyright (c) 1995-1998 John Birrell <jb@cimlogic.com.au>
36112918Sjeff * All rights reserved.
37112918Sjeff *
38112918Sjeff * Redistribution and use in source and binary forms, with or without
39112918Sjeff * modification, are permitted provided that the following conditions
40112918Sjeff * are met:
41112918Sjeff * 1. Redistributions of source code must retain the above copyright
42112918Sjeff *    notice, this list of conditions and the following disclaimer.
43112918Sjeff * 2. Redistributions in binary form must reproduce the above copyright
44112918Sjeff *    notice, this list of conditions and the following disclaimer in the
45112918Sjeff *    documentation and/or other materials provided with the distribution.
46112918Sjeff * 3. All advertising materials mentioning features or use of this software
47112918Sjeff *    must display the following acknowledgement:
48112918Sjeff *	This product includes software developed by John Birrell.
49112918Sjeff * 4. Neither the name of the author nor the names of any co-contributors
50112918Sjeff *    may be used to endorse or promote products derived from this software
51112918Sjeff *    without specific prior written permission.
52112918Sjeff *
53112918Sjeff * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
54112918Sjeff * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
55112918Sjeff * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
56112918Sjeff * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
57112918Sjeff * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
58112918Sjeff * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
59112918Sjeff * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
60112918Sjeff * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
61112918Sjeff * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
62112918Sjeff * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
63112918Sjeff * SUCH DAMAGE.
64112918Sjeff *
65112918Sjeff */
66112918Sjeff
67157457Sdavidxu#include "namespace.h"
68144518Sdavidxu#include <sys/types.h>
69112918Sjeff#include <sys/mman.h>
70112918Sjeff#include <sys/param.h>
71112918Sjeff#include <sys/select.h>
72144518Sdavidxu#include <sys/signalvar.h>
73135301Smtm#include <sys/socket.h>
74144518Sdavidxu#include <sys/stat.h>
75112918Sjeff#include <sys/time.h>
76112918Sjeff#include <sys/uio.h>
77112918Sjeff#include <sys/wait.h>
78112918Sjeff#include <aio.h>
79112918Sjeff#include <dirent.h>
80112918Sjeff#include <errno.h>
81112918Sjeff#include <fcntl.h>
82112918Sjeff#include <poll.h>
83112918Sjeff#include <signal.h>
84112918Sjeff#include <stdarg.h>
85112918Sjeff#include <stdio.h>
86112918Sjeff#include <stdlib.h>
87112918Sjeff#include <string.h>
88112918Sjeff#include <termios.h>
89112918Sjeff#include <unistd.h>
90144518Sdavidxu#include <pthread.h>
91157457Sdavidxu#include "un-namespace.h"
92112918Sjeff
93112918Sjeff#include "thr_private.h"
94112918Sjeff
95157457Sdavidxuextern int	__creat(const char *, mode_t);
96157457Sdavidxuextern int	__pselect(int, fd_set *, fd_set *, fd_set *,
97157457Sdavidxu			const struct timespec *, const sigset_t *);
98157457Sdavidxuextern unsigned	__sleep(unsigned int);
99157457Sdavidxuextern int	__system(const char *);
100157457Sdavidxuextern int	__tcdrain(int);
101157457Sdavidxuextern int	__usleep(useconds_t);
102157457Sdavidxuextern pid_t	__wait(int *);
103157457Sdavidxuextern pid_t	__waitpid(pid_t, int *, int);
104157457Sdavidxuextern int	__sys_aio_suspend(const struct aiocb * const[], int,
105157457Sdavidxu			const struct timespec *);
106157457Sdavidxuextern int	__sys_accept(int, struct sockaddr *, socklen_t *);
107157457Sdavidxuextern int	__sys_connect(int, const struct sockaddr *, socklen_t);
108157457Sdavidxuextern int	__sys_fsync(int);
109157457Sdavidxuextern int	__sys_msync(void *, size_t, int);
110157457Sdavidxuextern int	__sys_poll(struct pollfd *, unsigned, int);
111157457Sdavidxuextern ssize_t	__sys_recv(int, void *, size_t, int);
112157457Sdavidxuextern ssize_t	__sys_recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
113157457Sdavidxuextern ssize_t	__sys_recvmsg(int, struct msghdr *, int);
114157457Sdavidxuextern int	__sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
115157457Sdavidxuextern int	__sys_sendfile(int, int, off_t, size_t, struct sf_hdtr *,
116157457Sdavidxu			off_t *, int);
117157457Sdavidxuextern ssize_t	__sys_sendmsg(int, const struct msghdr *, int);
118157457Sdavidxuextern ssize_t	__sys_sendto(int, const void *,size_t, int, const struct sockaddr *, socklen_t);
119157457Sdavidxuextern ssize_t	__sys_readv(int, const struct iovec *, int);
120157457Sdavidxuextern pid_t	__sys_wait4(pid_t, int *, int, struct rusage *);
121157457Sdavidxuextern ssize_t	__sys_writev(int, const struct iovec *, int);
122115260Smtm
123157457Sdavidxuint	___creat(const char *, mode_t);
124160662Sdavidxuint	___pselect(int, fd_set *, fd_set *, fd_set *,
125160662Sdavidxu		const struct timespec *, const sigset_t *);
126160662Sdavidxuunsigned	___sleep(unsigned);
127160662Sdavidxuint	___system(const char *);
128160662Sdavidxuint	___tcdrain(int);
129160662Sdavidxuint	___usleep(useconds_t useconds);
130160662Sdavidxupid_t	___wait(int *);
131160662Sdavidxupid_t	___waitpid(pid_t, int *, int);
132157457Sdavidxuint	__accept(int, struct sockaddr *, socklen_t *);
133160662Sdavidxuint	__aio_suspend(const struct aiocb * const iocbs[], int,
134160662Sdavidxu		const struct timespec *);
135157457Sdavidxuint	__close(int);
136157457Sdavidxuint	__connect(int, const struct sockaddr *, socklen_t);
137157457Sdavidxuint	__fcntl(int, int,...);
138157457Sdavidxuint	__fsync(int);
139157457Sdavidxuint	__msync(void *, size_t, int);
140157457Sdavidxuint	__nanosleep(const struct timespec *, struct timespec *);
141157457Sdavidxuint	__open(const char *, int,...);
142157457Sdavidxuint	__poll(struct pollfd *, unsigned int, int);
143157457Sdavidxussize_t	__read(int, void *buf, size_t);
144157457Sdavidxussize_t	__readv(int, const struct iovec *, int);
145157457Sdavidxussize_t	__recvfrom(int, void *, size_t, int f, struct sockaddr *, socklen_t *);
146157457Sdavidxussize_t	__recvmsg(int, struct msghdr *, int);
147157457Sdavidxuint	__select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
148157457Sdavidxussize_t	__sendmsg(int, const struct msghdr *, int);
149157457Sdavidxussize_t	__sendto(int, const void *, size_t, int,
150157457Sdavidxu		const struct sockaddr *, socklen_t);
151160662Sdavidxupid_t	__wait3(int *, int, struct rusage *);
152157457Sdavidxupid_t	__wait4(pid_t, int *, int, struct rusage *);
153157457Sdavidxussize_t	__write(int, const void *, size_t);
154157457Sdavidxussize_t	__writev(int, const struct iovec *, int);
155157457Sdavidxuint	_vfork(void);
156157457Sdavidxu
157144518Sdavidxu__weak_reference(__accept, accept);
158157457Sdavidxu
159135301Smtmint
160144518Sdavidxu__accept(int s, struct sockaddr *addr, socklen_t *addrlen)
161135301Smtm{
162144518Sdavidxu	struct pthread *curthread;
163144518Sdavidxu	int oldcancel;
164135301Smtm	int ret;
165135301Smtm
166144518Sdavidxu	curthread = _get_curthread();
167144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
168135301Smtm	ret = __sys_accept(s, addr, addrlen);
169144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
170144518Sdavidxu
171144518Sdavidxu 	return (ret);
172135301Smtm}
173135301Smtm
174160662Sdavidxu__weak_reference(__aio_suspend, aio_suspend);
175112918Sjeff
176112918Sjeffint
177160662Sdavidxu__aio_suspend(const struct aiocb * const iocbs[], int niocb, const struct
178112918Sjeff    timespec *timeout)
179112918Sjeff{
180144518Sdavidxu	struct pthread *curthread = _get_curthread();
181144518Sdavidxu	int oldcancel;
182144518Sdavidxu	int ret;
183112918Sjeff
184144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
185112918Sjeff	ret = __sys_aio_suspend(iocbs, niocb, timeout);
186144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
187112918Sjeff
188144518Sdavidxu	return (ret);
189112918Sjeff}
190112918Sjeff
191144518Sdavidxu__weak_reference(__close, close);
192112918Sjeff
193112918Sjeffint
194144518Sdavidxu__close(int fd)
195112918Sjeff{
196144518Sdavidxu	struct pthread	*curthread = _get_curthread();
197144518Sdavidxu	int	oldcancel;
198112918Sjeff	int	ret;
199112918Sjeff
200144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
201112918Sjeff	ret = __sys_close(fd);
202144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
203112918Sjeff
204144518Sdavidxu	return (ret);
205112918Sjeff}
206135301Smtm
207144518Sdavidxu__weak_reference(__connect, connect);
208135301Smtm
209135301Smtmint
210144518Sdavidxu__connect(int fd, const struct sockaddr *name, socklen_t namelen)
211135301Smtm{
212144518Sdavidxu	struct pthread *curthread = _get_curthread();
213144518Sdavidxu	int oldcancel;
214135301Smtm	int ret;
215135301Smtm
216144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
217144518Sdavidxu	ret = __sys_connect(fd, name, namelen);
218144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
219144518Sdavidxu
220144518Sdavidxu 	return (ret);
221135301Smtm}
222112918Sjeff
223144518Sdavidxu__weak_reference(___creat, creat);
224144518Sdavidxu
225112918Sjeffint
226144518Sdavidxu___creat(const char *path, mode_t mode)
227112918Sjeff{
228144518Sdavidxu	struct pthread *curthread = _get_curthread();
229144518Sdavidxu	int oldcancel;
230144518Sdavidxu	int ret;
231112918Sjeff
232144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
233112918Sjeff	ret = __creat(path, mode);
234144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
235112918Sjeff
236112918Sjeff	return ret;
237112918Sjeff}
238112918Sjeff
239144518Sdavidxu__weak_reference(__fcntl, fcntl);
240112918Sjeff
241112918Sjeffint
242144518Sdavidxu__fcntl(int fd, int cmd,...)
243112918Sjeff{
244144518Sdavidxu	struct pthread *curthread = _get_curthread();
245144518Sdavidxu	int	oldcancel;
246112918Sjeff	int	ret;
247112918Sjeff	va_list	ap;
248112918Sjeff
249144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
250112918Sjeff
251112918Sjeff	va_start(ap, cmd);
252112918Sjeff	switch (cmd) {
253144518Sdavidxu	case F_DUPFD:
254144518Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, int));
255144518Sdavidxu		break;
256144518Sdavidxu	case F_SETFD:
257144518Sdavidxu	case F_SETFL:
258144518Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, int));
259144518Sdavidxu		break;
260144518Sdavidxu	case F_GETFD:
261144518Sdavidxu	case F_GETFL:
262144518Sdavidxu		ret = __sys_fcntl(fd, cmd);
263144518Sdavidxu		break;
264144518Sdavidxu	default:
265144518Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, void *));
266112918Sjeff	}
267112918Sjeff	va_end(ap);
268112918Sjeff
269144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
270112918Sjeff
271144518Sdavidxu	return (ret);
272112918Sjeff}
273112918Sjeff
274144518Sdavidxu__weak_reference(__fsync, fsync);
275131181Smtm
276131181Smtmint
277144518Sdavidxu__fsync(int fd)
278131181Smtm{
279144518Sdavidxu	struct pthread *curthread = _get_curthread();
280144518Sdavidxu	int	oldcancel;
281131181Smtm	int	ret;
282131181Smtm
283144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
284112918Sjeff	ret = __sys_fsync(fd);
285144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
286112918Sjeff
287144518Sdavidxu	return (ret);
288112918Sjeff}
289112918Sjeff
290144518Sdavidxu__weak_reference(__msync, msync);
291135301Smtm
292135301Smtmint
293144518Sdavidxu__msync(void *addr, size_t len, int flags)
294135301Smtm{
295144518Sdavidxu	struct pthread *curthread = _get_curthread();
296144518Sdavidxu	int	oldcancel;
297112918Sjeff	int	ret;
298112918Sjeff
299144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
300112918Sjeff	ret = __sys_msync(addr, len, flags);
301144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
302112918Sjeff
303112918Sjeff	return ret;
304112918Sjeff}
305112918Sjeff
306144518Sdavidxu__weak_reference(__nanosleep, nanosleep);
307112918Sjeff
308112918Sjeffint
309144518Sdavidxu__nanosleep(const struct timespec *time_to_sleep,
310144518Sdavidxu    struct timespec *time_remaining)
311112918Sjeff{
312144518Sdavidxu	struct pthread *curthread = _get_curthread();
313144518Sdavidxu	int		oldcancel;
314144518Sdavidxu	int		ret;
315112918Sjeff
316144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
317112918Sjeff	ret = __sys_nanosleep(time_to_sleep, time_remaining);
318144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
319112918Sjeff
320144518Sdavidxu	return (ret);
321112918Sjeff}
322112918Sjeff
323144518Sdavidxu__weak_reference(__open, open);
324112918Sjeff
325112918Sjeffint
326144518Sdavidxu__open(const char *path, int flags,...)
327112918Sjeff{
328144518Sdavidxu	struct pthread *curthread = _get_curthread();
329144518Sdavidxu	int	oldcancel;
330112918Sjeff	int	ret;
331112918Sjeff	int	mode = 0;
332112918Sjeff	va_list	ap;
333112918Sjeff
334144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
335112918Sjeff
336112918Sjeff	/* Check if the file is being created: */
337112918Sjeff	if (flags & O_CREAT) {
338112918Sjeff		/* Get the creation mode: */
339112918Sjeff		va_start(ap, flags);
340112918Sjeff		mode = va_arg(ap, int);
341112918Sjeff		va_end(ap);
342112918Sjeff	}
343112918Sjeff
344112918Sjeff	ret = __sys_open(path, flags, mode);
345112918Sjeff
346144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
347144518Sdavidxu
348112918Sjeff	return ret;
349112918Sjeff}
350112918Sjeff
351144518Sdavidxu__weak_reference(__poll, poll);
352112918Sjeff
353112918Sjeffint
354144518Sdavidxu__poll(struct pollfd *fds, unsigned int nfds, int timeout)
355112918Sjeff{
356144518Sdavidxu	struct pthread *curthread = _get_curthread();
357144518Sdavidxu	int oldcancel;
358112918Sjeff	int ret;
359112918Sjeff
360144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
361112918Sjeff	ret = __sys_poll(fds, nfds, timeout);
362144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
363112918Sjeff
364112918Sjeff	return ret;
365112918Sjeff}
366112918Sjeff
367160662Sdavidxu__weak_reference(___pselect, pselect);
368135301Smtm
369112918Sjeffint
370160662Sdavidxu___pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds,
371112918Sjeff	const struct timespec *timo, const sigset_t *mask)
372112918Sjeff{
373144518Sdavidxu	struct pthread *curthread = _get_curthread();
374144518Sdavidxu	int oldcancel;
375112918Sjeff	int ret;
376112918Sjeff
377144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
378112918Sjeff	ret = __pselect(count, rfds, wfds, efds, timo, mask);
379144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
380112918Sjeff
381112918Sjeff	return (ret);
382112918Sjeff}
383112918Sjeff
384144518Sdavidxu__weak_reference(__read, read);
385112918Sjeff
386112918Sjeffssize_t
387144518Sdavidxu__read(int fd, void *buf, size_t nbytes)
388112918Sjeff{
389144518Sdavidxu	struct pthread *curthread = _get_curthread();
390144518Sdavidxu	int oldcancel;
391112918Sjeff	ssize_t	ret;
392112918Sjeff
393144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
394112918Sjeff	ret = __sys_read(fd, buf, nbytes);
395144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
396112918Sjeff
397112918Sjeff	return ret;
398112918Sjeff}
399112918Sjeff
400144518Sdavidxu__weak_reference(__readv, readv);
401112918Sjeff
402112918Sjeffssize_t
403144518Sdavidxu__readv(int fd, const struct iovec *iov, int iovcnt)
404112918Sjeff{
405144518Sdavidxu	struct pthread *curthread = _get_curthread();
406144518Sdavidxu	int oldcancel;
407112918Sjeff	ssize_t ret;
408112918Sjeff
409144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
410112918Sjeff	ret = __sys_readv(fd, iov, iovcnt);
411144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
412112918Sjeff
413112918Sjeff	return ret;
414112918Sjeff}
415112918Sjeff
416144518Sdavidxu__weak_reference(__recvfrom, recvfrom);
417135301Smtm
418135301Smtmssize_t
419144518Sdavidxu__recvfrom(int s, void *b, size_t l, int f, struct sockaddr *from,
420135301Smtm    socklen_t *fl)
421135301Smtm{
422144518Sdavidxu	struct pthread *curthread = _get_curthread();
423144518Sdavidxu	int oldcancel;
424135301Smtm	ssize_t ret;
425135301Smtm
426144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
427135301Smtm	ret = __sys_recvfrom(s, b, l, f, from, fl);
428144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
429135301Smtm	return (ret);
430135301Smtm}
431135301Smtm
432144518Sdavidxu__weak_reference(__recvmsg, recvmsg);
433135301Smtm
434135301Smtmssize_t
435144518Sdavidxu__recvmsg(int s, struct msghdr *m, int f)
436135301Smtm{
437144518Sdavidxu	struct pthread *curthread = _get_curthread();
438135301Smtm	ssize_t ret;
439144518Sdavidxu	int oldcancel;
440135301Smtm
441144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
442135301Smtm	ret = __sys_recvmsg(s, m, f);
443144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
444135301Smtm	return (ret);
445135301Smtm}
446135301Smtm
447144518Sdavidxu__weak_reference(__select, select);
448112918Sjeff
449112918Sjeffint
450144518Sdavidxu__select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
451112918Sjeff	struct timeval *timeout)
452112918Sjeff{
453144518Sdavidxu	struct pthread *curthread = _get_curthread();
454144518Sdavidxu	int oldcancel;
455112918Sjeff	int ret;
456112918Sjeff
457144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
458112918Sjeff	ret = __sys_select(numfds, readfds, writefds, exceptfds, timeout);
459144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
460112918Sjeff	return ret;
461112918Sjeff}
462112918Sjeff
463144518Sdavidxu__weak_reference(__sendmsg, sendmsg);
464135301Smtm
465135301Smtmssize_t
466144518Sdavidxu__sendmsg(int s, const struct msghdr *m, int f)
467135301Smtm{
468144518Sdavidxu	struct pthread *curthread = _get_curthread();
469135301Smtm	ssize_t ret;
470144518Sdavidxu	int oldcancel;
471135301Smtm
472144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
473135301Smtm	ret = __sys_sendmsg(s, m, f);
474144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
475135301Smtm	return (ret);
476135301Smtm}
477135301Smtm
478144518Sdavidxu__weak_reference(__sendto, sendto);
479135301Smtm
480135301Smtmssize_t
481144518Sdavidxu__sendto(int s, const void *m, size_t l, int f, const struct sockaddr *t,
482135301Smtm    socklen_t tl)
483135301Smtm{
484144518Sdavidxu	struct pthread *curthread = _get_curthread();
485135301Smtm	ssize_t ret;
486144518Sdavidxu	int oldcancel;
487135301Smtm
488144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
489135301Smtm	ret = __sys_sendto(s, m, l, f, t, tl);
490144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
491135301Smtm	return (ret);
492135301Smtm}
493135301Smtm
494160662Sdavidxu__weak_reference(___sleep, sleep);
495148658Sdeischen
496112918Sjeffunsigned int
497160662Sdavidxu___sleep(unsigned int seconds)
498112918Sjeff{
499144518Sdavidxu	struct pthread *curthread = _get_curthread();
500144518Sdavidxu	int		oldcancel;
501112918Sjeff	unsigned int	ret;
502112918Sjeff
503144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
504112918Sjeff	ret = __sleep(seconds);
505144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
506112918Sjeff
507144518Sdavidxu	return (ret);
508112918Sjeff}
509112918Sjeff
510160662Sdavidxu__weak_reference(___system, system);
511112918Sjeff
512112918Sjeffint
513160662Sdavidxu___system(const char *string)
514112918Sjeff{
515144518Sdavidxu	struct pthread *curthread = _get_curthread();
516144518Sdavidxu	int	oldcancel;
517112918Sjeff	int	ret;
518112918Sjeff
519144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
520112918Sjeff	ret = __system(string);
521144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
522112918Sjeff
523112918Sjeff	return ret;
524112918Sjeff}
525112918Sjeff
526160662Sdavidxu__weak_reference(___tcdrain, tcdrain);
527112918Sjeff
528112918Sjeffint
529160662Sdavidxu___tcdrain(int fd)
530112918Sjeff{
531144518Sdavidxu	struct pthread *curthread = _get_curthread();
532144518Sdavidxu	int	oldcancel;
533112918Sjeff	int	ret;
534112918Sjeff
535144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
536112918Sjeff	ret = __tcdrain(fd);
537144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
538112918Sjeff
539144518Sdavidxu	return (ret);
540112918Sjeff}
541112918Sjeff
542160662Sdavidxu__weak_reference(___usleep, usleep);
543148658Sdeischen
544148658Sdeischenint
545160662Sdavidxu___usleep(useconds_t useconds)
546148658Sdeischen{
547148658Sdeischen	struct pthread *curthread = _get_curthread();
548148658Sdeischen	int		oldcancel;
549148658Sdeischen	int		ret;
550148658Sdeischen
551148658Sdeischen	oldcancel = _thr_cancel_enter(curthread);
552148658Sdeischen	ret = __usleep(useconds);
553148658Sdeischen	_thr_cancel_leave(curthread, oldcancel);
554148658Sdeischen
555148658Sdeischen	return (ret);
556148658Sdeischen}
557148658Sdeischen
558144518Sdavidxu__weak_reference(_vfork, vfork);
559135301Smtm
560135301Smtmint
561144518Sdavidxu_vfork(void)
562135301Smtm{
563144518Sdavidxu	return (fork());
564135301Smtm}
565135301Smtm
566160662Sdavidxu__weak_reference(___wait, wait);
567112918Sjeff
568112918Sjeffpid_t
569160662Sdavidxu___wait(int *istat)
570112918Sjeff{
571144518Sdavidxu	struct pthread *curthread = _get_curthread();
572144518Sdavidxu	int	oldcancel;
573112918Sjeff	pid_t	ret;
574112918Sjeff
575144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
576112918Sjeff	ret = __wait(istat);
577144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
578112918Sjeff
579112918Sjeff	return ret;
580112918Sjeff}
581112918Sjeff
582160662Sdavidxu__weak_reference(__wait3, wait3);
583160662Sdavidxu
584160662Sdavidxupid_t
585160662Sdavidxu__wait3(int *status, int options, struct rusage *rusage)
586160662Sdavidxu{
587160662Sdavidxu	struct pthread *curthread = _get_curthread();
588160662Sdavidxu	int oldcancel;
589160662Sdavidxu	pid_t ret;
590160662Sdavidxu
591160662Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
592160662Sdavidxu	ret = _wait4(WAIT_ANY, status, options, rusage);
593160662Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
594160662Sdavidxu
595160662Sdavidxu	return (ret);
596160662Sdavidxu}
597160662Sdavidxu
598144518Sdavidxu__weak_reference(__wait4, wait4);
599112918Sjeff
600112918Sjeffpid_t
601160662Sdavidxu__wait4(pid_t pid, int *status, int options, struct rusage *rusage)
602112918Sjeff{
603144518Sdavidxu	struct pthread *curthread = _get_curthread();
604144518Sdavidxu	int oldcancel;
605112918Sjeff	pid_t ret;
606112918Sjeff
607144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
608160662Sdavidxu	ret = __sys_wait4(pid, status, options, rusage);
609144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
610112918Sjeff
611112918Sjeff	return ret;
612112918Sjeff}
613112918Sjeff
614160662Sdavidxu__weak_reference(___waitpid, waitpid);
615112918Sjeff
616112918Sjeffpid_t
617160662Sdavidxu___waitpid(pid_t wpid, int *status, int options)
618112918Sjeff{
619144518Sdavidxu	struct pthread *curthread = _get_curthread();
620144518Sdavidxu	int	oldcancel;
621112918Sjeff	pid_t	ret;
622112918Sjeff
623144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
624112918Sjeff	ret = __waitpid(wpid, status, options);
625144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
626112918Sjeff
627112918Sjeff	return ret;
628112918Sjeff}
629112918Sjeff
630144518Sdavidxu__weak_reference(__write, write);
631112918Sjeff
632112918Sjeffssize_t
633144518Sdavidxu__write(int fd, const void *buf, size_t nbytes)
634112918Sjeff{
635144518Sdavidxu	struct pthread *curthread = _get_curthread();
636144518Sdavidxu	int	oldcancel;
637112918Sjeff	ssize_t	ret;
638112918Sjeff
639144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
640112918Sjeff	ret = __sys_write(fd, buf, nbytes);
641144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
642112918Sjeff
643112918Sjeff	return ret;
644112918Sjeff}
645112918Sjeff
646144518Sdavidxu__weak_reference(__writev, writev);
647112918Sjeff
648112918Sjeffssize_t
649144518Sdavidxu__writev(int fd, const struct iovec *iov, int iovcnt)
650112918Sjeff{
651144518Sdavidxu	struct pthread *curthread = _get_curthread();
652144518Sdavidxu	int	oldcancel;
653112918Sjeff	ssize_t ret;
654112918Sjeff
655144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
656112918Sjeff	ret = __sys_writev(fd, iov, iovcnt);
657144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
658112918Sjeff
659112918Sjeff	return ret;
660112918Sjeff}
661