thr_syscalls.c revision 157457
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 157457 2006-04-04 02:57:49Z 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	__pause(void);
97157457Sdavidxuextern int	__pselect(int, fd_set *, fd_set *, fd_set *,
98157457Sdavidxu			const struct timespec *, const sigset_t *);
99157457Sdavidxuextern unsigned	__sleep(unsigned int);
100157457Sdavidxuextern int	__system(const char *);
101157457Sdavidxuextern int	__tcdrain(int);
102157457Sdavidxuextern int	__usleep(useconds_t);
103157457Sdavidxuextern pid_t	__wait(int *);
104157457Sdavidxuextern pid_t	__waitpid(pid_t, int *, int);
105157457Sdavidxuextern int	__sys_aio_suspend(const struct aiocb * const[], int,
106157457Sdavidxu			const struct timespec *);
107157457Sdavidxuextern int	__sys_accept(int, struct sockaddr *, socklen_t *);
108157457Sdavidxuextern int	__sys_connect(int, const struct sockaddr *, socklen_t);
109157457Sdavidxuextern int	__sys_fsync(int);
110157457Sdavidxuextern int	__sys_msync(void *, size_t, int);
111157457Sdavidxuextern int	__sys_poll(struct pollfd *, unsigned, int);
112157457Sdavidxuextern ssize_t	__sys_recv(int, void *, size_t, int);
113157457Sdavidxuextern ssize_t	__sys_recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
114157457Sdavidxuextern ssize_t	__sys_recvmsg(int, struct msghdr *, int);
115157457Sdavidxuextern int	__sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
116157457Sdavidxuextern int	__sys_sendfile(int, int, off_t, size_t, struct sf_hdtr *,
117157457Sdavidxu			off_t *, int);
118157457Sdavidxuextern ssize_t	__sys_sendmsg(int, const struct msghdr *, int);
119157457Sdavidxuextern ssize_t	__sys_sendto(int, const void *,size_t, int, const struct sockaddr *, socklen_t);
120157457Sdavidxuextern ssize_t	__sys_readv(int, const struct iovec *, int);
121157457Sdavidxuextern pid_t	__sys_wait4(pid_t, int *, int, struct rusage *);
122157457Sdavidxuextern ssize_t	__sys_writev(int, const struct iovec *, int);
123115260Smtm
124157457Sdavidxuint	___creat(const char *, mode_t);
125157457Sdavidxuint	__accept(int, struct sockaddr *, socklen_t *);
126157457Sdavidxuint	__close(int);
127157457Sdavidxuint	__connect(int, const struct sockaddr *, socklen_t);
128157457Sdavidxuint	__fcntl(int, int,...);
129157457Sdavidxuint	__fsync(int);
130157457Sdavidxuint	__msync(void *, size_t, int);
131157457Sdavidxuint	__nanosleep(const struct timespec *, struct timespec *);
132157457Sdavidxuint	__open(const char *, int,...);
133157457Sdavidxuint	__poll(struct pollfd *, unsigned int, int);
134157457Sdavidxussize_t	__read(int, void *buf, size_t);
135157457Sdavidxussize_t	__readv(int, const struct iovec *, int);
136157457Sdavidxussize_t	__recvfrom(int, void *, size_t, int f, struct sockaddr *, socklen_t *);
137157457Sdavidxussize_t	__recvmsg(int, struct msghdr *, int);
138157457Sdavidxuint	__select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
139157457Sdavidxussize_t	__sendmsg(int, const struct msghdr *, int);
140157457Sdavidxussize_t	__sendto(int, const void *, size_t, int,
141157457Sdavidxu		const struct sockaddr *, socklen_t);
142157457Sdavidxupid_t	__wait4(pid_t, int *, int, struct rusage *);
143157457Sdavidxussize_t	__write(int, const void *, size_t);
144157457Sdavidxussize_t	__writev(int, const struct iovec *, int);
145157457Sdavidxuint	_aio_suspend(const struct aiocb * const iocbs[], int,
146157457Sdavidxu		const struct timespec *);
147157457Sdavidxuint	_pause(void);
148157457Sdavidxuint	_pselect(int, fd_set *, fd_set *, fd_set *,
149157457Sdavidxu		const struct timespec *, const sigset_t *);
150157457Sdavidxuint	_raise(int);
151157457Sdavidxuunsigned	_sleep(unsigned);
152157457Sdavidxuint	_system(const char *);
153157457Sdavidxuint	_tcdrain(int);
154157457Sdavidxuint	_vfork(void);
155157457Sdavidxupid_t	_wait(int *);
156157457Sdavidxu
157157457Sdavidxu
158144518Sdavidxu__weak_reference(__accept, accept);
159157457Sdavidxu
160135301Smtmint
161144518Sdavidxu__accept(int s, struct sockaddr *addr, socklen_t *addrlen)
162135301Smtm{
163144518Sdavidxu	struct pthread *curthread;
164144518Sdavidxu	int oldcancel;
165135301Smtm	int ret;
166135301Smtm
167144518Sdavidxu	curthread = _get_curthread();
168144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
169135301Smtm	ret = __sys_accept(s, addr, addrlen);
170144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
171144518Sdavidxu
172144518Sdavidxu 	return (ret);
173135301Smtm}
174135301Smtm
175112918Sjeff__weak_reference(_aio_suspend, aio_suspend);
176112918Sjeff
177112918Sjeffint
178112918Sjeff_aio_suspend(const struct aiocb * const iocbs[], int niocb, const struct
179112918Sjeff    timespec *timeout)
180112918Sjeff{
181144518Sdavidxu	struct pthread *curthread = _get_curthread();
182144518Sdavidxu	int oldcancel;
183144518Sdavidxu	int ret;
184112918Sjeff
185144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
186112918Sjeff	ret = __sys_aio_suspend(iocbs, niocb, timeout);
187144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
188112918Sjeff
189144518Sdavidxu	return (ret);
190112918Sjeff}
191112918Sjeff
192144518Sdavidxu__weak_reference(__close, close);
193112918Sjeff
194112918Sjeffint
195144518Sdavidxu__close(int fd)
196112918Sjeff{
197144518Sdavidxu	struct pthread	*curthread = _get_curthread();
198144518Sdavidxu	int	oldcancel;
199112918Sjeff	int	ret;
200112918Sjeff
201144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
202112918Sjeff	ret = __sys_close(fd);
203144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
204112918Sjeff
205144518Sdavidxu	return (ret);
206112918Sjeff}
207135301Smtm
208144518Sdavidxu__weak_reference(__connect, connect);
209135301Smtm
210135301Smtmint
211144518Sdavidxu__connect(int fd, const struct sockaddr *name, socklen_t namelen)
212135301Smtm{
213144518Sdavidxu	struct pthread *curthread = _get_curthread();
214144518Sdavidxu	int oldcancel;
215135301Smtm	int ret;
216135301Smtm
217144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
218144518Sdavidxu	ret = __sys_connect(fd, name, namelen);
219144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
220144518Sdavidxu
221144518Sdavidxu 	return (ret);
222135301Smtm}
223112918Sjeff
224144518Sdavidxu__weak_reference(___creat, creat);
225144518Sdavidxu
226112918Sjeffint
227144518Sdavidxu___creat(const char *path, mode_t mode)
228112918Sjeff{
229144518Sdavidxu	struct pthread *curthread = _get_curthread();
230144518Sdavidxu	int oldcancel;
231144518Sdavidxu	int ret;
232112918Sjeff
233144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
234112918Sjeff	ret = __creat(path, mode);
235144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
236112918Sjeff
237112918Sjeff	return ret;
238112918Sjeff}
239112918Sjeff
240144518Sdavidxu__weak_reference(__fcntl, fcntl);
241112918Sjeff
242112918Sjeffint
243144518Sdavidxu__fcntl(int fd, int cmd,...)
244112918Sjeff{
245144518Sdavidxu	struct pthread *curthread = _get_curthread();
246144518Sdavidxu	int	oldcancel;
247112918Sjeff	int	ret;
248112918Sjeff	va_list	ap;
249112918Sjeff
250144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
251112918Sjeff
252112918Sjeff	va_start(ap, cmd);
253112918Sjeff	switch (cmd) {
254144518Sdavidxu	case F_DUPFD:
255144518Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, int));
256144518Sdavidxu		break;
257144518Sdavidxu	case F_SETFD:
258144518Sdavidxu	case F_SETFL:
259144518Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, int));
260144518Sdavidxu		break;
261144518Sdavidxu	case F_GETFD:
262144518Sdavidxu	case F_GETFL:
263144518Sdavidxu		ret = __sys_fcntl(fd, cmd);
264144518Sdavidxu		break;
265144518Sdavidxu	default:
266144518Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, void *));
267112918Sjeff	}
268112918Sjeff	va_end(ap);
269112918Sjeff
270144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
271112918Sjeff
272144518Sdavidxu	return (ret);
273112918Sjeff}
274112918Sjeff
275144518Sdavidxu__weak_reference(__fsync, fsync);
276131181Smtm
277131181Smtmint
278144518Sdavidxu__fsync(int fd)
279131181Smtm{
280144518Sdavidxu	struct pthread *curthread = _get_curthread();
281144518Sdavidxu	int	oldcancel;
282131181Smtm	int	ret;
283131181Smtm
284144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
285112918Sjeff	ret = __sys_fsync(fd);
286144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
287112918Sjeff
288144518Sdavidxu	return (ret);
289112918Sjeff}
290112918Sjeff
291144518Sdavidxu__weak_reference(__msync, msync);
292135301Smtm
293135301Smtmint
294144518Sdavidxu__msync(void *addr, size_t len, int flags)
295135301Smtm{
296144518Sdavidxu	struct pthread *curthread = _get_curthread();
297144518Sdavidxu	int	oldcancel;
298112918Sjeff	int	ret;
299112918Sjeff
300144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
301112918Sjeff	ret = __sys_msync(addr, len, flags);
302144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
303112918Sjeff
304112918Sjeff	return ret;
305112918Sjeff}
306112918Sjeff
307144518Sdavidxu__weak_reference(__nanosleep, nanosleep);
308112918Sjeff
309112918Sjeffint
310144518Sdavidxu__nanosleep(const struct timespec *time_to_sleep,
311144518Sdavidxu    struct timespec *time_remaining)
312112918Sjeff{
313144518Sdavidxu	struct pthread *curthread = _get_curthread();
314144518Sdavidxu	int		oldcancel;
315144518Sdavidxu	int		ret;
316112918Sjeff
317144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
318112918Sjeff	ret = __sys_nanosleep(time_to_sleep, time_remaining);
319144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
320112918Sjeff
321144518Sdavidxu	return (ret);
322112918Sjeff}
323112918Sjeff
324144518Sdavidxu__weak_reference(__open, open);
325112918Sjeff
326112918Sjeffint
327144518Sdavidxu__open(const char *path, int flags,...)
328112918Sjeff{
329144518Sdavidxu	struct pthread *curthread = _get_curthread();
330144518Sdavidxu	int	oldcancel;
331112918Sjeff	int	ret;
332112918Sjeff	int	mode = 0;
333112918Sjeff	va_list	ap;
334112918Sjeff
335144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
336112918Sjeff
337112918Sjeff	/* Check if the file is being created: */
338112918Sjeff	if (flags & O_CREAT) {
339112918Sjeff		/* Get the creation mode: */
340112918Sjeff		va_start(ap, flags);
341112918Sjeff		mode = va_arg(ap, int);
342112918Sjeff		va_end(ap);
343112918Sjeff	}
344112918Sjeff
345112918Sjeff	ret = __sys_open(path, flags, mode);
346112918Sjeff
347144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
348144518Sdavidxu
349112918Sjeff	return ret;
350112918Sjeff}
351112918Sjeff
352135301Smtm__weak_reference(_pause, pause);
353135301Smtm
354135301Smtmint
355135301Smtm_pause(void)
356135301Smtm{
357144518Sdavidxu	struct pthread *curthread = _get_curthread();
358144518Sdavidxu	int	oldcancel;
359144518Sdavidxu	int	ret;
360144518Sdavidxu
361144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
362144518Sdavidxu	ret = __pause();
363144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
364144518Sdavidxu
365144518Sdavidxu	return ret;
366135301Smtm}
367135301Smtm
368144518Sdavidxu__weak_reference(__poll, poll);
369112918Sjeff
370112918Sjeffint
371144518Sdavidxu__poll(struct pollfd *fds, unsigned int nfds, int timeout)
372112918Sjeff{
373144518Sdavidxu	struct pthread *curthread = _get_curthread();
374144518Sdavidxu	int oldcancel;
375112918Sjeff	int ret;
376112918Sjeff
377144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
378112918Sjeff	ret = __sys_poll(fds, nfds, timeout);
379144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
380112918Sjeff
381112918Sjeff	return ret;
382112918Sjeff}
383112918Sjeff
384144518Sdavidxu__weak_reference(_pselect, pselect);
385135301Smtm
386112918Sjeffint
387144518Sdavidxu_pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds,
388112918Sjeff	const struct timespec *timo, const sigset_t *mask)
389112918Sjeff{
390144518Sdavidxu	struct pthread *curthread = _get_curthread();
391144518Sdavidxu	int oldcancel;
392112918Sjeff	int ret;
393112918Sjeff
394144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
395112918Sjeff	ret = __pselect(count, rfds, wfds, efds, timo, mask);
396144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
397112918Sjeff
398112918Sjeff	return (ret);
399112918Sjeff}
400112918Sjeff
401127486Smtm__weak_reference(_raise, raise);
402127486Smtm
403127486Smtmint
404127486Smtm_raise(int sig)
405127486Smtm{
406144518Sdavidxu	int ret;
407127486Smtm
408144518Sdavidxu	if (!_thr_isthreaded())
409144518Sdavidxu		ret = kill(getpid(), sig);
410151968Sdavidxu	else
411151968Sdavidxu		ret = _thr_send_sig(_get_curthread(), sig);
412144518Sdavidxu	return (ret);
413127486Smtm}
414127486Smtm
415144518Sdavidxu__weak_reference(__read, read);
416112918Sjeff
417112918Sjeffssize_t
418144518Sdavidxu__read(int fd, void *buf, size_t nbytes)
419112918Sjeff{
420144518Sdavidxu	struct pthread *curthread = _get_curthread();
421144518Sdavidxu	int oldcancel;
422112918Sjeff	ssize_t	ret;
423112918Sjeff
424144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
425112918Sjeff	ret = __sys_read(fd, buf, nbytes);
426144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
427112918Sjeff
428112918Sjeff	return ret;
429112918Sjeff}
430112918Sjeff
431144518Sdavidxu__weak_reference(__readv, readv);
432112918Sjeff
433112918Sjeffssize_t
434144518Sdavidxu__readv(int fd, const struct iovec *iov, int iovcnt)
435112918Sjeff{
436144518Sdavidxu	struct pthread *curthread = _get_curthread();
437144518Sdavidxu	int oldcancel;
438112918Sjeff	ssize_t ret;
439112918Sjeff
440144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
441112918Sjeff	ret = __sys_readv(fd, iov, iovcnt);
442144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
443112918Sjeff
444112918Sjeff	return ret;
445112918Sjeff}
446112918Sjeff
447144518Sdavidxu__weak_reference(__recvfrom, recvfrom);
448135301Smtm
449135301Smtmssize_t
450144518Sdavidxu__recvfrom(int s, void *b, size_t l, int f, struct sockaddr *from,
451135301Smtm    socklen_t *fl)
452135301Smtm{
453144518Sdavidxu	struct pthread *curthread = _get_curthread();
454144518Sdavidxu	int oldcancel;
455135301Smtm	ssize_t ret;
456135301Smtm
457144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
458135301Smtm	ret = __sys_recvfrom(s, b, l, f, from, fl);
459144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
460135301Smtm	return (ret);
461135301Smtm}
462135301Smtm
463144518Sdavidxu__weak_reference(__recvmsg, recvmsg);
464135301Smtm
465135301Smtmssize_t
466144518Sdavidxu__recvmsg(int s, 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_recvmsg(s, m, f);
474144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
475135301Smtm	return (ret);
476135301Smtm}
477135301Smtm
478144518Sdavidxu__weak_reference(__select, select);
479112918Sjeff
480112918Sjeffint
481144518Sdavidxu__select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
482112918Sjeff	struct timeval *timeout)
483112918Sjeff{
484144518Sdavidxu	struct pthread *curthread = _get_curthread();
485144518Sdavidxu	int oldcancel;
486112918Sjeff	int ret;
487112918Sjeff
488144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
489112918Sjeff	ret = __sys_select(numfds, readfds, writefds, exceptfds, timeout);
490144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
491112918Sjeff	return ret;
492112918Sjeff}
493112918Sjeff
494144518Sdavidxu__weak_reference(__sendmsg, sendmsg);
495135301Smtm
496135301Smtmssize_t
497144518Sdavidxu__sendmsg(int s, const struct msghdr *m, int f)
498135301Smtm{
499144518Sdavidxu	struct pthread *curthread = _get_curthread();
500135301Smtm	ssize_t ret;
501144518Sdavidxu	int oldcancel;
502135301Smtm
503144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
504135301Smtm	ret = __sys_sendmsg(s, m, f);
505144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
506135301Smtm	return (ret);
507135301Smtm}
508135301Smtm
509144518Sdavidxu__weak_reference(__sendto, sendto);
510135301Smtm
511135301Smtmssize_t
512144518Sdavidxu__sendto(int s, const void *m, size_t l, int f, const struct sockaddr *t,
513135301Smtm    socklen_t tl)
514135301Smtm{
515144518Sdavidxu	struct pthread *curthread = _get_curthread();
516135301Smtm	ssize_t ret;
517144518Sdavidxu	int oldcancel;
518135301Smtm
519144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
520135301Smtm	ret = __sys_sendto(s, m, l, f, t, tl);
521144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
522135301Smtm	return (ret);
523135301Smtm}
524135301Smtm
525148658Sdeischen__weak_reference(_sleep, sleep);
526148658Sdeischen
527112918Sjeffunsigned int
528112918Sjeff_sleep(unsigned int seconds)
529112918Sjeff{
530144518Sdavidxu	struct pthread *curthread = _get_curthread();
531144518Sdavidxu	int		oldcancel;
532112918Sjeff	unsigned int	ret;
533112918Sjeff
534144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
535112918Sjeff	ret = __sleep(seconds);
536144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
537112918Sjeff
538144518Sdavidxu	return (ret);
539112918Sjeff}
540112918Sjeff
541112918Sjeff__weak_reference(_system, system);
542112918Sjeff
543112918Sjeffint
544112918Sjeff_system(const char *string)
545112918Sjeff{
546144518Sdavidxu	struct pthread *curthread = _get_curthread();
547144518Sdavidxu	int	oldcancel;
548112918Sjeff	int	ret;
549112918Sjeff
550144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
551112918Sjeff	ret = __system(string);
552144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
553112918Sjeff
554112918Sjeff	return ret;
555112918Sjeff}
556112918Sjeff
557112918Sjeff__weak_reference(_tcdrain, tcdrain);
558112918Sjeff
559112918Sjeffint
560112918Sjeff_tcdrain(int fd)
561112918Sjeff{
562144518Sdavidxu	struct pthread *curthread = _get_curthread();
563144518Sdavidxu	int	oldcancel;
564112918Sjeff	int	ret;
565112918Sjeff
566144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
567112918Sjeff	ret = __tcdrain(fd);
568144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
569112918Sjeff
570144518Sdavidxu	return (ret);
571112918Sjeff}
572112918Sjeff
573148658Sdeischen__weak_reference(_usleep, usleep);
574148658Sdeischen
575148658Sdeischenint
576148658Sdeischen_usleep(useconds_t useconds)
577148658Sdeischen{
578148658Sdeischen	struct pthread *curthread = _get_curthread();
579148658Sdeischen	int		oldcancel;
580148658Sdeischen	int		ret;
581148658Sdeischen
582148658Sdeischen	oldcancel = _thr_cancel_enter(curthread);
583148658Sdeischen	ret = __usleep(useconds);
584148658Sdeischen	_thr_cancel_leave(curthread, oldcancel);
585148658Sdeischen
586148658Sdeischen	return (ret);
587148658Sdeischen}
588148658Sdeischen
589144518Sdavidxu__weak_reference(_vfork, vfork);
590135301Smtm
591135301Smtmint
592144518Sdavidxu_vfork(void)
593135301Smtm{
594144518Sdavidxu	return (fork());
595135301Smtm}
596135301Smtm
597112918Sjeff__weak_reference(_wait, wait);
598112918Sjeff
599112918Sjeffpid_t
600112918Sjeff_wait(int *istat)
601112918Sjeff{
602144518Sdavidxu	struct pthread *curthread = _get_curthread();
603144518Sdavidxu	int	oldcancel;
604112918Sjeff	pid_t	ret;
605112918Sjeff
606144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
607112918Sjeff	ret = __wait(istat);
608144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
609112918Sjeff
610112918Sjeff	return ret;
611112918Sjeff}
612112918Sjeff
613144518Sdavidxu__weak_reference(__wait4, wait4);
614112918Sjeff
615112918Sjeffpid_t
616144518Sdavidxu__wait4(pid_t pid, int *istat, int options, struct rusage *rusage)
617112918Sjeff{
618144518Sdavidxu	struct pthread *curthread = _get_curthread();
619144518Sdavidxu	int oldcancel;
620112918Sjeff	pid_t ret;
621112918Sjeff
622144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
623123347Smtm	ret = __sys_wait4(pid, istat, options, rusage);
624144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
625112918Sjeff
626112918Sjeff	return ret;
627112918Sjeff}
628112918Sjeff
629112918Sjeff__weak_reference(_waitpid, waitpid);
630112918Sjeff
631112918Sjeffpid_t
632112918Sjeff_waitpid(pid_t wpid, int *status, int options)
633112918Sjeff{
634144518Sdavidxu	struct pthread *curthread = _get_curthread();
635144518Sdavidxu	int	oldcancel;
636112918Sjeff	pid_t	ret;
637112918Sjeff
638144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
639112918Sjeff	ret = __waitpid(wpid, status, options);
640144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
641112918Sjeff
642112918Sjeff	return ret;
643112918Sjeff}
644112918Sjeff
645144518Sdavidxu__weak_reference(__write, write);
646112918Sjeff
647112918Sjeffssize_t
648144518Sdavidxu__write(int fd, const void *buf, size_t nbytes)
649112918Sjeff{
650144518Sdavidxu	struct pthread *curthread = _get_curthread();
651144518Sdavidxu	int	oldcancel;
652112918Sjeff	ssize_t	ret;
653112918Sjeff
654144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
655112918Sjeff	ret = __sys_write(fd, buf, nbytes);
656144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
657112918Sjeff
658112918Sjeff	return ret;
659112918Sjeff}
660112918Sjeff
661144518Sdavidxu__weak_reference(__writev, writev);
662112918Sjeff
663112918Sjeffssize_t
664144518Sdavidxu__writev(int fd, const struct iovec *iov, int iovcnt)
665112918Sjeff{
666144518Sdavidxu	struct pthread *curthread = _get_curthread();
667144518Sdavidxu	int	oldcancel;
668112918Sjeff	ssize_t ret;
669112918Sjeff
670144518Sdavidxu	oldcancel = _thr_cancel_enter(curthread);
671112918Sjeff	ret = __sys_writev(fd, iov, iovcnt);
672144518Sdavidxu	_thr_cancel_leave(curthread, oldcancel);
673112918Sjeff
674112918Sjeff	return ret;
675112918Sjeff}
676