thr_syscalls.c revision 189549
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 189549 2009-03-09 02:34:02Z 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.
46165967Simp * 3. Neither the name of the author nor the names of any co-contributors
47112918Sjeff *    may be used to endorse or promote products derived from this software
48112918Sjeff *    without specific prior written permission.
49112918Sjeff *
50112918Sjeff * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND
51112918Sjeff * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
52112918Sjeff * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
53112918Sjeff * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
54112918Sjeff * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
55112918Sjeff * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
56112918Sjeff * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
57112918Sjeff * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
58112918Sjeff * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
59112918Sjeff * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
60112918Sjeff * SUCH DAMAGE.
61112918Sjeff *
62112918Sjeff */
63112918Sjeff
64157457Sdavidxu#include "namespace.h"
65144518Sdavidxu#include <sys/types.h>
66112918Sjeff#include <sys/mman.h>
67112918Sjeff#include <sys/param.h>
68112918Sjeff#include <sys/select.h>
69144518Sdavidxu#include <sys/signalvar.h>
70135301Smtm#include <sys/socket.h>
71144518Sdavidxu#include <sys/stat.h>
72112918Sjeff#include <sys/time.h>
73112918Sjeff#include <sys/uio.h>
74112918Sjeff#include <sys/wait.h>
75112918Sjeff#include <aio.h>
76112918Sjeff#include <dirent.h>
77112918Sjeff#include <errno.h>
78112918Sjeff#include <fcntl.h>
79112918Sjeff#include <poll.h>
80112918Sjeff#include <signal.h>
81112918Sjeff#include <stdarg.h>
82112918Sjeff#include <stdio.h>
83112918Sjeff#include <stdlib.h>
84112918Sjeff#include <string.h>
85112918Sjeff#include <termios.h>
86112918Sjeff#include <unistd.h>
87144518Sdavidxu#include <pthread.h>
88157457Sdavidxu#include "un-namespace.h"
89112918Sjeff
90112918Sjeff#include "thr_private.h"
91112918Sjeff
92157457Sdavidxuextern int	__creat(const char *, mode_t);
93157457Sdavidxuextern int	__pselect(int, fd_set *, fd_set *, fd_set *,
94157457Sdavidxu			const struct timespec *, const sigset_t *);
95157457Sdavidxuextern unsigned	__sleep(unsigned int);
96157457Sdavidxuextern int	__system(const char *);
97157457Sdavidxuextern int	__tcdrain(int);
98157457Sdavidxuextern int	__usleep(useconds_t);
99157457Sdavidxuextern pid_t	__wait(int *);
100157457Sdavidxuextern pid_t	__waitpid(pid_t, int *, int);
101157457Sdavidxuextern int	__sys_aio_suspend(const struct aiocb * const[], int,
102157457Sdavidxu			const struct timespec *);
103157457Sdavidxuextern int	__sys_accept(int, struct sockaddr *, socklen_t *);
104157457Sdavidxuextern int	__sys_connect(int, const struct sockaddr *, socklen_t);
105157457Sdavidxuextern int	__sys_fsync(int);
106157457Sdavidxuextern int	__sys_msync(void *, size_t, int);
107157457Sdavidxuextern int	__sys_poll(struct pollfd *, unsigned, int);
108157457Sdavidxuextern ssize_t	__sys_recv(int, void *, size_t, int);
109157457Sdavidxuextern ssize_t	__sys_recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
110157457Sdavidxuextern ssize_t	__sys_recvmsg(int, struct msghdr *, int);
111157457Sdavidxuextern int	__sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
112157457Sdavidxuextern int	__sys_sendfile(int, int, off_t, size_t, struct sf_hdtr *,
113157457Sdavidxu			off_t *, int);
114157457Sdavidxuextern ssize_t	__sys_sendmsg(int, const struct msghdr *, int);
115157457Sdavidxuextern ssize_t	__sys_sendto(int, const void *,size_t, int, const struct sockaddr *, socklen_t);
116157457Sdavidxuextern ssize_t	__sys_readv(int, const struct iovec *, int);
117157457Sdavidxuextern pid_t	__sys_wait4(pid_t, int *, int, struct rusage *);
118157457Sdavidxuextern ssize_t	__sys_writev(int, const struct iovec *, int);
119115260Smtm
120157457Sdavidxuint	___creat(const char *, mode_t);
121160662Sdavidxuint	___pselect(int, fd_set *, fd_set *, fd_set *,
122160662Sdavidxu		const struct timespec *, const sigset_t *);
123160662Sdavidxuunsigned	___sleep(unsigned);
124160662Sdavidxuint	___system(const char *);
125160662Sdavidxuint	___tcdrain(int);
126160662Sdavidxuint	___usleep(useconds_t useconds);
127160662Sdavidxupid_t	___wait(int *);
128160662Sdavidxupid_t	___waitpid(pid_t, int *, int);
129157457Sdavidxuint	__accept(int, struct sockaddr *, socklen_t *);
130160662Sdavidxuint	__aio_suspend(const struct aiocb * const iocbs[], int,
131160662Sdavidxu		const struct timespec *);
132157457Sdavidxuint	__close(int);
133157457Sdavidxuint	__connect(int, const struct sockaddr *, socklen_t);
134157457Sdavidxuint	__fcntl(int, int,...);
135189549Sdavidxu#ifdef SYSCALL_COMPAT
136179434Sdfrextern int __fcntl_compat(int, int,...);
137189549Sdavidxu#endif
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);
155157457Sdavidxu
156144518Sdavidxu__weak_reference(__accept, accept);
157157457Sdavidxu
158135301Smtmint
159144518Sdavidxu__accept(int s, struct sockaddr *addr, socklen_t *addrlen)
160135301Smtm{
161144518Sdavidxu	struct pthread *curthread;
162135301Smtm	int ret;
163135301Smtm
164144518Sdavidxu	curthread = _get_curthread();
165164583Sdavidxu	_thr_cancel_enter(curthread);
166135301Smtm	ret = __sys_accept(s, addr, addrlen);
167164583Sdavidxu	_thr_cancel_leave(curthread);
168144518Sdavidxu
169144518Sdavidxu 	return (ret);
170135301Smtm}
171135301Smtm
172160662Sdavidxu__weak_reference(__aio_suspend, aio_suspend);
173112918Sjeff
174112918Sjeffint
175160662Sdavidxu__aio_suspend(const struct aiocb * const iocbs[], int niocb, const struct
176112918Sjeff    timespec *timeout)
177112918Sjeff{
178144518Sdavidxu	struct pthread *curthread = _get_curthread();
179144518Sdavidxu	int ret;
180112918Sjeff
181164583Sdavidxu	_thr_cancel_enter(curthread);
182112918Sjeff	ret = __sys_aio_suspend(iocbs, niocb, timeout);
183164583Sdavidxu	_thr_cancel_leave(curthread);
184112918Sjeff
185144518Sdavidxu	return (ret);
186112918Sjeff}
187112918Sjeff
188144518Sdavidxu__weak_reference(__close, close);
189112918Sjeff
190112918Sjeffint
191144518Sdavidxu__close(int fd)
192112918Sjeff{
193144518Sdavidxu	struct pthread	*curthread = _get_curthread();
194112918Sjeff	int	ret;
195112918Sjeff
196164583Sdavidxu	_thr_cancel_enter(curthread);
197112918Sjeff	ret = __sys_close(fd);
198164583Sdavidxu	_thr_cancel_leave(curthread);
199112918Sjeff
200144518Sdavidxu	return (ret);
201112918Sjeff}
202135301Smtm
203144518Sdavidxu__weak_reference(__connect, connect);
204135301Smtm
205135301Smtmint
206144518Sdavidxu__connect(int fd, const struct sockaddr *name, socklen_t namelen)
207135301Smtm{
208144518Sdavidxu	struct pthread *curthread = _get_curthread();
209135301Smtm	int ret;
210135301Smtm
211164583Sdavidxu	_thr_cancel_enter(curthread);
212144518Sdavidxu	ret = __sys_connect(fd, name, namelen);
213164583Sdavidxu	_thr_cancel_leave(curthread);
214144518Sdavidxu
215144518Sdavidxu 	return (ret);
216135301Smtm}
217112918Sjeff
218144518Sdavidxu__weak_reference(___creat, creat);
219144518Sdavidxu
220112918Sjeffint
221144518Sdavidxu___creat(const char *path, mode_t mode)
222112918Sjeff{
223144518Sdavidxu	struct pthread *curthread = _get_curthread();
224144518Sdavidxu	int ret;
225112918Sjeff
226164583Sdavidxu	_thr_cancel_enter(curthread);
227112918Sjeff	ret = __creat(path, mode);
228164583Sdavidxu	_thr_cancel_leave(curthread);
229112918Sjeff
230112918Sjeff	return ret;
231112918Sjeff}
232112918Sjeff
233144518Sdavidxu__weak_reference(__fcntl, fcntl);
234112918Sjeff
235112918Sjeffint
236144518Sdavidxu__fcntl(int fd, int cmd,...)
237112918Sjeff{
238144518Sdavidxu	struct pthread *curthread = _get_curthread();
239112918Sjeff	int	ret;
240112918Sjeff	va_list	ap;
241112918Sjeff
242164583Sdavidxu	_thr_cancel_enter(curthread);
243112918Sjeff
244112918Sjeff	va_start(ap, cmd);
245112918Sjeff	switch (cmd) {
246144518Sdavidxu	case F_DUPFD:
247144518Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, int));
248144518Sdavidxu		break;
249144518Sdavidxu	case F_SETFD:
250144518Sdavidxu	case F_SETFL:
251144518Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, int));
252144518Sdavidxu		break;
253144518Sdavidxu	case F_GETFD:
254144518Sdavidxu	case F_GETFL:
255144518Sdavidxu		ret = __sys_fcntl(fd, cmd);
256144518Sdavidxu		break;
257144518Sdavidxu	default:
258189549Sdavidxu#ifdef SYSCALL_COMPAT
259179434Sdfr		ret = __fcntl_compat(fd, cmd, va_arg(ap, void *));
260189549Sdavidxu#else
261189549Sdavidxu		ret = EOPNOTSUPP;
262189549Sdavidxu#endif
263112918Sjeff	}
264112918Sjeff	va_end(ap);
265112918Sjeff
266164583Sdavidxu	_thr_cancel_leave(curthread);
267112918Sjeff
268144518Sdavidxu	return (ret);
269112918Sjeff}
270112918Sjeff
271144518Sdavidxu__weak_reference(__fsync, fsync);
272131181Smtm
273131181Smtmint
274144518Sdavidxu__fsync(int fd)
275131181Smtm{
276144518Sdavidxu	struct pthread *curthread = _get_curthread();
277131181Smtm	int	ret;
278131181Smtm
279164583Sdavidxu	_thr_cancel_enter(curthread);
280112918Sjeff	ret = __sys_fsync(fd);
281164583Sdavidxu	_thr_cancel_leave(curthread);
282112918Sjeff
283144518Sdavidxu	return (ret);
284112918Sjeff}
285112918Sjeff
286144518Sdavidxu__weak_reference(__msync, msync);
287135301Smtm
288135301Smtmint
289144518Sdavidxu__msync(void *addr, size_t len, int flags)
290135301Smtm{
291144518Sdavidxu	struct pthread *curthread = _get_curthread();
292112918Sjeff	int	ret;
293112918Sjeff
294164583Sdavidxu	_thr_cancel_enter(curthread);
295112918Sjeff	ret = __sys_msync(addr, len, flags);
296164583Sdavidxu	_thr_cancel_leave(curthread);
297112918Sjeff
298112918Sjeff	return ret;
299112918Sjeff}
300112918Sjeff
301144518Sdavidxu__weak_reference(__nanosleep, nanosleep);
302112918Sjeff
303112918Sjeffint
304144518Sdavidxu__nanosleep(const struct timespec *time_to_sleep,
305144518Sdavidxu    struct timespec *time_remaining)
306112918Sjeff{
307144518Sdavidxu	struct pthread *curthread = _get_curthread();
308144518Sdavidxu	int		ret;
309112918Sjeff
310164583Sdavidxu	_thr_cancel_enter(curthread);
311112918Sjeff	ret = __sys_nanosleep(time_to_sleep, time_remaining);
312164583Sdavidxu	_thr_cancel_leave(curthread);
313112918Sjeff
314144518Sdavidxu	return (ret);
315112918Sjeff}
316112918Sjeff
317144518Sdavidxu__weak_reference(__open, open);
318112918Sjeff
319112918Sjeffint
320144518Sdavidxu__open(const char *path, int flags,...)
321112918Sjeff{
322144518Sdavidxu	struct pthread *curthread = _get_curthread();
323112918Sjeff	int	ret;
324112918Sjeff	int	mode = 0;
325112918Sjeff	va_list	ap;
326112918Sjeff
327164583Sdavidxu	_thr_cancel_enter(curthread);
328112918Sjeff
329112918Sjeff	/* Check if the file is being created: */
330112918Sjeff	if (flags & O_CREAT) {
331112918Sjeff		/* Get the creation mode: */
332112918Sjeff		va_start(ap, flags);
333112918Sjeff		mode = va_arg(ap, int);
334112918Sjeff		va_end(ap);
335112918Sjeff	}
336112918Sjeff
337112918Sjeff	ret = __sys_open(path, flags, mode);
338112918Sjeff
339164583Sdavidxu	_thr_cancel_leave(curthread);
340144518Sdavidxu
341112918Sjeff	return ret;
342112918Sjeff}
343112918Sjeff
344144518Sdavidxu__weak_reference(__poll, poll);
345112918Sjeff
346112918Sjeffint
347144518Sdavidxu__poll(struct pollfd *fds, unsigned int nfds, int timeout)
348112918Sjeff{
349144518Sdavidxu	struct pthread *curthread = _get_curthread();
350112918Sjeff	int ret;
351112918Sjeff
352164583Sdavidxu	_thr_cancel_enter(curthread);
353112918Sjeff	ret = __sys_poll(fds, nfds, timeout);
354164583Sdavidxu	_thr_cancel_leave(curthread);
355112918Sjeff
356112918Sjeff	return ret;
357112918Sjeff}
358112918Sjeff
359160662Sdavidxu__weak_reference(___pselect, pselect);
360135301Smtm
361112918Sjeffint
362160662Sdavidxu___pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds,
363112918Sjeff	const struct timespec *timo, const sigset_t *mask)
364112918Sjeff{
365144518Sdavidxu	struct pthread *curthread = _get_curthread();
366112918Sjeff	int ret;
367112918Sjeff
368164583Sdavidxu	_thr_cancel_enter(curthread);
369112918Sjeff	ret = __pselect(count, rfds, wfds, efds, timo, mask);
370164583Sdavidxu	_thr_cancel_leave(curthread);
371112918Sjeff
372112918Sjeff	return (ret);
373112918Sjeff}
374112918Sjeff
375144518Sdavidxu__weak_reference(__read, read);
376112918Sjeff
377112918Sjeffssize_t
378144518Sdavidxu__read(int fd, void *buf, size_t nbytes)
379112918Sjeff{
380144518Sdavidxu	struct pthread *curthread = _get_curthread();
381112918Sjeff	ssize_t	ret;
382112918Sjeff
383164583Sdavidxu	_thr_cancel_enter(curthread);
384112918Sjeff	ret = __sys_read(fd, buf, nbytes);
385164583Sdavidxu	_thr_cancel_leave(curthread);
386112918Sjeff
387112918Sjeff	return ret;
388112918Sjeff}
389112918Sjeff
390144518Sdavidxu__weak_reference(__readv, readv);
391112918Sjeff
392112918Sjeffssize_t
393144518Sdavidxu__readv(int fd, const struct iovec *iov, int iovcnt)
394112918Sjeff{
395144518Sdavidxu	struct pthread *curthread = _get_curthread();
396112918Sjeff	ssize_t ret;
397112918Sjeff
398164583Sdavidxu	_thr_cancel_enter(curthread);
399112918Sjeff	ret = __sys_readv(fd, iov, iovcnt);
400164583Sdavidxu	_thr_cancel_leave(curthread);
401112918Sjeff
402112918Sjeff	return ret;
403112918Sjeff}
404112918Sjeff
405144518Sdavidxu__weak_reference(__recvfrom, recvfrom);
406135301Smtm
407135301Smtmssize_t
408144518Sdavidxu__recvfrom(int s, void *b, size_t l, int f, struct sockaddr *from,
409135301Smtm    socklen_t *fl)
410135301Smtm{
411144518Sdavidxu	struct pthread *curthread = _get_curthread();
412135301Smtm	ssize_t ret;
413135301Smtm
414164583Sdavidxu	_thr_cancel_enter(curthread);
415135301Smtm	ret = __sys_recvfrom(s, b, l, f, from, fl);
416164583Sdavidxu	_thr_cancel_leave(curthread);
417135301Smtm	return (ret);
418135301Smtm}
419135301Smtm
420144518Sdavidxu__weak_reference(__recvmsg, recvmsg);
421135301Smtm
422135301Smtmssize_t
423144518Sdavidxu__recvmsg(int s, struct msghdr *m, int f)
424135301Smtm{
425144518Sdavidxu	struct pthread *curthread = _get_curthread();
426135301Smtm	ssize_t ret;
427135301Smtm
428164583Sdavidxu	_thr_cancel_enter(curthread);
429135301Smtm	ret = __sys_recvmsg(s, m, f);
430164583Sdavidxu	_thr_cancel_leave(curthread);
431135301Smtm	return (ret);
432135301Smtm}
433135301Smtm
434144518Sdavidxu__weak_reference(__select, select);
435112918Sjeff
436112918Sjeffint
437144518Sdavidxu__select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
438112918Sjeff	struct timeval *timeout)
439112918Sjeff{
440144518Sdavidxu	struct pthread *curthread = _get_curthread();
441112918Sjeff	int ret;
442112918Sjeff
443164583Sdavidxu	_thr_cancel_enter(curthread);
444112918Sjeff	ret = __sys_select(numfds, readfds, writefds, exceptfds, timeout);
445164583Sdavidxu	_thr_cancel_leave(curthread);
446112918Sjeff	return ret;
447112918Sjeff}
448112918Sjeff
449144518Sdavidxu__weak_reference(__sendmsg, sendmsg);
450135301Smtm
451135301Smtmssize_t
452144518Sdavidxu__sendmsg(int s, const struct msghdr *m, int f)
453135301Smtm{
454144518Sdavidxu	struct pthread *curthread = _get_curthread();
455135301Smtm	ssize_t ret;
456135301Smtm
457164583Sdavidxu	_thr_cancel_enter(curthread);
458135301Smtm	ret = __sys_sendmsg(s, m, f);
459164583Sdavidxu	_thr_cancel_leave(curthread);
460135301Smtm	return (ret);
461135301Smtm}
462135301Smtm
463144518Sdavidxu__weak_reference(__sendto, sendto);
464135301Smtm
465135301Smtmssize_t
466144518Sdavidxu__sendto(int s, const void *m, size_t l, int f, const struct sockaddr *t,
467135301Smtm    socklen_t tl)
468135301Smtm{
469144518Sdavidxu	struct pthread *curthread = _get_curthread();
470135301Smtm	ssize_t ret;
471135301Smtm
472164583Sdavidxu	_thr_cancel_enter(curthread);
473135301Smtm	ret = __sys_sendto(s, m, l, f, t, tl);
474164583Sdavidxu	_thr_cancel_leave(curthread);
475135301Smtm	return (ret);
476135301Smtm}
477135301Smtm
478160662Sdavidxu__weak_reference(___sleep, sleep);
479148658Sdeischen
480112918Sjeffunsigned int
481160662Sdavidxu___sleep(unsigned int seconds)
482112918Sjeff{
483144518Sdavidxu	struct pthread *curthread = _get_curthread();
484112918Sjeff	unsigned int	ret;
485112918Sjeff
486164583Sdavidxu	_thr_cancel_enter(curthread);
487112918Sjeff	ret = __sleep(seconds);
488164583Sdavidxu	_thr_cancel_leave(curthread);
489112918Sjeff
490144518Sdavidxu	return (ret);
491112918Sjeff}
492112918Sjeff
493160662Sdavidxu__weak_reference(___system, system);
494112918Sjeff
495112918Sjeffint
496160662Sdavidxu___system(const char *string)
497112918Sjeff{
498144518Sdavidxu	struct pthread *curthread = _get_curthread();
499112918Sjeff	int	ret;
500112918Sjeff
501164583Sdavidxu	_thr_cancel_enter(curthread);
502112918Sjeff	ret = __system(string);
503164583Sdavidxu	_thr_cancel_leave(curthread);
504112918Sjeff
505112918Sjeff	return ret;
506112918Sjeff}
507112918Sjeff
508160662Sdavidxu__weak_reference(___tcdrain, tcdrain);
509112918Sjeff
510112918Sjeffint
511160662Sdavidxu___tcdrain(int fd)
512112918Sjeff{
513144518Sdavidxu	struct pthread *curthread = _get_curthread();
514112918Sjeff	int	ret;
515112918Sjeff
516164583Sdavidxu	_thr_cancel_enter(curthread);
517112918Sjeff	ret = __tcdrain(fd);
518164583Sdavidxu	_thr_cancel_leave(curthread);
519112918Sjeff
520144518Sdavidxu	return (ret);
521112918Sjeff}
522112918Sjeff
523160662Sdavidxu__weak_reference(___usleep, usleep);
524148658Sdeischen
525148658Sdeischenint
526160662Sdavidxu___usleep(useconds_t useconds)
527148658Sdeischen{
528148658Sdeischen	struct pthread *curthread = _get_curthread();
529148658Sdeischen	int		ret;
530148658Sdeischen
531164583Sdavidxu	_thr_cancel_enter(curthread);
532148658Sdeischen	ret = __usleep(useconds);
533164583Sdavidxu	_thr_cancel_leave(curthread);
534148658Sdeischen
535148658Sdeischen	return (ret);
536148658Sdeischen}
537148658Sdeischen
538160662Sdavidxu__weak_reference(___wait, wait);
539112918Sjeff
540112918Sjeffpid_t
541160662Sdavidxu___wait(int *istat)
542112918Sjeff{
543144518Sdavidxu	struct pthread *curthread = _get_curthread();
544112918Sjeff	pid_t	ret;
545112918Sjeff
546164583Sdavidxu	_thr_cancel_enter(curthread);
547112918Sjeff	ret = __wait(istat);
548164583Sdavidxu	_thr_cancel_leave(curthread);
549112918Sjeff
550112918Sjeff	return ret;
551112918Sjeff}
552112918Sjeff
553160662Sdavidxu__weak_reference(__wait3, wait3);
554160662Sdavidxu
555160662Sdavidxupid_t
556160662Sdavidxu__wait3(int *status, int options, struct rusage *rusage)
557160662Sdavidxu{
558160662Sdavidxu	struct pthread *curthread = _get_curthread();
559160662Sdavidxu	pid_t ret;
560160662Sdavidxu
561164583Sdavidxu	_thr_cancel_enter(curthread);
562160662Sdavidxu	ret = _wait4(WAIT_ANY, status, options, rusage);
563164583Sdavidxu	_thr_cancel_leave(curthread);
564160662Sdavidxu
565160662Sdavidxu	return (ret);
566160662Sdavidxu}
567160662Sdavidxu
568144518Sdavidxu__weak_reference(__wait4, wait4);
569112918Sjeff
570112918Sjeffpid_t
571160662Sdavidxu__wait4(pid_t pid, int *status, int options, struct rusage *rusage)
572112918Sjeff{
573144518Sdavidxu	struct pthread *curthread = _get_curthread();
574112918Sjeff	pid_t ret;
575112918Sjeff
576164583Sdavidxu	_thr_cancel_enter(curthread);
577160662Sdavidxu	ret = __sys_wait4(pid, status, options, rusage);
578164583Sdavidxu	_thr_cancel_leave(curthread);
579112918Sjeff
580112918Sjeff	return ret;
581112918Sjeff}
582112918Sjeff
583160662Sdavidxu__weak_reference(___waitpid, waitpid);
584112918Sjeff
585112918Sjeffpid_t
586160662Sdavidxu___waitpid(pid_t wpid, int *status, int options)
587112918Sjeff{
588144518Sdavidxu	struct pthread *curthread = _get_curthread();
589112918Sjeff	pid_t	ret;
590112918Sjeff
591164583Sdavidxu	_thr_cancel_enter(curthread);
592112918Sjeff	ret = __waitpid(wpid, status, options);
593164583Sdavidxu	_thr_cancel_leave(curthread);
594112918Sjeff
595112918Sjeff	return ret;
596112918Sjeff}
597112918Sjeff
598144518Sdavidxu__weak_reference(__write, write);
599112918Sjeff
600112918Sjeffssize_t
601144518Sdavidxu__write(int fd, const void *buf, size_t nbytes)
602112918Sjeff{
603144518Sdavidxu	struct pthread *curthread = _get_curthread();
604112918Sjeff	ssize_t	ret;
605112918Sjeff
606164583Sdavidxu	_thr_cancel_enter(curthread);
607112918Sjeff	ret = __sys_write(fd, buf, nbytes);
608164583Sdavidxu	_thr_cancel_leave(curthread);
609112918Sjeff
610112918Sjeff	return ret;
611112918Sjeff}
612112918Sjeff
613144518Sdavidxu__weak_reference(__writev, writev);
614112918Sjeff
615112918Sjeffssize_t
616144518Sdavidxu__writev(int fd, const struct iovec *iov, int iovcnt)
617112918Sjeff{
618144518Sdavidxu	struct pthread *curthread = _get_curthread();
619112918Sjeff	ssize_t ret;
620112918Sjeff
621164583Sdavidxu	_thr_cancel_enter(curthread);
622112918Sjeff	ret = __sys_writev(fd, iov, iovcnt);
623164583Sdavidxu	_thr_cancel_leave(curthread);
624112918Sjeff
625112918Sjeff	return ret;
626112918Sjeff}
627