thr_syscalls.c revision 211522
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 211522 2010-08-20 04:15: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.
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);
107198508Skibextern int	__sys_pselect(int, fd_set *, fd_set *, fd_set *,
108198508Skib			const struct timespec *, const sigset_t *);
109157457Sdavidxuextern int	__sys_poll(struct pollfd *, unsigned, int);
110157457Sdavidxuextern ssize_t	__sys_recv(int, void *, size_t, int);
111157457Sdavidxuextern ssize_t	__sys_recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *);
112157457Sdavidxuextern ssize_t	__sys_recvmsg(int, struct msghdr *, int);
113157457Sdavidxuextern int	__sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
114157457Sdavidxuextern int	__sys_sendfile(int, int, off_t, size_t, struct sf_hdtr *,
115157457Sdavidxu			off_t *, int);
116157457Sdavidxuextern ssize_t	__sys_sendmsg(int, const struct msghdr *, int);
117157457Sdavidxuextern ssize_t	__sys_sendto(int, const void *,size_t, int, const struct sockaddr *, socklen_t);
118157457Sdavidxuextern ssize_t	__sys_readv(int, const struct iovec *, int);
119157457Sdavidxuextern pid_t	__sys_wait4(pid_t, int *, int, struct rusage *);
120157457Sdavidxuextern ssize_t	__sys_writev(int, const struct iovec *, int);
121115260Smtm
122157457Sdavidxuint	___creat(const char *, mode_t);
123160662Sdavidxuint	___pselect(int, fd_set *, fd_set *, fd_set *,
124160662Sdavidxu		const struct timespec *, const sigset_t *);
125160662Sdavidxuunsigned	___sleep(unsigned);
126160662Sdavidxuint	___system(const char *);
127160662Sdavidxuint	___tcdrain(int);
128160662Sdavidxuint	___usleep(useconds_t useconds);
129160662Sdavidxupid_t	___wait(int *);
130160662Sdavidxupid_t	___waitpid(pid_t, int *, int);
131157457Sdavidxuint	__accept(int, struct sockaddr *, socklen_t *);
132160662Sdavidxuint	__aio_suspend(const struct aiocb * const iocbs[], int,
133160662Sdavidxu		const struct timespec *);
134157457Sdavidxuint	__close(int);
135157457Sdavidxuint	__connect(int, const struct sockaddr *, socklen_t);
136157457Sdavidxuint	__fcntl(int, int,...);
137189549Sdavidxu#ifdef SYSCALL_COMPAT
138179434Sdfrextern int __fcntl_compat(int, int,...);
139189549Sdavidxu#endif
140157457Sdavidxuint	__fsync(int);
141157457Sdavidxuint	__msync(void *, size_t, int);
142157457Sdavidxuint	__nanosleep(const struct timespec *, struct timespec *);
143157457Sdavidxuint	__open(const char *, int,...);
144197968Sjillesint	__openat(int, const char *, int,...);
145157457Sdavidxuint	__poll(struct pollfd *, unsigned int, int);
146157457Sdavidxussize_t	__read(int, void *buf, size_t);
147157457Sdavidxussize_t	__readv(int, const struct iovec *, int);
148157457Sdavidxussize_t	__recvfrom(int, void *, size_t, int f, struct sockaddr *, socklen_t *);
149157457Sdavidxussize_t	__recvmsg(int, struct msghdr *, int);
150157457Sdavidxuint	__select(int, fd_set *, fd_set *, fd_set *, struct timeval *);
151157457Sdavidxussize_t	__sendmsg(int, const struct msghdr *, int);
152157457Sdavidxussize_t	__sendto(int, const void *, size_t, int,
153157457Sdavidxu		const struct sockaddr *, socklen_t);
154160662Sdavidxupid_t	__wait3(int *, int, struct rusage *);
155157457Sdavidxupid_t	__wait4(pid_t, int *, int, struct rusage *);
156157457Sdavidxussize_t	__write(int, const void *, size_t);
157157457Sdavidxussize_t	__writev(int, const struct iovec *, int);
158157457Sdavidxu
159144518Sdavidxu__weak_reference(__accept, accept);
160157457Sdavidxu
161135301Smtmint
162144518Sdavidxu__accept(int s, struct sockaddr *addr, socklen_t *addrlen)
163135301Smtm{
164144518Sdavidxu	struct pthread *curthread;
165135301Smtm	int ret;
166135301Smtm
167144518Sdavidxu	curthread = _get_curthread();
168164583Sdavidxu	_thr_cancel_enter(curthread);
169135301Smtm	ret = __sys_accept(s, addr, addrlen);
170164583Sdavidxu	_thr_cancel_leave(curthread);
171144518Sdavidxu
172144518Sdavidxu 	return (ret);
173135301Smtm}
174135301Smtm
175160662Sdavidxu__weak_reference(__aio_suspend, aio_suspend);
176112918Sjeff
177112918Sjeffint
178160662Sdavidxu__aio_suspend(const struct aiocb * const iocbs[], int niocb, const struct
179112918Sjeff    timespec *timeout)
180112918Sjeff{
181144518Sdavidxu	struct pthread *curthread = _get_curthread();
182144518Sdavidxu	int ret;
183112918Sjeff
184164583Sdavidxu	_thr_cancel_enter(curthread);
185112918Sjeff	ret = __sys_aio_suspend(iocbs, niocb, timeout);
186164583Sdavidxu	_thr_cancel_leave(curthread);
187112918Sjeff
188144518Sdavidxu	return (ret);
189112918Sjeff}
190112918Sjeff
191144518Sdavidxu__weak_reference(__close, close);
192112918Sjeff
193112918Sjeffint
194144518Sdavidxu__close(int fd)
195112918Sjeff{
196144518Sdavidxu	struct pthread	*curthread = _get_curthread();
197112918Sjeff	int	ret;
198112918Sjeff
199164583Sdavidxu	_thr_cancel_enter(curthread);
200112918Sjeff	ret = __sys_close(fd);
201164583Sdavidxu	_thr_cancel_leave(curthread);
202112918Sjeff
203144518Sdavidxu	return (ret);
204112918Sjeff}
205135301Smtm
206144518Sdavidxu__weak_reference(__connect, connect);
207135301Smtm
208135301Smtmint
209144518Sdavidxu__connect(int fd, const struct sockaddr *name, socklen_t namelen)
210135301Smtm{
211144518Sdavidxu	struct pthread *curthread = _get_curthread();
212135301Smtm	int ret;
213135301Smtm
214164583Sdavidxu	_thr_cancel_enter(curthread);
215144518Sdavidxu	ret = __sys_connect(fd, name, namelen);
216164583Sdavidxu	_thr_cancel_leave(curthread);
217144518Sdavidxu
218144518Sdavidxu 	return (ret);
219135301Smtm}
220112918Sjeff
221144518Sdavidxu__weak_reference(___creat, creat);
222144518Sdavidxu
223112918Sjeffint
224144518Sdavidxu___creat(const char *path, mode_t mode)
225112918Sjeff{
226144518Sdavidxu	struct pthread *curthread = _get_curthread();
227144518Sdavidxu	int ret;
228112918Sjeff
229164583Sdavidxu	_thr_cancel_enter(curthread);
230112918Sjeff	ret = __creat(path, mode);
231164583Sdavidxu	_thr_cancel_leave(curthread);
232112918Sjeff
233112918Sjeff	return ret;
234112918Sjeff}
235112918Sjeff
236144518Sdavidxu__weak_reference(__fcntl, fcntl);
237112918Sjeff
238112918Sjeffint
239144518Sdavidxu__fcntl(int fd, int cmd,...)
240112918Sjeff{
241144518Sdavidxu	struct pthread *curthread = _get_curthread();
242112918Sjeff	int	ret;
243112918Sjeff	va_list	ap;
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;
258211522Sdavidxu
259211522Sdavidxu	case F_OSETLKW:
260211522Sdavidxu	case F_SETLKW:
261211522Sdavidxu		_thr_cancel_enter(curthread);
262211522Sdavidxu#ifdef SYSCALL_COMPAT
263211522Sdavidxu		ret = __fcntl_compat(fd, cmd, va_arg(ap, void *));
264211522Sdavidxu#else
265211522Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, void *));
266211522Sdavidxu#endif
267211522Sdavidxu		_thr_cancel_leave(curthread);
268211522Sdavidxu		break;
269144518Sdavidxu	default:
270189549Sdavidxu#ifdef SYSCALL_COMPAT
271179434Sdfr		ret = __fcntl_compat(fd, cmd, va_arg(ap, void *));
272189549Sdavidxu#else
273189553Sdavidxu		ret = __sys_fcntl(fd, cmd, va_arg(ap, void *));
274189549Sdavidxu#endif
275112918Sjeff	}
276112918Sjeff	va_end(ap);
277112918Sjeff
278144518Sdavidxu	return (ret);
279112918Sjeff}
280112918Sjeff
281144518Sdavidxu__weak_reference(__fsync, fsync);
282131181Smtm
283131181Smtmint
284144518Sdavidxu__fsync(int fd)
285131181Smtm{
286144518Sdavidxu	struct pthread *curthread = _get_curthread();
287131181Smtm	int	ret;
288131181Smtm
289164583Sdavidxu	_thr_cancel_enter(curthread);
290112918Sjeff	ret = __sys_fsync(fd);
291164583Sdavidxu	_thr_cancel_leave(curthread);
292112918Sjeff
293144518Sdavidxu	return (ret);
294112918Sjeff}
295112918Sjeff
296144518Sdavidxu__weak_reference(__msync, msync);
297135301Smtm
298135301Smtmint
299144518Sdavidxu__msync(void *addr, size_t len, int flags)
300135301Smtm{
301144518Sdavidxu	struct pthread *curthread = _get_curthread();
302112918Sjeff	int	ret;
303112918Sjeff
304164583Sdavidxu	_thr_cancel_enter(curthread);
305112918Sjeff	ret = __sys_msync(addr, len, flags);
306164583Sdavidxu	_thr_cancel_leave(curthread);
307112918Sjeff
308112918Sjeff	return ret;
309112918Sjeff}
310112918Sjeff
311144518Sdavidxu__weak_reference(__nanosleep, nanosleep);
312112918Sjeff
313112918Sjeffint
314144518Sdavidxu__nanosleep(const struct timespec *time_to_sleep,
315144518Sdavidxu    struct timespec *time_remaining)
316112918Sjeff{
317144518Sdavidxu	struct pthread *curthread = _get_curthread();
318144518Sdavidxu	int		ret;
319112918Sjeff
320164583Sdavidxu	_thr_cancel_enter(curthread);
321112918Sjeff	ret = __sys_nanosleep(time_to_sleep, time_remaining);
322164583Sdavidxu	_thr_cancel_leave(curthread);
323112918Sjeff
324144518Sdavidxu	return (ret);
325112918Sjeff}
326112918Sjeff
327144518Sdavidxu__weak_reference(__open, open);
328112918Sjeff
329112918Sjeffint
330144518Sdavidxu__open(const char *path, int flags,...)
331112918Sjeff{
332144518Sdavidxu	struct pthread *curthread = _get_curthread();
333112918Sjeff	int	ret;
334112918Sjeff	int	mode = 0;
335112918Sjeff	va_list	ap;
336112918Sjeff
337164583Sdavidxu	_thr_cancel_enter(curthread);
338112918Sjeff
339112918Sjeff	/* Check if the file is being created: */
340112918Sjeff	if (flags & O_CREAT) {
341112918Sjeff		/* Get the creation mode: */
342112918Sjeff		va_start(ap, flags);
343112918Sjeff		mode = va_arg(ap, int);
344112918Sjeff		va_end(ap);
345112918Sjeff	}
346112918Sjeff
347112918Sjeff	ret = __sys_open(path, flags, mode);
348112918Sjeff
349164583Sdavidxu	_thr_cancel_leave(curthread);
350144518Sdavidxu
351112918Sjeff	return ret;
352112918Sjeff}
353112918Sjeff
354197968Sjilles__weak_reference(__openat, openat);
355197968Sjilles
356197968Sjillesint
357197968Sjilles__openat(int fd, const char *path, int flags, ...)
358197968Sjilles{
359197968Sjilles	struct pthread *curthread = _get_curthread();
360197968Sjilles	int	ret;
361197968Sjilles	int	mode = 0;
362197968Sjilles	va_list	ap;
363197968Sjilles
364197968Sjilles	_thr_cancel_enter(curthread);
365197968Sjilles
366197968Sjilles	/* Check if the file is being created: */
367197968Sjilles	if (flags & O_CREAT) {
368197968Sjilles		/* Get the creation mode: */
369197968Sjilles		va_start(ap, flags);
370197968Sjilles		mode = va_arg(ap, int);
371197968Sjilles		va_end(ap);
372197968Sjilles	}
373197968Sjilles
374197968Sjilles	ret = __sys_openat(fd, path, flags, mode);
375197968Sjilles
376197968Sjilles	_thr_cancel_leave(curthread);
377197968Sjilles
378197968Sjilles	return ret;
379197968Sjilles}
380197968Sjilles
381144518Sdavidxu__weak_reference(__poll, poll);
382112918Sjeff
383112918Sjeffint
384144518Sdavidxu__poll(struct pollfd *fds, unsigned int nfds, int timeout)
385112918Sjeff{
386144518Sdavidxu	struct pthread *curthread = _get_curthread();
387112918Sjeff	int ret;
388112918Sjeff
389164583Sdavidxu	_thr_cancel_enter(curthread);
390112918Sjeff	ret = __sys_poll(fds, nfds, timeout);
391164583Sdavidxu	_thr_cancel_leave(curthread);
392112918Sjeff
393112918Sjeff	return ret;
394112918Sjeff}
395112918Sjeff
396160662Sdavidxu__weak_reference(___pselect, pselect);
397135301Smtm
398112918Sjeffint
399160662Sdavidxu___pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds,
400112918Sjeff	const struct timespec *timo, const sigset_t *mask)
401112918Sjeff{
402144518Sdavidxu	struct pthread *curthread = _get_curthread();
403112918Sjeff	int ret;
404112918Sjeff
405164583Sdavidxu	_thr_cancel_enter(curthread);
406198508Skib	ret = __sys_pselect(count, rfds, wfds, efds, timo, mask);
407164583Sdavidxu	_thr_cancel_leave(curthread);
408112918Sjeff
409112918Sjeff	return (ret);
410112918Sjeff}
411112918Sjeff
412144518Sdavidxu__weak_reference(__read, read);
413112918Sjeff
414112918Sjeffssize_t
415144518Sdavidxu__read(int fd, void *buf, size_t nbytes)
416112918Sjeff{
417144518Sdavidxu	struct pthread *curthread = _get_curthread();
418112918Sjeff	ssize_t	ret;
419112918Sjeff
420164583Sdavidxu	_thr_cancel_enter(curthread);
421112918Sjeff	ret = __sys_read(fd, buf, nbytes);
422164583Sdavidxu	_thr_cancel_leave(curthread);
423112918Sjeff
424112918Sjeff	return ret;
425112918Sjeff}
426112918Sjeff
427144518Sdavidxu__weak_reference(__readv, readv);
428112918Sjeff
429112918Sjeffssize_t
430144518Sdavidxu__readv(int fd, const struct iovec *iov, int iovcnt)
431112918Sjeff{
432144518Sdavidxu	struct pthread *curthread = _get_curthread();
433112918Sjeff	ssize_t ret;
434112918Sjeff
435164583Sdavidxu	_thr_cancel_enter(curthread);
436112918Sjeff	ret = __sys_readv(fd, iov, iovcnt);
437164583Sdavidxu	_thr_cancel_leave(curthread);
438112918Sjeff
439112918Sjeff	return ret;
440112918Sjeff}
441112918Sjeff
442144518Sdavidxu__weak_reference(__recvfrom, recvfrom);
443135301Smtm
444135301Smtmssize_t
445144518Sdavidxu__recvfrom(int s, void *b, size_t l, int f, struct sockaddr *from,
446135301Smtm    socklen_t *fl)
447135301Smtm{
448144518Sdavidxu	struct pthread *curthread = _get_curthread();
449135301Smtm	ssize_t ret;
450135301Smtm
451164583Sdavidxu	_thr_cancel_enter(curthread);
452135301Smtm	ret = __sys_recvfrom(s, b, l, f, from, fl);
453164583Sdavidxu	_thr_cancel_leave(curthread);
454135301Smtm	return (ret);
455135301Smtm}
456135301Smtm
457144518Sdavidxu__weak_reference(__recvmsg, recvmsg);
458135301Smtm
459135301Smtmssize_t
460144518Sdavidxu__recvmsg(int s, struct msghdr *m, int f)
461135301Smtm{
462144518Sdavidxu	struct pthread *curthread = _get_curthread();
463135301Smtm	ssize_t ret;
464135301Smtm
465164583Sdavidxu	_thr_cancel_enter(curthread);
466135301Smtm	ret = __sys_recvmsg(s, m, f);
467164583Sdavidxu	_thr_cancel_leave(curthread);
468135301Smtm	return (ret);
469135301Smtm}
470135301Smtm
471144518Sdavidxu__weak_reference(__select, select);
472112918Sjeff
473112918Sjeffint
474144518Sdavidxu__select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
475112918Sjeff	struct timeval *timeout)
476112918Sjeff{
477144518Sdavidxu	struct pthread *curthread = _get_curthread();
478112918Sjeff	int ret;
479112918Sjeff
480164583Sdavidxu	_thr_cancel_enter(curthread);
481112918Sjeff	ret = __sys_select(numfds, readfds, writefds, exceptfds, timeout);
482164583Sdavidxu	_thr_cancel_leave(curthread);
483112918Sjeff	return ret;
484112918Sjeff}
485112918Sjeff
486144518Sdavidxu__weak_reference(__sendmsg, sendmsg);
487135301Smtm
488135301Smtmssize_t
489144518Sdavidxu__sendmsg(int s, const struct msghdr *m, int f)
490135301Smtm{
491144518Sdavidxu	struct pthread *curthread = _get_curthread();
492135301Smtm	ssize_t ret;
493135301Smtm
494164583Sdavidxu	_thr_cancel_enter(curthread);
495135301Smtm	ret = __sys_sendmsg(s, m, f);
496164583Sdavidxu	_thr_cancel_leave(curthread);
497135301Smtm	return (ret);
498135301Smtm}
499135301Smtm
500144518Sdavidxu__weak_reference(__sendto, sendto);
501135301Smtm
502135301Smtmssize_t
503144518Sdavidxu__sendto(int s, const void *m, size_t l, int f, const struct sockaddr *t,
504135301Smtm    socklen_t tl)
505135301Smtm{
506144518Sdavidxu	struct pthread *curthread = _get_curthread();
507135301Smtm	ssize_t ret;
508135301Smtm
509164583Sdavidxu	_thr_cancel_enter(curthread);
510135301Smtm	ret = __sys_sendto(s, m, l, f, t, tl);
511164583Sdavidxu	_thr_cancel_leave(curthread);
512135301Smtm	return (ret);
513135301Smtm}
514135301Smtm
515160662Sdavidxu__weak_reference(___sleep, sleep);
516148658Sdeischen
517112918Sjeffunsigned int
518160662Sdavidxu___sleep(unsigned int seconds)
519112918Sjeff{
520144518Sdavidxu	struct pthread *curthread = _get_curthread();
521112918Sjeff	unsigned int	ret;
522112918Sjeff
523164583Sdavidxu	_thr_cancel_enter(curthread);
524112918Sjeff	ret = __sleep(seconds);
525164583Sdavidxu	_thr_cancel_leave(curthread);
526112918Sjeff
527144518Sdavidxu	return (ret);
528112918Sjeff}
529112918Sjeff
530160662Sdavidxu__weak_reference(___system, system);
531112918Sjeff
532112918Sjeffint
533160662Sdavidxu___system(const char *string)
534112918Sjeff{
535144518Sdavidxu	struct pthread *curthread = _get_curthread();
536112918Sjeff	int	ret;
537112918Sjeff
538164583Sdavidxu	_thr_cancel_enter(curthread);
539112918Sjeff	ret = __system(string);
540164583Sdavidxu	_thr_cancel_leave(curthread);
541112918Sjeff
542112918Sjeff	return ret;
543112918Sjeff}
544112918Sjeff
545160662Sdavidxu__weak_reference(___tcdrain, tcdrain);
546112918Sjeff
547112918Sjeffint
548160662Sdavidxu___tcdrain(int fd)
549112918Sjeff{
550144518Sdavidxu	struct pthread *curthread = _get_curthread();
551112918Sjeff	int	ret;
552112918Sjeff
553164583Sdavidxu	_thr_cancel_enter(curthread);
554112918Sjeff	ret = __tcdrain(fd);
555164583Sdavidxu	_thr_cancel_leave(curthread);
556112918Sjeff
557144518Sdavidxu	return (ret);
558112918Sjeff}
559112918Sjeff
560160662Sdavidxu__weak_reference(___usleep, usleep);
561148658Sdeischen
562148658Sdeischenint
563160662Sdavidxu___usleep(useconds_t useconds)
564148658Sdeischen{
565148658Sdeischen	struct pthread *curthread = _get_curthread();
566148658Sdeischen	int		ret;
567148658Sdeischen
568164583Sdavidxu	_thr_cancel_enter(curthread);
569148658Sdeischen	ret = __usleep(useconds);
570164583Sdavidxu	_thr_cancel_leave(curthread);
571148658Sdeischen
572148658Sdeischen	return (ret);
573148658Sdeischen}
574148658Sdeischen
575160662Sdavidxu__weak_reference(___wait, wait);
576112918Sjeff
577112918Sjeffpid_t
578160662Sdavidxu___wait(int *istat)
579112918Sjeff{
580144518Sdavidxu	struct pthread *curthread = _get_curthread();
581112918Sjeff	pid_t	ret;
582112918Sjeff
583164583Sdavidxu	_thr_cancel_enter(curthread);
584112918Sjeff	ret = __wait(istat);
585164583Sdavidxu	_thr_cancel_leave(curthread);
586112918Sjeff
587112918Sjeff	return ret;
588112918Sjeff}
589112918Sjeff
590160662Sdavidxu__weak_reference(__wait3, wait3);
591160662Sdavidxu
592160662Sdavidxupid_t
593160662Sdavidxu__wait3(int *status, int options, struct rusage *rusage)
594160662Sdavidxu{
595160662Sdavidxu	struct pthread *curthread = _get_curthread();
596160662Sdavidxu	pid_t ret;
597160662Sdavidxu
598164583Sdavidxu	_thr_cancel_enter(curthread);
599160662Sdavidxu	ret = _wait4(WAIT_ANY, status, options, rusage);
600164583Sdavidxu	_thr_cancel_leave(curthread);
601160662Sdavidxu
602160662Sdavidxu	return (ret);
603160662Sdavidxu}
604160662Sdavidxu
605144518Sdavidxu__weak_reference(__wait4, wait4);
606112918Sjeff
607112918Sjeffpid_t
608160662Sdavidxu__wait4(pid_t pid, int *status, int options, struct rusage *rusage)
609112918Sjeff{
610144518Sdavidxu	struct pthread *curthread = _get_curthread();
611112918Sjeff	pid_t ret;
612112918Sjeff
613164583Sdavidxu	_thr_cancel_enter(curthread);
614160662Sdavidxu	ret = __sys_wait4(pid, status, options, rusage);
615164583Sdavidxu	_thr_cancel_leave(curthread);
616112918Sjeff
617112918Sjeff	return ret;
618112918Sjeff}
619112918Sjeff
620160662Sdavidxu__weak_reference(___waitpid, waitpid);
621112918Sjeff
622112918Sjeffpid_t
623160662Sdavidxu___waitpid(pid_t wpid, int *status, int options)
624112918Sjeff{
625144518Sdavidxu	struct pthread *curthread = _get_curthread();
626112918Sjeff	pid_t	ret;
627112918Sjeff
628164583Sdavidxu	_thr_cancel_enter(curthread);
629112918Sjeff	ret = __waitpid(wpid, status, options);
630164583Sdavidxu	_thr_cancel_leave(curthread);
631112918Sjeff
632112918Sjeff	return ret;
633112918Sjeff}
634112918Sjeff
635144518Sdavidxu__weak_reference(__write, write);
636112918Sjeff
637112918Sjeffssize_t
638144518Sdavidxu__write(int fd, const void *buf, size_t nbytes)
639112918Sjeff{
640144518Sdavidxu	struct pthread *curthread = _get_curthread();
641112918Sjeff	ssize_t	ret;
642112918Sjeff
643164583Sdavidxu	_thr_cancel_enter(curthread);
644112918Sjeff	ret = __sys_write(fd, buf, nbytes);
645164583Sdavidxu	_thr_cancel_leave(curthread);
646112918Sjeff
647112918Sjeff	return ret;
648112918Sjeff}
649112918Sjeff
650144518Sdavidxu__weak_reference(__writev, writev);
651112918Sjeff
652112918Sjeffssize_t
653144518Sdavidxu__writev(int fd, const struct iovec *iov, int iovcnt)
654112918Sjeff{
655144518Sdavidxu	struct pthread *curthread = _get_curthread();
656112918Sjeff	ssize_t ret;
657112918Sjeff
658164583Sdavidxu	_thr_cancel_enter(curthread);
659112918Sjeff	ret = __sys_writev(fd, iov, iovcnt);
660164583Sdavidxu	_thr_cancel_leave(curthread);
661112918Sjeff
662112918Sjeff	return ret;
663112918Sjeff}
664