xref: /netbsd-src/lib/libpthread/pthread_cancelstub.c (revision a34711bbb2a3bd8d2b1d0596d5e5072162c20c55)
1*a34711bbSchristos /*	$NetBSD: pthread_cancelstub.c,v 1.45 2024/01/19 19:55:03 christos Exp $	*/
2c62a74e6Sthorpej 
3c62a74e6Sthorpej /*-
41f1ddafcSad  * Copyright (c) 2002, 2007 The NetBSD Foundation, Inc.
5c62a74e6Sthorpej  * All rights reserved.
6c62a74e6Sthorpej  *
7c62a74e6Sthorpej  * This code is derived from software contributed to The NetBSD Foundation
81f1ddafcSad  * by Nathan J. Williams and Andrew Doran.
9c62a74e6Sthorpej  *
10c62a74e6Sthorpej  * Redistribution and use in source and binary forms, with or without
11c62a74e6Sthorpej  * modification, are permitted provided that the following conditions
12c62a74e6Sthorpej  * are met:
13c62a74e6Sthorpej  * 1. Redistributions of source code must retain the above copyright
14c62a74e6Sthorpej  *    notice, this list of conditions and the following disclaimer.
15c62a74e6Sthorpej  * 2. Redistributions in binary form must reproduce the above copyright
16c62a74e6Sthorpej  *    notice, this list of conditions and the following disclaimer in the
17c62a74e6Sthorpej  *    documentation and/or other materials provided with the distribution.
18c62a74e6Sthorpej  *
19c62a74e6Sthorpej  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20c62a74e6Sthorpej  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21c62a74e6Sthorpej  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22c62a74e6Sthorpej  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23c62a74e6Sthorpej  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24c62a74e6Sthorpej  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25c62a74e6Sthorpej  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26c62a74e6Sthorpej  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27c62a74e6Sthorpej  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28c62a74e6Sthorpej  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29c62a74e6Sthorpej  * POSSIBILITY OF SUCH DAMAGE.
30c62a74e6Sthorpej  */
31c62a74e6Sthorpej 
3277abb554Sjoerg /* Disable namespace mangling, Fortification is useless here anyway. */
3377abb554Sjoerg #undef _FORTIFY_SOURCE
3477abb554Sjoerg 
35f043c0fbSlukem #include <sys/cdefs.h>
36*a34711bbSchristos __RCSID("$NetBSD: pthread_cancelstub.c,v 1.45 2024/01/19 19:55:03 christos Exp $");
377adb4107Sriastradh 
387adb4107Sriastradh /* Need to use libc-private names for atomic operations. */
397adb4107Sriastradh #include "../../common/lib/libc/atomic/atomic_op_namespace.h"
40b4c1afd4Sad 
41b4c1afd4Sad #ifndef lint
42b4c1afd4Sad 
43137c808bSthorpej 
44137c808bSthorpej /*
45363c26d4Skleink  * This is necessary because the names are always weak (they are not
46363c26d4Skleink  * POSIX functions).
47137c808bSthorpej  */
48137c808bSthorpej #define	fsync_range	_fsync_range
49363c26d4Skleink #define	pollts		_pollts
50f043c0fbSlukem 
51ebf592f1Skleink /*
52ebf592f1Skleink  * XXX this is necessary to get the prototypes for the __sigsuspend14
53ebf592f1Skleink  * XXX and __msync13 internal names, instead of the application-visible
54ebf592f1Skleink  * XXX sigsuspend and msync names. It's kind of gross, but we're pretty
55ebf592f1Skleink  * XXX intimate with libc already.
56ebf592f1Skleink  */
57ebf592f1Skleink #define __LIBC12_SOURCE__
58ebf592f1Skleink 
59c62a74e6Sthorpej #include <sys/msg.h>
60c62a74e6Sthorpej #include <sys/types.h>
61c62a74e6Sthorpej #include <sys/uio.h>
62c62a74e6Sthorpej #include <sys/wait.h>
6325e54008Srmind #include <aio.h>
6476f4f391Sagc #include <errno.h>
65c62a74e6Sthorpej #include <fcntl.h>
6625e54008Srmind #include <mqueue.h>
67c62a74e6Sthorpej #include <poll.h>
68c62a74e6Sthorpej #include <stdarg.h>
69c62a74e6Sthorpej #include <unistd.h>
70c62a74e6Sthorpej 
71c62a74e6Sthorpej #include <signal.h>
72c62a74e6Sthorpej #include <sys/mman.h>
7334579587Skleink #include <sys/select.h>
7405a75544Snathanw #include <sys/socket.h>
75f6cf4693Schristos #include <sys/event.h>
76*a34711bbSchristos #include <sys/resource.h>
77c62a74e6Sthorpej 
78f1cc481dSchristos #include <compat/sys/mman.h>
79461a86f9Schristos #include <compat/sys/poll.h>
80461a86f9Schristos #include <compat/sys/select.h>
81f6cf4693Schristos #include <compat/sys/event.h>
82461a86f9Schristos #include <compat/sys/wait.h>
83*a34711bbSchristos #include <compat/sys/resource.h>
84461a86f9Schristos #include <compat/include/mqueue.h>
85461a86f9Schristos #include <compat/include/signal.h>
86f1cc481dSchristos 
87c62a74e6Sthorpej #include "pthread.h"
88c62a74e6Sthorpej #include "pthread_int.h"
8971d484f9Schristos #include "reentrant.h"
90c62a74e6Sthorpej 
91ebf592f1Skleink int	pthread__cancel_stub_binder;
92ebf592f1Skleink 
9305a75544Snathanw int	_sys_accept(int, struct sockaddr *, socklen_t *);
94461a86f9Schristos int	_sys___aio_suspend50(const struct aiocb * const [], int,
95461a86f9Schristos 	    const struct timespec *);
96461a86f9Schristos int	__aio_suspend50(const struct aiocb * const [], int,
9725e54008Srmind 	    const struct timespec *);
980d258229Schristos int	_sys_clock_nanosleep(clockid_t clock_id, int flags,
990d258229Schristos 		   const struct timespec *rqtp, struct timespec *rmtp);
100c62a74e6Sthorpej int	_sys_close(int);
10105a75544Snathanw int	_sys_connect(int, const struct sockaddr *, socklen_t);
102c62a74e6Sthorpej int	_sys_fcntl(int, int, ...);
1036b3fbf5dSkleink int	_sys_fdatasync(int);
104c62a74e6Sthorpej int	_sys_fsync(int);
105137c808bSthorpej int	_sys_fsync_range(int, int, off_t, off_t);
106d11110f4Schristos int	_sys___kevent100(int, const struct kevent *, size_t, struct kevent *,
107f6cf4693Schristos 	    size_t, const struct timespec *);
10825e54008Srmind int	_sys_mq_send(mqd_t, const char *, size_t, unsigned);
10925e54008Srmind ssize_t	_sys_mq_receive(mqd_t, char *, size_t, unsigned *);
110461a86f9Schristos int	_sys___mq_timedsend50(mqd_t, const char *, size_t, unsigned,
11125e54008Srmind 	    const struct timespec *);
112461a86f9Schristos ssize_t	_sys___mq_timedreceive50(mqd_t, char *, size_t, unsigned *,
11325e54008Srmind 	    const struct timespec *);
114c62a74e6Sthorpej ssize_t	_sys_msgrcv(int, void *, size_t, long, int);
115c62a74e6Sthorpej int	_sys_msgsnd(int, const void *, size_t, int);
116c62a74e6Sthorpej int	_sys___msync13(void *, size_t, int);
117cc63c840Senami int	_sys___nanosleep50(const struct timespec *, struct timespec *);
118cc63c840Senami int	__nanosleep50(const struct timespec *, struct timespec *);
119c62a74e6Sthorpej int	_sys_open(const char *, int, ...);
1200d258229Schristos int	_sys_openat(int, const char *, int, ...);
121c62a74e6Sthorpej int	_sys_poll(struct pollfd *, nfds_t, int);
122461a86f9Schristos int	_sys___pollts50(struct pollfd *, nfds_t, const struct timespec *,
123363c26d4Skleink 	    const sigset_t *);
124c62a74e6Sthorpej ssize_t	_sys_pread(int, void *, size_t, off_t);
125461a86f9Schristos int	_sys___pselect50(int, fd_set *, fd_set *, fd_set *,
126363c26d4Skleink 	    const struct timespec *, const sigset_t *);
127c62a74e6Sthorpej ssize_t	_sys_pwrite(int, const void *, size_t, off_t);
128c62a74e6Sthorpej ssize_t	_sys_read(int, void *, size_t);
129c62a74e6Sthorpej ssize_t	_sys_readv(int, const struct iovec *, int);
1300d258229Schristos ssize_t	_sys_recvfrom(int, void * restrict, size_t, int,
1310d258229Schristos     struct sockaddr * restrict, socklen_t * restrict);
1320d258229Schristos ssize_t _sys_recvmsg(int, struct msghdr *, int);
1330d258229Schristos int _sys_recvmmsg(int, struct mmsghdr *, unsigned int, unsigned int,
1340d258229Schristos     struct timespec *);
135a8d8435dSchristos ssize_t _sys_sendto(int, const void *, size_t, int, const struct sockaddr *,
136a8d8435dSchristos     socklen_t);
137a8d8435dSchristos ssize_t _sys_sendmsg(int, const struct msghdr *, int);
138a8d8435dSchristos int _sys_sendmmsg(int, struct mmsghdr *, unsigned int, unsigned int);
139461a86f9Schristos int	_sys___select50(int, fd_set *, fd_set *, fd_set *, struct timeval *);
140461a86f9Schristos int	_sys___wait450(pid_t, int *, int, struct rusage *);
141c62a74e6Sthorpej ssize_t	_sys_write(int, const void *, size_t);
142c62a74e6Sthorpej ssize_t	_sys_writev(int, const struct iovec *, int);
1431f1ddafcSad int	_sys___sigsuspend14(const sigset_t *);
1446343ca25Schristos int	____sigtimedwait50(const sigset_t * __restrict, siginfo_t * __restrict,
1456343ca25Schristos 	    struct timespec * __restrict);
1461f1ddafcSad int	__sigsuspend14(const sigset_t *);
147c62a74e6Sthorpej 
148cdf7f99eSnathanw #define TESTCANCEL(id) 	do {						\
14971d484f9Schristos 	if (__predict_true(!__uselibcstub) &&				\
15071d484f9Schristos 	    __predict_false((id)->pt_cancel))				\
151622bbc50Sad 		pthread__cancelled();					\
152388550b0Srillig 	} while (0)
153cdf7f99eSnathanw 
154c62a74e6Sthorpej 
155c62a74e6Sthorpej int
accept(int s,struct sockaddr * addr,socklen_t * addrlen)15605a75544Snathanw accept(int s, struct sockaddr *addr, socklen_t *addrlen)
15705a75544Snathanw {
15805a75544Snathanw 	int retval;
15905a75544Snathanw 	pthread_t self;
16005a75544Snathanw 
16105a75544Snathanw 	self = pthread__self();
162cdf7f99eSnathanw 	TESTCANCEL(self);
16305a75544Snathanw 	retval = _sys_accept(s, addr, addrlen);
164cdf7f99eSnathanw 	TESTCANCEL(self);
16505a75544Snathanw 
16605a75544Snathanw 	return retval;
16705a75544Snathanw }
16805a75544Snathanw 
16905a75544Snathanw int
__aio_suspend50(const struct aiocb * const list[],int nent,const struct timespec * timeout)170461a86f9Schristos __aio_suspend50(const struct aiocb * const list[], int nent,
171fdc51b51Sad     const struct timespec *timeout)
172fdc51b51Sad {
173fdc51b51Sad 	int retval;
174fdc51b51Sad 	pthread_t self;
175fdc51b51Sad 
176fdc51b51Sad 	self = pthread__self();
177fdc51b51Sad 	TESTCANCEL(self);
178461a86f9Schristos 	retval = _sys___aio_suspend50(list, nent, timeout);
179fdc51b51Sad 	TESTCANCEL(self);
180fdc51b51Sad 
181fdc51b51Sad 	return retval;
182fdc51b51Sad }
183fdc51b51Sad 
184fdc51b51Sad int
__kevent100(int fd,const struct kevent * ev,size_t nev,struct kevent * rev,size_t nrev,const struct timespec * ts)185d11110f4Schristos __kevent100(int fd, const struct kevent *ev, size_t nev, struct kevent *rev,
186f6cf4693Schristos     size_t nrev, const struct timespec *ts)
187f6cf4693Schristos {
188f6cf4693Schristos 	int retval;
189f6cf4693Schristos 	pthread_t self;
190f6cf4693Schristos 
191f6cf4693Schristos 	self = pthread__self();
192f6cf4693Schristos 	TESTCANCEL(self);
193d11110f4Schristos 	retval = _sys___kevent100(fd, ev, nev, rev, nrev, ts);
194f6cf4693Schristos 	TESTCANCEL(self);
195f6cf4693Schristos 
196f6cf4693Schristos 	return retval;
197f6cf4693Schristos }
198f6cf4693Schristos 
199f6cf4693Schristos int
clock_nanosleep(clockid_t clock_id,int flags,const struct timespec * rqtp,struct timespec * rmtp)2000d258229Schristos clock_nanosleep(clockid_t clock_id, int flags,
2010d258229Schristos     const struct timespec *rqtp, struct timespec *rmtp)
2020d258229Schristos {
2030d258229Schristos 	int retval;
2040d258229Schristos 	pthread_t self;
2050d258229Schristos 
2060d258229Schristos 	self = pthread__self();
2070d258229Schristos 	TESTCANCEL(self);
2080d258229Schristos 	retval = _sys_clock_nanosleep(clock_id, flags, rqtp, rmtp);
2090d258229Schristos 	TESTCANCEL(self);
2100d258229Schristos 
2110d258229Schristos 	return retval;
2120d258229Schristos }
2130d258229Schristos 
2140d258229Schristos int
close(int d)215c62a74e6Sthorpej close(int d)
216c62a74e6Sthorpej {
217c62a74e6Sthorpej 	int retval;
218c62a74e6Sthorpej 	pthread_t self;
219c62a74e6Sthorpej 
220c62a74e6Sthorpej 	self = pthread__self();
221cdf7f99eSnathanw 	TESTCANCEL(self);
222c62a74e6Sthorpej 	retval = _sys_close(d);
223cdf7f99eSnathanw 	TESTCANCEL(self);
224c62a74e6Sthorpej 
225c62a74e6Sthorpej 	return retval;
226c62a74e6Sthorpej }
227c62a74e6Sthorpej 
228c62a74e6Sthorpej int
connect(int s,const struct sockaddr * addr,socklen_t namelen)22905a75544Snathanw connect(int s, const struct sockaddr *addr, socklen_t namelen)
23005a75544Snathanw {
23105a75544Snathanw 	int retval;
23205a75544Snathanw 	pthread_t self;
23305a75544Snathanw 
23405a75544Snathanw 	self = pthread__self();
235cdf7f99eSnathanw 	TESTCANCEL(self);
23605a75544Snathanw 	retval = _sys_connect(s, addr, namelen);
237cdf7f99eSnathanw 	TESTCANCEL(self);
23805a75544Snathanw 
23905a75544Snathanw 	return retval;
24005a75544Snathanw }
24105a75544Snathanw 
24205a75544Snathanw int
fcntl(int fd,int cmd,...)243c62a74e6Sthorpej fcntl(int fd, int cmd, ...)
244c62a74e6Sthorpej {
245c62a74e6Sthorpej 	int retval;
246c62a74e6Sthorpej 	pthread_t self;
247c62a74e6Sthorpej 	va_list ap;
248c62a74e6Sthorpej 
249c62a74e6Sthorpej 	self = pthread__self();
250cdf7f99eSnathanw 	TESTCANCEL(self);
251c62a74e6Sthorpej 	va_start(ap, cmd);
252c62a74e6Sthorpej 	retval = _sys_fcntl(fd, cmd, va_arg(ap, void *));
253c62a74e6Sthorpej 	va_end(ap);
254cdf7f99eSnathanw 	TESTCANCEL(self);
255c62a74e6Sthorpej 
256c62a74e6Sthorpej 	return retval;
257c62a74e6Sthorpej }
258c62a74e6Sthorpej 
259c62a74e6Sthorpej int
fdatasync(int d)2606b3fbf5dSkleink fdatasync(int d)
2616b3fbf5dSkleink {
2626b3fbf5dSkleink 	int retval;
2636b3fbf5dSkleink 	pthread_t self;
2646b3fbf5dSkleink 
2656b3fbf5dSkleink 	self = pthread__self();
2666b3fbf5dSkleink 	TESTCANCEL(self);
2676b3fbf5dSkleink 	retval = _sys_fdatasync(d);
2686b3fbf5dSkleink 	TESTCANCEL(self);
2696b3fbf5dSkleink 
2706b3fbf5dSkleink 	return retval;
2716b3fbf5dSkleink }
2726b3fbf5dSkleink 
2736b3fbf5dSkleink int
fsync(int d)274c62a74e6Sthorpej fsync(int d)
275c62a74e6Sthorpej {
276c62a74e6Sthorpej 	int retval;
277c62a74e6Sthorpej 	pthread_t self;
278c62a74e6Sthorpej 
279c62a74e6Sthorpej 	self = pthread__self();
280cdf7f99eSnathanw 	TESTCANCEL(self);
281c62a74e6Sthorpej 	retval = _sys_fsync(d);
282cdf7f99eSnathanw 	TESTCANCEL(self);
283c62a74e6Sthorpej 
284c62a74e6Sthorpej 	return retval;
285c62a74e6Sthorpej }
286c62a74e6Sthorpej 
287137c808bSthorpej int
fsync_range(int d,int f,off_t s,off_t e)288137c808bSthorpej fsync_range(int d, int f, off_t s, off_t e)
289137c808bSthorpej {
290137c808bSthorpej 	int retval;
291137c808bSthorpej 	pthread_t self;
292137c808bSthorpej 
293137c808bSthorpej 	self = pthread__self();
294cdf7f99eSnathanw 	TESTCANCEL(self);
295137c808bSthorpej 	retval = _sys_fsync_range(d, f, s, e);
296cdf7f99eSnathanw 	TESTCANCEL(self);
297137c808bSthorpej 
298137c808bSthorpej 	return retval;
299137c808bSthorpej }
300137c808bSthorpej 
301fdc51b51Sad int
mq_send(mqd_t mqdes,const char * msg_ptr,size_t msg_len,unsigned msg_prio)302fdc51b51Sad mq_send(mqd_t mqdes, const char *msg_ptr, size_t msg_len, unsigned msg_prio)
303fdc51b51Sad {
304fdc51b51Sad 	int retval;
305fdc51b51Sad 	pthread_t self;
306fdc51b51Sad 
307fdc51b51Sad 	self = pthread__self();
308fdc51b51Sad 	TESTCANCEL(self);
309fdc51b51Sad 	retval = _sys_mq_send(mqdes, msg_ptr, msg_len, msg_prio);
310fdc51b51Sad 	TESTCANCEL(self);
311fdc51b51Sad 
312fdc51b51Sad 	return retval;
313fdc51b51Sad }
314fdc51b51Sad 
315fdc51b51Sad ssize_t
mq_receive(mqd_t mqdes,char * msg_ptr,size_t msg_len,unsigned * msg_prio)316fdc51b51Sad mq_receive(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio)
317fdc51b51Sad {
318fdc51b51Sad 	ssize_t retval;
319fdc51b51Sad 	pthread_t self;
320fdc51b51Sad 
321fdc51b51Sad 	self = pthread__self();
322fdc51b51Sad 	TESTCANCEL(self);
323fdc51b51Sad 	retval = _sys_mq_receive(mqdes, msg_ptr, msg_len, msg_prio);
324fdc51b51Sad 	TESTCANCEL(self);
325fdc51b51Sad 
326fdc51b51Sad 	return retval;
327fdc51b51Sad }
328fdc51b51Sad 
329fdc51b51Sad int
__mq_timedsend50(mqd_t mqdes,const char * msg_ptr,size_t msg_len,unsigned msg_prio,const struct timespec * abst)330461a86f9Schristos __mq_timedsend50(mqd_t mqdes, const char *msg_ptr, size_t msg_len,
331fdc51b51Sad     unsigned msg_prio, const struct timespec *abst)
332fdc51b51Sad {
333fdc51b51Sad 	int retval;
334fdc51b51Sad 	pthread_t self;
335fdc51b51Sad 
336fdc51b51Sad 	self = pthread__self();
337fdc51b51Sad 	TESTCANCEL(self);
338461a86f9Schristos 	retval = _sys___mq_timedsend50(mqdes, msg_ptr, msg_len, msg_prio, abst);
339fdc51b51Sad 	TESTCANCEL(self);
340fdc51b51Sad 
341fdc51b51Sad 	return retval;
342fdc51b51Sad }
343fdc51b51Sad 
344fdc51b51Sad ssize_t
__mq_timedreceive50(mqd_t mqdes,char * msg_ptr,size_t msg_len,unsigned * msg_prio,const struct timespec * abst)345461a86f9Schristos __mq_timedreceive50(mqd_t mqdes, char *msg_ptr, size_t msg_len, unsigned *msg_prio,
346fdc51b51Sad     const struct timespec *abst)
347fdc51b51Sad {
348fdc51b51Sad 	ssize_t retval;
349fdc51b51Sad 	pthread_t self;
350fdc51b51Sad 
351fdc51b51Sad 	self = pthread__self();
352fdc51b51Sad 	TESTCANCEL(self);
353461a86f9Schristos 	retval = _sys___mq_timedreceive50(mqdes, msg_ptr, msg_len, msg_prio, abst);
354fdc51b51Sad 	TESTCANCEL(self);
355fdc51b51Sad 
356fdc51b51Sad 	return retval;
357fdc51b51Sad }
358fdc51b51Sad 
359c62a74e6Sthorpej ssize_t
msgrcv(int msgid,void * msgp,size_t msgsz,long msgtyp,int msgflg)360c62a74e6Sthorpej msgrcv(int msgid, void *msgp, size_t msgsz, long msgtyp, int msgflg)
361c62a74e6Sthorpej {
362c62a74e6Sthorpej 	ssize_t retval;
363c62a74e6Sthorpej 	pthread_t self;
364c62a74e6Sthorpej 
365c62a74e6Sthorpej 	self = pthread__self();
366cdf7f99eSnathanw 	TESTCANCEL(self);
367c62a74e6Sthorpej 	retval = _sys_msgrcv(msgid, msgp, msgsz, msgtyp, msgflg);
368cdf7f99eSnathanw 	TESTCANCEL(self);
369c62a74e6Sthorpej 
370c62a74e6Sthorpej 	return retval;
371c62a74e6Sthorpej }
372c62a74e6Sthorpej 
373c62a74e6Sthorpej int
msgsnd(int msgid,const void * msgp,size_t msgsz,int msgflg)374c62a74e6Sthorpej msgsnd(int msgid, const void *msgp, size_t msgsz, int msgflg)
375c62a74e6Sthorpej {
376c62a74e6Sthorpej 	int retval;
377c62a74e6Sthorpej 	pthread_t self;
378c62a74e6Sthorpej 
379c62a74e6Sthorpej 	self = pthread__self();
380cdf7f99eSnathanw 	TESTCANCEL(self);
381c62a74e6Sthorpej 	retval = _sys_msgsnd(msgid, msgp, msgsz, msgflg);
382cdf7f99eSnathanw 	TESTCANCEL(self);
383c62a74e6Sthorpej 
384c62a74e6Sthorpej 	return retval;
385c62a74e6Sthorpej }
386c62a74e6Sthorpej 
387c62a74e6Sthorpej int
__msync13(void * addr,size_t len,int flags)388c62a74e6Sthorpej __msync13(void *addr, size_t len, int flags)
389c62a74e6Sthorpej {
390c62a74e6Sthorpej 	int retval;
391c62a74e6Sthorpej 	pthread_t self;
392c62a74e6Sthorpej 
393c62a74e6Sthorpej 	self = pthread__self();
394cdf7f99eSnathanw 	TESTCANCEL(self);
395c62a74e6Sthorpej 	retval = _sys___msync13(addr, len, flags);
396cdf7f99eSnathanw 	TESTCANCEL(self);
397c62a74e6Sthorpej 
398c62a74e6Sthorpej 	return retval;
399c62a74e6Sthorpej }
400c62a74e6Sthorpej 
401c62a74e6Sthorpej int
open(const char * path,int flags,...)402c62a74e6Sthorpej open(const char *path, int flags, ...)
403c62a74e6Sthorpej {
404c62a74e6Sthorpej 	int retval;
405c62a74e6Sthorpej 	pthread_t self;
406c62a74e6Sthorpej 	va_list ap;
407c62a74e6Sthorpej 
408c62a74e6Sthorpej 	self = pthread__self();
409cdf7f99eSnathanw 	TESTCANCEL(self);
410c62a74e6Sthorpej 	va_start(ap, flags);
411c62a74e6Sthorpej 	retval = _sys_open(path, flags, va_arg(ap, mode_t));
412c62a74e6Sthorpej 	va_end(ap);
413cdf7f99eSnathanw 	TESTCANCEL(self);
414c62a74e6Sthorpej 
415c62a74e6Sthorpej 	return retval;
416c62a74e6Sthorpej }
417c62a74e6Sthorpej 
418c62a74e6Sthorpej int
openat(int fd,const char * path,int flags,...)4190d258229Schristos openat(int fd, const char *path, int flags, ...)
4200d258229Schristos {
4210d258229Schristos 	int retval;
4220d258229Schristos 	pthread_t self;
4230d258229Schristos 	va_list ap;
4240d258229Schristos 
4250d258229Schristos 	self = pthread__self();
4260d258229Schristos 	TESTCANCEL(self);
4270d258229Schristos 	va_start(ap, flags);
4280d258229Schristos 	retval = _sys_openat(fd, path, flags, va_arg(ap, mode_t));
4290d258229Schristos 	va_end(ap);
4300d258229Schristos 	TESTCANCEL(self);
4310d258229Schristos 
4320d258229Schristos 	return retval;
4330d258229Schristos }
4340d258229Schristos 
4350d258229Schristos int
__nanosleep50(const struct timespec * rqtp,struct timespec * rmtp)436cc63c840Senami __nanosleep50(const struct timespec *rqtp, struct timespec *rmtp)
437cc63c840Senami {
438cc63c840Senami 	int retval;
439cc63c840Senami 	pthread_t self;
440cc63c840Senami 
441cc63c840Senami 	self = pthread__self();
442cc63c840Senami 	TESTCANCEL(self);
443cc63c840Senami 	/*
444cc63c840Senami 	 * For now, just nanosleep.  In the future, maybe pass a ucontext_t
445cc63c840Senami 	 * to _lwp_nanosleep() and allow it to recycle our kernel stack.
446cc63c840Senami 	 */
447cc63c840Senami 	retval = _sys___nanosleep50(rqtp, rmtp);
448cc63c840Senami 	TESTCANCEL(self);
449cc63c840Senami 
450cc63c840Senami 	return retval;
451cc63c840Senami }
452cc63c840Senami 
453cc63c840Senami int
poll(struct pollfd * fds,nfds_t nfds,int timeout)454c62a74e6Sthorpej poll(struct pollfd *fds, nfds_t nfds, int timeout)
455c62a74e6Sthorpej {
456c62a74e6Sthorpej 	int retval;
457c62a74e6Sthorpej 	pthread_t self;
458c62a74e6Sthorpej 
459c62a74e6Sthorpej 	self = pthread__self();
460cdf7f99eSnathanw 	TESTCANCEL(self);
461c62a74e6Sthorpej 	retval = _sys_poll(fds, nfds, timeout);
462cdf7f99eSnathanw 	TESTCANCEL(self);
463c62a74e6Sthorpej 
464c62a74e6Sthorpej 	return retval;
465c62a74e6Sthorpej }
466c62a74e6Sthorpej 
467363c26d4Skleink int
__pollts50(struct pollfd * fds,nfds_t nfds,const struct timespec * ts,const sigset_t * sigmask)468461a86f9Schristos __pollts50(struct pollfd *fds, nfds_t nfds, const struct timespec *ts,
469363c26d4Skleink     const sigset_t *sigmask)
470363c26d4Skleink {
471363c26d4Skleink 	int retval;
472363c26d4Skleink 	pthread_t self;
473363c26d4Skleink 
474363c26d4Skleink 	self = pthread__self();
475363c26d4Skleink 	TESTCANCEL(self);
476461a86f9Schristos 	retval = _sys___pollts50(fds, nfds, ts, sigmask);
477363c26d4Skleink 	TESTCANCEL(self);
478363c26d4Skleink 
479363c26d4Skleink 	return retval;
480363c26d4Skleink }
481363c26d4Skleink 
482c62a74e6Sthorpej ssize_t
pread(int d,void * buf,size_t nbytes,off_t offset)483c62a74e6Sthorpej pread(int d, void *buf, size_t nbytes, off_t offset)
484c62a74e6Sthorpej {
485c62a74e6Sthorpej 	ssize_t retval;
486c62a74e6Sthorpej 	pthread_t self;
487c62a74e6Sthorpej 
488c62a74e6Sthorpej 	self = pthread__self();
489cdf7f99eSnathanw 	TESTCANCEL(self);
490c62a74e6Sthorpej 	retval = _sys_pread(d, buf, nbytes, offset);
491cdf7f99eSnathanw 	TESTCANCEL(self);
492c62a74e6Sthorpej 
493c62a74e6Sthorpej 	return retval;
494c62a74e6Sthorpej }
495c62a74e6Sthorpej 
496363c26d4Skleink int
__pselect50(int nfds,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,const struct timespec * timeout,const sigset_t * sigmask)497461a86f9Schristos __pselect50(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
498363c26d4Skleink     const struct timespec *timeout, const sigset_t *sigmask)
499363c26d4Skleink {
500363c26d4Skleink 	int retval;
501363c26d4Skleink 	pthread_t self;
502363c26d4Skleink 
503363c26d4Skleink 	self = pthread__self();
504363c26d4Skleink 	TESTCANCEL(self);
505461a86f9Schristos 	retval = _sys___pselect50(nfds, readfds, writefds, exceptfds, timeout,
506363c26d4Skleink 	    sigmask);
507363c26d4Skleink 	TESTCANCEL(self);
508363c26d4Skleink 
509363c26d4Skleink 	return retval;
510363c26d4Skleink }
511363c26d4Skleink 
512c62a74e6Sthorpej ssize_t
pwrite(int d,const void * buf,size_t nbytes,off_t offset)513c62a74e6Sthorpej pwrite(int d, const void *buf, size_t nbytes, off_t offset)
514c62a74e6Sthorpej {
515c62a74e6Sthorpej 	ssize_t retval;
516c62a74e6Sthorpej 	pthread_t self;
517c62a74e6Sthorpej 
518c62a74e6Sthorpej 	self = pthread__self();
519cdf7f99eSnathanw 	TESTCANCEL(self);
520c62a74e6Sthorpej 	retval = _sys_pwrite(d, buf, nbytes, offset);
521cdf7f99eSnathanw 	TESTCANCEL(self);
522c62a74e6Sthorpej 
523c62a74e6Sthorpej 	return retval;
524c62a74e6Sthorpej }
525c62a74e6Sthorpej 
526c62a74e6Sthorpej ssize_t
read(int d,void * buf,size_t nbytes)5275c288750Sjoerg read(int d, void *buf, size_t nbytes)
5285c288750Sjoerg {
5295c288750Sjoerg 	ssize_t retval;
5305c288750Sjoerg 	pthread_t self;
5315c288750Sjoerg 
5325c288750Sjoerg 	self = pthread__self();
5335c288750Sjoerg 	TESTCANCEL(self);
5345c288750Sjoerg 	retval = _sys_read(d, buf, nbytes);
5355c288750Sjoerg 	TESTCANCEL(self);
5365c288750Sjoerg 
5375c288750Sjoerg 	return retval;
5385c288750Sjoerg }
5395c288750Sjoerg 
5405c288750Sjoerg ssize_t
readv(int d,const struct iovec * iov,int iovcnt)541c62a74e6Sthorpej readv(int d, const struct iovec *iov, int iovcnt)
542c62a74e6Sthorpej {
543c62a74e6Sthorpej 	ssize_t retval;
544c62a74e6Sthorpej 	pthread_t self;
545c62a74e6Sthorpej 
546c62a74e6Sthorpej 	self = pthread__self();
547cdf7f99eSnathanw 	TESTCANCEL(self);
548c62a74e6Sthorpej 	retval = _sys_readv(d, iov, iovcnt);
549cdf7f99eSnathanw 	TESTCANCEL(self);
550c62a74e6Sthorpej 
551c62a74e6Sthorpej 	return retval;
552c62a74e6Sthorpej }
553c62a74e6Sthorpej 
5540d258229Schristos ssize_t
recvfrom(int s,void * restrict buf,size_t len,int flags,struct sockaddr * restrict from,socklen_t * restrict fromlen)5550d258229Schristos recvfrom(int s, void * restrict buf, size_t len, int flags,
5560d258229Schristos     struct sockaddr * restrict from, socklen_t * restrict fromlen)
5570d258229Schristos {
5580d258229Schristos 	ssize_t retval;
5590d258229Schristos 	pthread_t self;
5600d258229Schristos 
5610d258229Schristos 	self = pthread__self();
5620d258229Schristos 	TESTCANCEL(self);
5630d258229Schristos 	retval = _sys_recvfrom(s, buf, len, flags, from, fromlen);
5640d258229Schristos 	TESTCANCEL(self);
5650d258229Schristos 
5660d258229Schristos 	return retval;
5670d258229Schristos }
5680d258229Schristos 
5690d258229Schristos ssize_t
recvmsg(int s,struct msghdr * msg,int flags)5700d258229Schristos recvmsg(int s, struct msghdr *msg, int flags)
5710d258229Schristos {
5720d258229Schristos 	ssize_t retval;
5730d258229Schristos 	pthread_t self;
5740d258229Schristos 
5750d258229Schristos 	self = pthread__self();
5760d258229Schristos 	TESTCANCEL(self);
5770d258229Schristos 	retval = _sys_recvmsg(s, msg, flags);
5780d258229Schristos 	TESTCANCEL(self);
5790d258229Schristos 
5800d258229Schristos 	return retval;
5810d258229Schristos }
5820d258229Schristos 
5830d258229Schristos int
recvmmsg(int s,struct mmsghdr * mmsg,unsigned int vlen,unsigned int flags,struct timespec * timeout)5840d258229Schristos recvmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen,
5850d258229Schristos     unsigned int flags, struct timespec *timeout)
5860d258229Schristos {
5870d258229Schristos 	ssize_t retval;
5880d258229Schristos 	pthread_t self;
5890d258229Schristos 
5900d258229Schristos 	self = pthread__self();
5910d258229Schristos 	TESTCANCEL(self);
5920d258229Schristos 	retval = _sys_recvmmsg(s, mmsg, vlen, flags, timeout);
5930d258229Schristos 	TESTCANCEL(self);
5940d258229Schristos 
5950d258229Schristos 	return retval;
5960d258229Schristos }
5970d258229Schristos 
598c62a74e6Sthorpej int
__select50(int nfds,fd_set * readfds,fd_set * writefds,fd_set * exceptfds,struct timeval * timeout)599461a86f9Schristos __select50(int nfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds,
600c62a74e6Sthorpej     struct timeval *timeout)
601c62a74e6Sthorpej {
602c62a74e6Sthorpej 	int retval;
603c62a74e6Sthorpej 	pthread_t self;
604c62a74e6Sthorpej 
605c62a74e6Sthorpej 	self = pthread__self();
606cdf7f99eSnathanw 	TESTCANCEL(self);
607461a86f9Schristos 	retval = _sys___select50(nfds, readfds, writefds, exceptfds, timeout);
608cdf7f99eSnathanw 	TESTCANCEL(self);
609c62a74e6Sthorpej 
610c62a74e6Sthorpej 	return retval;
611c62a74e6Sthorpej }
612c62a74e6Sthorpej 
6130d258229Schristos ssize_t
sendto(int s,const void * msg,size_t len,int flags,const struct sockaddr * to,socklen_t tolen)6140d258229Schristos sendto(int s, const void *msg, size_t len, int flags,
6150d258229Schristos     const struct sockaddr *to, socklen_t tolen)
6160d258229Schristos {
6170d258229Schristos 	int retval;
6180d258229Schristos 	pthread_t self;
6190d258229Schristos 
6200d258229Schristos 	self = pthread__self();
6210d258229Schristos 	TESTCANCEL(self);
6220d258229Schristos 	retval = _sys_sendto(s, msg, len, flags, to, tolen);
6230d258229Schristos 	TESTCANCEL(self);
6240d258229Schristos 
6250d258229Schristos 	return retval;
6260d258229Schristos }
6270d258229Schristos 
6280d258229Schristos ssize_t
sendmsg(int s,const struct msghdr * msg,int flags)6290d258229Schristos sendmsg(int s, const struct msghdr *msg, int flags)
6300d258229Schristos {
6310d258229Schristos 	int retval;
6320d258229Schristos 	pthread_t self;
6330d258229Schristos 
6340d258229Schristos 	self = pthread__self();
6350d258229Schristos 	TESTCANCEL(self);
6360d258229Schristos 	retval = _sys_sendmsg(s, msg, flags);
6370d258229Schristos 	TESTCANCEL(self);
6380d258229Schristos 
6390d258229Schristos 	return retval;
6400d258229Schristos }
6410d258229Schristos 
6420d258229Schristos int
sendmmsg(int s,struct mmsghdr * mmsg,unsigned int vlen,unsigned int flags)6430d258229Schristos sendmmsg(int s, struct mmsghdr *mmsg, unsigned int vlen,
6440d258229Schristos     unsigned int flags)
6450d258229Schristos {
6460d258229Schristos 	int retval;
6470d258229Schristos 	pthread_t self;
6480d258229Schristos 
6490d258229Schristos 	self = pthread__self();
6500d258229Schristos 	TESTCANCEL(self);
6510d258229Schristos 	retval = _sys_sendmmsg(s, mmsg, vlen, flags);
6520d258229Schristos 	TESTCANCEL(self);
6530d258229Schristos 
6540d258229Schristos 	return retval;
6550d258229Schristos }
6560d258229Schristos 
6570d258229Schristos 
658c62a74e6Sthorpej pid_t
__wait450(pid_t wpid,int * status,int options,struct rusage * rusage)659461a86f9Schristos __wait450(pid_t wpid, int *status, int options, struct rusage *rusage)
660c62a74e6Sthorpej {
661c62a74e6Sthorpej 	pid_t retval;
662c62a74e6Sthorpej 	pthread_t self;
663c62a74e6Sthorpej 
664c62a74e6Sthorpej 	self = pthread__self();
665cdf7f99eSnathanw 	TESTCANCEL(self);
666461a86f9Schristos 	retval = _sys___wait450(wpid, status, options, rusage);
667cdf7f99eSnathanw 	TESTCANCEL(self);
668c62a74e6Sthorpej 
669c62a74e6Sthorpej 	return retval;
670c62a74e6Sthorpej }
671c62a74e6Sthorpej 
672c62a74e6Sthorpej ssize_t
write(int d,const void * buf,size_t nbytes)673c62a74e6Sthorpej write(int d, const void *buf, size_t nbytes)
674c62a74e6Sthorpej {
675c62a74e6Sthorpej 	ssize_t retval;
676c62a74e6Sthorpej 	pthread_t self;
677c62a74e6Sthorpej 
678c62a74e6Sthorpej 	self = pthread__self();
679cdf7f99eSnathanw 	TESTCANCEL(self);
680c62a74e6Sthorpej 	retval = _sys_write(d, buf, nbytes);
681cdf7f99eSnathanw 	TESTCANCEL(self);
682c62a74e6Sthorpej 
683c62a74e6Sthorpej 	return retval;
684c62a74e6Sthorpej }
685c62a74e6Sthorpej 
686c62a74e6Sthorpej ssize_t
writev(int d,const struct iovec * iov,int iovcnt)687c62a74e6Sthorpej writev(int d, const struct iovec *iov, int iovcnt)
688c62a74e6Sthorpej {
689c62a74e6Sthorpej 	ssize_t retval;
690c62a74e6Sthorpej 	pthread_t self;
691c62a74e6Sthorpej 
692c62a74e6Sthorpej 	self = pthread__self();
693cdf7f99eSnathanw 	TESTCANCEL(self);
694c62a74e6Sthorpej 	retval = _sys_writev(d, iov, iovcnt);
695cdf7f99eSnathanw 	TESTCANCEL(self);
696c62a74e6Sthorpej 
697c62a74e6Sthorpej 	return retval;
698c62a74e6Sthorpej }
699c62a74e6Sthorpej 
7001f1ddafcSad int
__sigsuspend14(const sigset_t * sigmask)7011f1ddafcSad __sigsuspend14(const sigset_t *sigmask)
7021f1ddafcSad {
7031f1ddafcSad 	pthread_t self;
7041f1ddafcSad 	int retval;
7051f1ddafcSad 
7061f1ddafcSad 	self = pthread__self();
7071f1ddafcSad 	TESTCANCEL(self);
7081f1ddafcSad 	retval = _sys___sigsuspend14(sigmask);
7091f1ddafcSad 	TESTCANCEL(self);
7101f1ddafcSad 
7111f1ddafcSad 	return retval;
7121f1ddafcSad }
7131f1ddafcSad 
7141f1ddafcSad int
__sigtimedwait50(const sigset_t * __restrict set,siginfo_t * __restrict info,const struct timespec * __restrict timeout)715461a86f9Schristos __sigtimedwait50(const sigset_t * __restrict set, siginfo_t * __restrict info,
7161f1ddafcSad     const struct timespec * __restrict timeout)
7171f1ddafcSad {
7181f1ddafcSad 	pthread_t self;
7191f1ddafcSad 	int retval;
7206343ca25Schristos 	struct timespec tout, *tp;
72176f4f391Sagc 
7226343ca25Schristos 	if (timeout) {
7236343ca25Schristos 		tout = *timeout;
7246343ca25Schristos 		tp = &tout;
7256343ca25Schristos 	} else
7266343ca25Schristos 		tp = NULL;
7271f1ddafcSad 
7281f1ddafcSad 	self = pthread__self();
7291f1ddafcSad 	TESTCANCEL(self);
7306343ca25Schristos 	retval = ____sigtimedwait50(set, info, tp);
7311f1ddafcSad 	TESTCANCEL(self);
7321f1ddafcSad 
7331f1ddafcSad 	return retval;
7341f1ddafcSad }
735c62a74e6Sthorpej 
73676f4f391Sagc int
sigwait(const sigset_t * __restrict set,int * __restrict sig)73776f4f391Sagc sigwait(const sigset_t * __restrict set, int * __restrict sig)
73876f4f391Sagc {
73976f4f391Sagc 	pthread_t	self;
74076f4f391Sagc 	int		saved_errno;
74176f4f391Sagc 	int		new_errno;
74276f4f391Sagc 	int		retval;
74376f4f391Sagc 
74476f4f391Sagc 	self = pthread__self();
74576f4f391Sagc 	saved_errno = errno;
74676f4f391Sagc 	TESTCANCEL(self);
74776f4f391Sagc 	retval = ____sigtimedwait50(set, NULL, NULL);
74876f4f391Sagc 	TESTCANCEL(self);
74976f4f391Sagc 	new_errno = errno;
75076f4f391Sagc 	errno = saved_errno;
75176f4f391Sagc 	if (retval < 0) {
75276f4f391Sagc 		return new_errno;
75376f4f391Sagc 	}
75476f4f391Sagc 	*sig = retval;
75576f4f391Sagc 	return 0;
75676f4f391Sagc }
75776f4f391Sagc 
758c62a74e6Sthorpej __strong_alias(_close, close)
7590d258229Schristos __strong_alias(_clock_nanosleep, clock_nanosleep)
760c62a74e6Sthorpej __strong_alias(_fcntl, fcntl)
7616b3fbf5dSkleink __strong_alias(_fdatasync, fdatasync)
762c62a74e6Sthorpej __strong_alias(_fsync, fsync)
763137c808bSthorpej __weak_alias(fsync_range, _fsync_range)
764fdc51b51Sad __strong_alias(_mq_send, mq_send)
765fdc51b51Sad __strong_alias(_mq_receive, mq_receive)
766c62a74e6Sthorpej __strong_alias(_msgrcv, msgrcv)
767c62a74e6Sthorpej __strong_alias(_msgsnd, msgsnd)
768c62a74e6Sthorpej __strong_alias(___msync13, __msync13)
769cc63c840Senami __strong_alias(___nanosleep50, __nanosleep50)
770c62a74e6Sthorpej __strong_alias(_open, open)
7710d258229Schristos __strong_alias(_openat, openat)
772c62a74e6Sthorpej __strong_alias(_poll, poll)
773c62a74e6Sthorpej __strong_alias(_pread, pread)
774c62a74e6Sthorpej __strong_alias(_pwrite, pwrite)
775c62a74e6Sthorpej __strong_alias(_read, read)
776c62a74e6Sthorpej __strong_alias(_readv, readv)
7770d258229Schristos __strong_alias(_recvfrom, recvfrom)
7780d258229Schristos __strong_alias(_recvmsg, recvmsg)
7790d258229Schristos __strong_alias(_recvmmsg, recvmmsg)
7800d258229Schristos __strong_alias(_sendmsg, sendmsg)
7810d258229Schristos __strong_alias(_sendmmsg, sendmmsg)
7820d258229Schristos __strong_alias(_sendto, sendto)
78376f4f391Sagc __strong_alias(_sigwait, sigwait)
784c62a74e6Sthorpej __strong_alias(_write, write)
785c62a74e6Sthorpej __strong_alias(_writev, writev)
786b4c1afd4Sad 
787b4c1afd4Sad #endif	/* !lint */
788