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