thr_syscalls.c revision 197968
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 197968 2009-10-11 20:19:45Z jilles $
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,...);
142197968Sjillesint	__openat(int, const char *, int,...);
143157457Sdavidxuint	__poll(struct pollfd *, unsigned int, int);
144157457Sdavidxussize_t	__read(int, void *buf, size_t);
145157457Sdavidxussize_t	__readv(int, const struct iovec *, int);
146157457Sdavidxussize_t	__recvfrom(int, void *, size_t, int f, struct sockaddr *, socklen_t *);
147157457Sdavidxussize_t	__recvmsg(int, struct msghdr *, int);
148157457Sdavidxuint	__select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
149157457Sdavidxussize_t	__sendmsg(int, const struct msghdr *, int);
150157457Sdavidxussize_t	__sendto(int, const void *, size_t, int,
151157457Sdavidxu		const struct sockaddr *, socklen_t);
152160662Sdavidxupid_t	__wait3(int *, int, struct rusage *);
153157457Sdavidxupid_t	__wait4(pid_t, int *, int, struct rusage *);
154157457Sdavidxussize_t	__write(int, const void *, size_t);
155157457Sdavidxussize_t	__writev(int, const struct iovec *, int);
156157457Sdavidxu
157144518Sdavidxu__weak_reference(__accept, accept);
158157457Sdavidxu
159135301Smtmint
160144518Sdavidxu__accept(int s, struct sockaddr *addr, socklen_t *addrlen)
161135301Smtm{
162144518Sdavidxu	struct pthread *curthread;
163135301Smtm	int ret;
164135301Smtm
165144518Sdavidxu	curthread = _get_curthread();
166164583Sdavidxu	_thr_cancel_enter(curthread);
167135301Smtm	ret = __sys_accept(s, addr, addrlen);
168164583Sdavidxu	_thr_cancel_leave(curthread);
169144518Sdavidxu
170144518Sdavidxu 	return (ret);
171135301Smtm}
172135301Smtm
173160662Sdavidxu__weak_reference(__aio_suspend, aio_suspend);
174112918Sjeff
175112918Sjeffint
176160662Sdavidxu__aio_suspend(const struct aiocb * const iocbs[], int niocb, const struct
177112918Sjeff    timespec *timeout)
178112918Sjeff{
179144518Sdavidxu	struct pthread *curthread = _get_curthread();
180144518Sdavidxu	int ret;
181112918Sjeff
182164583Sdavidxu	_thr_cancel_enter(curthread);
183112918Sjeff	ret = __sys_aio_suspend(iocbs, niocb, timeout);
184164583Sdavidxu	_thr_cancel_leave(curthread);
185112918Sjeff
186144518Sdavidxu	return (ret);
187112918Sjeff}
188112918Sjeff
189144518Sdavidxu__weak_reference(__close, close);
190112918Sjeff
191112918Sjeffint
192144518Sdavidxu__close(int fd)
193112918Sjeff{
194144518Sdavidxu	struct pthread	*curthread = _get_curthread();
195112918Sjeff	int	ret;
196112918Sjeff
197164583Sdavidxu	_thr_cancel_enter(curthread);
198112918Sjeff	ret = __sys_close(fd);
199164583Sdavidxu	_thr_cancel_leave(curthread);
200112918Sjeff
201144518Sdavidxu	return (ret);
202112918Sjeff}
203135301Smtm
204144518Sdavidxu__weak_reference(__connect, connect);
205135301Smtm
206135301Smtmint
207144518Sdavidxu__connect(int fd, const struct sockaddr *name, socklen_t namelen)
208135301Smtm{
209144518Sdavidxu	struct pthread *curthread = _get_curthread();
210135301Smtm	int ret;
211135301Smtm
212164583Sdavidxu	_thr_cancel_enter(curthread);
213144518Sdavidxu	ret = __sys_connect(fd, name, namelen);
214164583Sdavidxu	_thr_cancel_leave(curthread);
215144518Sdavidxu
216144518Sdavidxu 	return (ret);
217135301Smtm}
218112918Sjeff
219144518Sdavidxu__weak_reference(___creat, creat);
220144518Sdavidxu
221112918Sjeffint
222144518Sdavidxu___creat(const char *path, mode_t mode)
223112918Sjeff{
224144518Sdavidxu	struct pthread *curthread = _get_curthread();
225144518Sdavidxu	int ret;
226112918Sjeff
227164583Sdavidxu	_thr_cancel_enter(curthread);
228112918Sjeff	ret = __creat(path, mode);
229164583Sdavidxu	_thr_cancel_leave(curthread);
230112918Sjeff
231112918Sjeff	return ret;
232112918Sjeff}
233112918Sjeff
234144518Sdavidxu__weak_reference(__fcntl, fcntl);
235112918Sjeff
236112918Sjeffint
237144518Sdavidxu__fcntl(int fd, int cmd,...)
238112918Sjeff{
239144518Sdavidxu	struct pthread *curthread = _get_curthread();
240112918Sjeff	int	ret;
241112918Sjeff	va_list	ap;
242112918Sjeff
243164583Sdavidxu	_thr_cancel_enter(curthread);
244112918Sjeff
245112918Sjeff	va_start(ap, cmd);
246112918Sjeff	switch (cmd) {
247144518Sdavidxu	case F_DUPFD:
248144518Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, int));
249144518Sdavidxu		break;
250144518Sdavidxu	case F_SETFD:
251144518Sdavidxu	case F_SETFL:
252144518Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, int));
253144518Sdavidxu		break;
254144518Sdavidxu	case F_GETFD:
255144518Sdavidxu	case F_GETFL:
256144518Sdavidxu		ret = __sys_fcntl(fd, cmd);
257144518Sdavidxu		break;
258144518Sdavidxu	default:
259189549Sdavidxu#ifdef SYSCALL_COMPAT
260179434Sdfr		ret = __fcntl_compat(fd, cmd, va_arg(ap, void *));
261189549Sdavidxu#else
262189553Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, void *));
263189549Sdavidxu#endif
264112918Sjeff	}
265112918Sjeff	va_end(ap);
266112918Sjeff
267164583Sdavidxu	_thr_cancel_leave(curthread);
268112918Sjeff
269144518Sdavidxu	return (ret);
270112918Sjeff}
271112918Sjeff
272144518Sdavidxu__weak_reference(__fsync, fsync);
273131181Smtm
274131181Smtmint
275144518Sdavidxu__fsync(int fd)
276131181Smtm{
277144518Sdavidxu	struct pthread *curthread = _get_curthread();
278131181Smtm	int	ret;
279131181Smtm
280164583Sdavidxu	_thr_cancel_enter(curthread);
281112918Sjeff	ret = __sys_fsync(fd);
282164583Sdavidxu	_thr_cancel_leave(curthread);
283112918Sjeff
284144518Sdavidxu	return (ret);
285112918Sjeff}
286112918Sjeff
287144518Sdavidxu__weak_reference(__msync, msync);
288135301Smtm
289135301Smtmint
290144518Sdavidxu__msync(void *addr, size_t len, int flags)
291135301Smtm{
292144518Sdavidxu	struct pthread *curthread = _get_curthread();
293112918Sjeff	int	ret;
294112918Sjeff
295164583Sdavidxu	_thr_cancel_enter(curthread);
296112918Sjeff	ret = __sys_msync(addr, len, flags);
297164583Sdavidxu	_thr_cancel_leave(curthread);
298112918Sjeff
299112918Sjeff	return ret;
300112918Sjeff}
301112918Sjeff
302144518Sdavidxu__weak_reference(__nanosleep, nanosleep);
303112918Sjeff
304112918Sjeffint
305144518Sdavidxu__nanosleep(const struct timespec *time_to_sleep,
306144518Sdavidxu    struct timespec *time_remaining)
307112918Sjeff{
308144518Sdavidxu	struct pthread *curthread = _get_curthread();
309144518Sdavidxu	int		ret;
310112918Sjeff
311164583Sdavidxu	_thr_cancel_enter(curthread);
312112918Sjeff	ret = __sys_nanosleep(time_to_sleep, time_remaining);
313164583Sdavidxu	_thr_cancel_leave(curthread);
314112918Sjeff
315144518Sdavidxu	return (ret);
316112918Sjeff}
317112918Sjeff
318144518Sdavidxu__weak_reference(__open, open);
319112918Sjeff
320112918Sjeffint
321144518Sdavidxu__open(const char *path, int flags,...)
322112918Sjeff{
323144518Sdavidxu	struct pthread *curthread = _get_curthread();
324112918Sjeff	int	ret;
325112918Sjeff	int	mode = 0;
326112918Sjeff	va_list	ap;
327112918Sjeff
328164583Sdavidxu	_thr_cancel_enter(curthread);
329112918Sjeff
330112918Sjeff	/* Check if the file is being created: */
331112918Sjeff	if (flags & O_CREAT) {
332112918Sjeff		/* Get the creation mode: */
333112918Sjeff		va_start(ap, flags);
334112918Sjeff		mode = va_arg(ap, int);
335112918Sjeff		va_end(ap);
336112918Sjeff	}
337112918Sjeff
338112918Sjeff	ret = __sys_open(path, flags, mode);
339112918Sjeff
340164583Sdavidxu	_thr_cancel_leave(curthread);
341144518Sdavidxu
342112918Sjeff	return ret;
343112918Sjeff}
344112918Sjeff
345197968Sjilles__weak_reference(__openat, openat);
346197968Sjilles
347197968Sjillesint
348197968Sjilles__openat(int fd, const char *path, int flags, ...)
349197968Sjilles{
350197968Sjilles	struct pthread *curthread = _get_curthread();
351197968Sjilles	int	ret;
352197968Sjilles	int	mode = 0;
353197968Sjilles	va_list	ap;
354197968Sjilles
355197968Sjilles	_thr_cancel_enter(curthread);
356197968Sjilles
357197968Sjilles	/* Check if the file is being created: */
358197968Sjilles	if (flags & O_CREAT) {
359197968Sjilles		/* Get the creation mode: */
360197968Sjilles		va_start(ap, flags);
361197968Sjilles		mode = va_arg(ap, int);
362197968Sjilles		va_end(ap);
363197968Sjilles	}
364197968Sjilles
365197968Sjilles	ret = __sys_openat(fd, path, flags, mode);
366197968Sjilles
367197968Sjilles	_thr_cancel_leave(curthread);
368197968Sjilles
369197968Sjilles	return ret;
370197968Sjilles}
371197968Sjilles
372144518Sdavidxu__weak_reference(__poll, poll);
373112918Sjeff
374112918Sjeffint
375144518Sdavidxu__poll(struct pollfd *fds, unsigned int nfds, int timeout)
376112918Sjeff{
377144518Sdavidxu	struct pthread *curthread = _get_curthread();
378112918Sjeff	int ret;
379112918Sjeff
380164583Sdavidxu	_thr_cancel_enter(curthread);
381112918Sjeff	ret = __sys_poll(fds, nfds, timeout);
382164583Sdavidxu	_thr_cancel_leave(curthread);
383112918Sjeff
384112918Sjeff	return ret;
385112918Sjeff}
386112918Sjeff
387160662Sdavidxu__weak_reference(___pselect, pselect);
388135301Smtm
389112918Sjeffint
390160662Sdavidxu___pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds,
391112918Sjeff	const struct timespec *timo, const sigset_t *mask)
392112918Sjeff{
393144518Sdavidxu	struct pthread *curthread = _get_curthread();
394112918Sjeff	int ret;
395112918Sjeff
396164583Sdavidxu	_thr_cancel_enter(curthread);
397112918Sjeff	ret = __pselect(count, rfds, wfds, efds, timo, mask);
398164583Sdavidxu	_thr_cancel_leave(curthread);
399112918Sjeff
400112918Sjeff	return (ret);
401112918Sjeff}
402112918Sjeff
403144518Sdavidxu__weak_reference(__read, read);
404112918Sjeff
405112918Sjeffssize_t
406144518Sdavidxu__read(int fd, void *buf, size_t nbytes)
407112918Sjeff{
408144518Sdavidxu	struct pthread *curthread = _get_curthread();
409112918Sjeff	ssize_t	ret;
410112918Sjeff
411164583Sdavidxu	_thr_cancel_enter(curthread);
412112918Sjeff	ret = __sys_read(fd, buf, nbytes);
413164583Sdavidxu	_thr_cancel_leave(curthread);
414112918Sjeff
415112918Sjeff	return ret;
416112918Sjeff}
417112918Sjeff
418144518Sdavidxu__weak_reference(__readv, readv);
419112918Sjeff
420112918Sjeffssize_t
421144518Sdavidxu__readv(int fd, const struct iovec *iov, int iovcnt)
422112918Sjeff{
423144518Sdavidxu	struct pthread *curthread = _get_curthread();
424112918Sjeff	ssize_t ret;
425112918Sjeff
426164583Sdavidxu	_thr_cancel_enter(curthread);
427112918Sjeff	ret = __sys_readv(fd, iov, iovcnt);
428164583Sdavidxu	_thr_cancel_leave(curthread);
429112918Sjeff
430112918Sjeff	return ret;
431112918Sjeff}
432112918Sjeff
433144518Sdavidxu__weak_reference(__recvfrom, recvfrom);
434135301Smtm
435135301Smtmssize_t
436144518Sdavidxu__recvfrom(int s, void *b, size_t l, int f, struct sockaddr *from,
437135301Smtm    socklen_t *fl)
438135301Smtm{
439144518Sdavidxu	struct pthread *curthread = _get_curthread();
440135301Smtm	ssize_t ret;
441135301Smtm
442164583Sdavidxu	_thr_cancel_enter(curthread);
443135301Smtm	ret = __sys_recvfrom(s, b, l, f, from, fl);
444164583Sdavidxu	_thr_cancel_leave(curthread);
445135301Smtm	return (ret);
446135301Smtm}
447135301Smtm
448144518Sdavidxu__weak_reference(__recvmsg, recvmsg);
449135301Smtm
450135301Smtmssize_t
451144518Sdavidxu__recvmsg(int s, struct msghdr *m, int f)
452135301Smtm{
453144518Sdavidxu	struct pthread *curthread = _get_curthread();
454135301Smtm	ssize_t ret;
455135301Smtm
456164583Sdavidxu	_thr_cancel_enter(curthread);
457135301Smtm	ret = __sys_recvmsg(s, m, f);
458164583Sdavidxu	_thr_cancel_leave(curthread);
459135301Smtm	return (ret);
460135301Smtm}
461135301Smtm
462144518Sdavidxu__weak_reference(__select, select);
463112918Sjeff
464112918Sjeffint
465144518Sdavidxu__select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
466112918Sjeff	struct timeval *timeout)
467112918Sjeff{
468144518Sdavidxu	struct pthread *curthread = _get_curthread();
469112918Sjeff	int ret;
470112918Sjeff
471164583Sdavidxu	_thr_cancel_enter(curthread);
472112918Sjeff	ret = __sys_select(numfds, readfds, writefds, exceptfds, timeout);
473164583Sdavidxu	_thr_cancel_leave(curthread);
474112918Sjeff	return ret;
475112918Sjeff}
476112918Sjeff
477144518Sdavidxu__weak_reference(__sendmsg, sendmsg);
478135301Smtm
479135301Smtmssize_t
480144518Sdavidxu__sendmsg(int s, const struct msghdr *m, int f)
481135301Smtm{
482144518Sdavidxu	struct pthread *curthread = _get_curthread();
483135301Smtm	ssize_t ret;
484135301Smtm
485164583Sdavidxu	_thr_cancel_enter(curthread);
486135301Smtm	ret = __sys_sendmsg(s, m, f);
487164583Sdavidxu	_thr_cancel_leave(curthread);
488135301Smtm	return (ret);
489135301Smtm}
490135301Smtm
491144518Sdavidxu__weak_reference(__sendto, sendto);
492135301Smtm
493135301Smtmssize_t
494144518Sdavidxu__sendto(int s, const void *m, size_t l, int f, const struct sockaddr *t,
495135301Smtm    socklen_t tl)
496135301Smtm{
497144518Sdavidxu	struct pthread *curthread = _get_curthread();
498135301Smtm	ssize_t ret;
499135301Smtm
500164583Sdavidxu	_thr_cancel_enter(curthread);
501135301Smtm	ret = __sys_sendto(s, m, l, f, t, tl);
502164583Sdavidxu	_thr_cancel_leave(curthread);
503135301Smtm	return (ret);
504135301Smtm}
505135301Smtm
506160662Sdavidxu__weak_reference(___sleep, sleep);
507148658Sdeischen
508112918Sjeffunsigned int
509160662Sdavidxu___sleep(unsigned int seconds)
510112918Sjeff{
511144518Sdavidxu	struct pthread *curthread = _get_curthread();
512112918Sjeff	unsigned int	ret;
513112918Sjeff
514164583Sdavidxu	_thr_cancel_enter(curthread);
515112918Sjeff	ret = __sleep(seconds);
516164583Sdavidxu	_thr_cancel_leave(curthread);
517112918Sjeff
518144518Sdavidxu	return (ret);
519112918Sjeff}
520112918Sjeff
521160662Sdavidxu__weak_reference(___system, system);
522112918Sjeff
523112918Sjeffint
524160662Sdavidxu___system(const char *string)
525112918Sjeff{
526144518Sdavidxu	struct pthread *curthread = _get_curthread();
527112918Sjeff	int	ret;
528112918Sjeff
529164583Sdavidxu	_thr_cancel_enter(curthread);
530112918Sjeff	ret = __system(string);
531164583Sdavidxu	_thr_cancel_leave(curthread);
532112918Sjeff
533112918Sjeff	return ret;
534112918Sjeff}
535112918Sjeff
536160662Sdavidxu__weak_reference(___tcdrain, tcdrain);
537112918Sjeff
538112918Sjeffint
539160662Sdavidxu___tcdrain(int fd)
540112918Sjeff{
541144518Sdavidxu	struct pthread *curthread = _get_curthread();
542112918Sjeff	int	ret;
543112918Sjeff
544164583Sdavidxu	_thr_cancel_enter(curthread);
545112918Sjeff	ret = __tcdrain(fd);
546164583Sdavidxu	_thr_cancel_leave(curthread);
547112918Sjeff
548144518Sdavidxu	return (ret);
549112918Sjeff}
550112918Sjeff
551160662Sdavidxu__weak_reference(___usleep, usleep);
552148658Sdeischen
553148658Sdeischenint
554160662Sdavidxu___usleep(useconds_t useconds)
555148658Sdeischen{
556148658Sdeischen	struct pthread *curthread = _get_curthread();
557148658Sdeischen	int		ret;
558148658Sdeischen
559164583Sdavidxu	_thr_cancel_enter(curthread);
560148658Sdeischen	ret = __usleep(useconds);
561164583Sdavidxu	_thr_cancel_leave(curthread);
562148658Sdeischen
563148658Sdeischen	return (ret);
564148658Sdeischen}
565148658Sdeischen
566160662Sdavidxu__weak_reference(___wait, wait);
567112918Sjeff
568112918Sjeffpid_t
569160662Sdavidxu___wait(int *istat)
570112918Sjeff{
571144518Sdavidxu	struct pthread *curthread = _get_curthread();
572112918Sjeff	pid_t	ret;
573112918Sjeff
574164583Sdavidxu	_thr_cancel_enter(curthread);
575112918Sjeff	ret = __wait(istat);
576164583Sdavidxu	_thr_cancel_leave(curthread);
577112918Sjeff
578112918Sjeff	return ret;
579112918Sjeff}
580112918Sjeff
581160662Sdavidxu__weak_reference(__wait3, wait3);
582160662Sdavidxu
583160662Sdavidxupid_t
584160662Sdavidxu__wait3(int *status, int options, struct rusage *rusage)
585160662Sdavidxu{
586160662Sdavidxu	struct pthread *curthread = _get_curthread();
587160662Sdavidxu	pid_t ret;
588160662Sdavidxu
589164583Sdavidxu	_thr_cancel_enter(curthread);
590160662Sdavidxu	ret = _wait4(WAIT_ANY, status, options, rusage);
591164583Sdavidxu	_thr_cancel_leave(curthread);
592160662Sdavidxu
593160662Sdavidxu	return (ret);
594160662Sdavidxu}
595160662Sdavidxu
596144518Sdavidxu__weak_reference(__wait4, wait4);
597112918Sjeff
598112918Sjeffpid_t
599160662Sdavidxu__wait4(pid_t pid, int *status, int options, struct rusage *rusage)
600112918Sjeff{
601144518Sdavidxu	struct pthread *curthread = _get_curthread();
602112918Sjeff	pid_t ret;
603112918Sjeff
604164583Sdavidxu	_thr_cancel_enter(curthread);
605160662Sdavidxu	ret = __sys_wait4(pid, status, options, rusage);
606164583Sdavidxu	_thr_cancel_leave(curthread);
607112918Sjeff
608112918Sjeff	return ret;
609112918Sjeff}
610112918Sjeff
611160662Sdavidxu__weak_reference(___waitpid, waitpid);
612112918Sjeff
613112918Sjeffpid_t
614160662Sdavidxu___waitpid(pid_t wpid, int *status, int options)
615112918Sjeff{
616144518Sdavidxu	struct pthread *curthread = _get_curthread();
617112918Sjeff	pid_t	ret;
618112918Sjeff
619164583Sdavidxu	_thr_cancel_enter(curthread);
620112918Sjeff	ret = __waitpid(wpid, status, options);
621164583Sdavidxu	_thr_cancel_leave(curthread);
622112918Sjeff
623112918Sjeff	return ret;
624112918Sjeff}
625112918Sjeff
626144518Sdavidxu__weak_reference(__write, write);
627112918Sjeff
628112918Sjeffssize_t
629144518Sdavidxu__write(int fd, const void *buf, size_t nbytes)
630112918Sjeff{
631144518Sdavidxu	struct pthread *curthread = _get_curthread();
632112918Sjeff	ssize_t	ret;
633112918Sjeff
634164583Sdavidxu	_thr_cancel_enter(curthread);
635112918Sjeff	ret = __sys_write(fd, buf, nbytes);
636164583Sdavidxu	_thr_cancel_leave(curthread);
637112918Sjeff
638112918Sjeff	return ret;
639112918Sjeff}
640112918Sjeff
641144518Sdavidxu__weak_reference(__writev, writev);
642112918Sjeff
643112918Sjeffssize_t
644144518Sdavidxu__writev(int fd, const struct iovec *iov, int iovcnt)
645112918Sjeff{
646144518Sdavidxu	struct pthread *curthread = _get_curthread();
647112918Sjeff	ssize_t ret;
648112918Sjeff
649164583Sdavidxu	_thr_cancel_enter(curthread);
650112918Sjeff	ret = __sys_writev(fd, iov, iovcnt);
651164583Sdavidxu	_thr_cancel_leave(curthread);
652112918Sjeff
653112918Sjeff	return ret;
654112918Sjeff}
655