thr_syscalls.c revision 160662
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 160662 2006-07-25 12:50: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. 46112918Sjeff * 3. All advertising materials mentioning features or use of this software 47112918Sjeff * must display the following acknowledgement: 48112918Sjeff * This product includes software developed by John Birrell. 49112918Sjeff * 4. Neither the name of the author nor the names of any co-contributors 50112918Sjeff * may be used to endorse or promote products derived from this software 51112918Sjeff * without specific prior written permission. 52112918Sjeff * 53112918Sjeff * THIS SOFTWARE IS PROVIDED BY JOHN BIRRELL AND CONTRIBUTORS ``AS IS'' AND 54112918Sjeff * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 55112918Sjeff * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 56112918Sjeff * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 57112918Sjeff * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 58112918Sjeff * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 59112918Sjeff * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 60112918Sjeff * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 61112918Sjeff * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 62112918Sjeff * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 63112918Sjeff * SUCH DAMAGE. 64112918Sjeff * 65112918Sjeff */ 66112918Sjeff 67157457Sdavidxu#include "namespace.h" 68144518Sdavidxu#include <sys/types.h> 69112918Sjeff#include <sys/mman.h> 70112918Sjeff#include <sys/param.h> 71112918Sjeff#include <sys/select.h> 72144518Sdavidxu#include <sys/signalvar.h> 73135301Smtm#include <sys/socket.h> 74144518Sdavidxu#include <sys/stat.h> 75112918Sjeff#include <sys/time.h> 76112918Sjeff#include <sys/uio.h> 77112918Sjeff#include <sys/wait.h> 78112918Sjeff#include <aio.h> 79112918Sjeff#include <dirent.h> 80112918Sjeff#include <errno.h> 81112918Sjeff#include <fcntl.h> 82112918Sjeff#include <poll.h> 83112918Sjeff#include <signal.h> 84112918Sjeff#include <stdarg.h> 85112918Sjeff#include <stdio.h> 86112918Sjeff#include <stdlib.h> 87112918Sjeff#include <string.h> 88112918Sjeff#include <termios.h> 89112918Sjeff#include <unistd.h> 90144518Sdavidxu#include <pthread.h> 91157457Sdavidxu#include "un-namespace.h" 92112918Sjeff 93112918Sjeff#include "thr_private.h" 94112918Sjeff 95157457Sdavidxuextern int __creat(const char *, mode_t); 96157457Sdavidxuextern int __pselect(int, fd_set *, fd_set *, fd_set *, 97157457Sdavidxu const struct timespec *, const sigset_t *); 98157457Sdavidxuextern unsigned __sleep(unsigned int); 99157457Sdavidxuextern int __system(const char *); 100157457Sdavidxuextern int __tcdrain(int); 101157457Sdavidxuextern int __usleep(useconds_t); 102157457Sdavidxuextern pid_t __wait(int *); 103157457Sdavidxuextern pid_t __waitpid(pid_t, int *, int); 104157457Sdavidxuextern int __sys_aio_suspend(const struct aiocb * const[], int, 105157457Sdavidxu const struct timespec *); 106157457Sdavidxuextern int __sys_accept(int, struct sockaddr *, socklen_t *); 107157457Sdavidxuextern int __sys_connect(int, const struct sockaddr *, socklen_t); 108157457Sdavidxuextern int __sys_fsync(int); 109157457Sdavidxuextern int __sys_msync(void *, size_t, int); 110157457Sdavidxuextern int __sys_poll(struct pollfd *, unsigned, int); 111157457Sdavidxuextern ssize_t __sys_recv(int, void *, size_t, int); 112157457Sdavidxuextern ssize_t __sys_recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *); 113157457Sdavidxuextern ssize_t __sys_recvmsg(int, struct msghdr *, int); 114157457Sdavidxuextern int __sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *); 115157457Sdavidxuextern int __sys_sendfile(int, int, off_t, size_t, struct sf_hdtr *, 116157457Sdavidxu off_t *, int); 117157457Sdavidxuextern ssize_t __sys_sendmsg(int, const struct msghdr *, int); 118157457Sdavidxuextern ssize_t __sys_sendto(int, const void *,size_t, int, const struct sockaddr *, socklen_t); 119157457Sdavidxuextern ssize_t __sys_readv(int, const struct iovec *, int); 120157457Sdavidxuextern pid_t __sys_wait4(pid_t, int *, int, struct rusage *); 121157457Sdavidxuextern ssize_t __sys_writev(int, const struct iovec *, int); 122115260Smtm 123157457Sdavidxuint ___creat(const char *, mode_t); 124160662Sdavidxuint ___pselect(int, fd_set *, fd_set *, fd_set *, 125160662Sdavidxu const struct timespec *, const sigset_t *); 126160662Sdavidxuunsigned ___sleep(unsigned); 127160662Sdavidxuint ___system(const char *); 128160662Sdavidxuint ___tcdrain(int); 129160662Sdavidxuint ___usleep(useconds_t useconds); 130160662Sdavidxupid_t ___wait(int *); 131160662Sdavidxupid_t ___waitpid(pid_t, int *, int); 132157457Sdavidxuint __accept(int, struct sockaddr *, socklen_t *); 133160662Sdavidxuint __aio_suspend(const struct aiocb * const iocbs[], int, 134160662Sdavidxu const struct timespec *); 135157457Sdavidxuint __close(int); 136157457Sdavidxuint __connect(int, const struct sockaddr *, socklen_t); 137157457Sdavidxuint __fcntl(int, int,...); 138157457Sdavidxuint __fsync(int); 139157457Sdavidxuint __msync(void *, size_t, int); 140157457Sdavidxuint __nanosleep(const struct timespec *, struct timespec *); 141157457Sdavidxuint __open(const char *, int,...); 142157457Sdavidxuint __poll(struct pollfd *, unsigned int, int); 143157457Sdavidxussize_t __read(int, void *buf, size_t); 144157457Sdavidxussize_t __readv(int, const struct iovec *, int); 145157457Sdavidxussize_t __recvfrom(int, void *, size_t, int f, struct sockaddr *, socklen_t *); 146157457Sdavidxussize_t __recvmsg(int, struct msghdr *, int); 147157457Sdavidxuint __select(int, fd_set *, fd_set *, fd_set *, struct timeval *); 148157457Sdavidxussize_t __sendmsg(int, const struct msghdr *, int); 149157457Sdavidxussize_t __sendto(int, const void *, size_t, int, 150157457Sdavidxu const struct sockaddr *, socklen_t); 151160662Sdavidxupid_t __wait3(int *, int, struct rusage *); 152157457Sdavidxupid_t __wait4(pid_t, int *, int, struct rusage *); 153157457Sdavidxussize_t __write(int, const void *, size_t); 154157457Sdavidxussize_t __writev(int, const struct iovec *, int); 155157457Sdavidxuint _vfork(void); 156157457Sdavidxu 157144518Sdavidxu__weak_reference(__accept, accept); 158157457Sdavidxu 159135301Smtmint 160144518Sdavidxu__accept(int s, struct sockaddr *addr, socklen_t *addrlen) 161135301Smtm{ 162144518Sdavidxu struct pthread *curthread; 163144518Sdavidxu int oldcancel; 164135301Smtm int ret; 165135301Smtm 166144518Sdavidxu curthread = _get_curthread(); 167144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 168135301Smtm ret = __sys_accept(s, addr, addrlen); 169144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 170144518Sdavidxu 171144518Sdavidxu return (ret); 172135301Smtm} 173135301Smtm 174160662Sdavidxu__weak_reference(__aio_suspend, aio_suspend); 175112918Sjeff 176112918Sjeffint 177160662Sdavidxu__aio_suspend(const struct aiocb * const iocbs[], int niocb, const struct 178112918Sjeff timespec *timeout) 179112918Sjeff{ 180144518Sdavidxu struct pthread *curthread = _get_curthread(); 181144518Sdavidxu int oldcancel; 182144518Sdavidxu int ret; 183112918Sjeff 184144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 185112918Sjeff ret = __sys_aio_suspend(iocbs, niocb, timeout); 186144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 187112918Sjeff 188144518Sdavidxu return (ret); 189112918Sjeff} 190112918Sjeff 191144518Sdavidxu__weak_reference(__close, close); 192112918Sjeff 193112918Sjeffint 194144518Sdavidxu__close(int fd) 195112918Sjeff{ 196144518Sdavidxu struct pthread *curthread = _get_curthread(); 197144518Sdavidxu int oldcancel; 198112918Sjeff int ret; 199112918Sjeff 200144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 201112918Sjeff ret = __sys_close(fd); 202144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 203112918Sjeff 204144518Sdavidxu return (ret); 205112918Sjeff} 206135301Smtm 207144518Sdavidxu__weak_reference(__connect, connect); 208135301Smtm 209135301Smtmint 210144518Sdavidxu__connect(int fd, const struct sockaddr *name, socklen_t namelen) 211135301Smtm{ 212144518Sdavidxu struct pthread *curthread = _get_curthread(); 213144518Sdavidxu int oldcancel; 214135301Smtm int ret; 215135301Smtm 216144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 217144518Sdavidxu ret = __sys_connect(fd, name, namelen); 218144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 219144518Sdavidxu 220144518Sdavidxu return (ret); 221135301Smtm} 222112918Sjeff 223144518Sdavidxu__weak_reference(___creat, creat); 224144518Sdavidxu 225112918Sjeffint 226144518Sdavidxu___creat(const char *path, mode_t mode) 227112918Sjeff{ 228144518Sdavidxu struct pthread *curthread = _get_curthread(); 229144518Sdavidxu int oldcancel; 230144518Sdavidxu int ret; 231112918Sjeff 232144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 233112918Sjeff ret = __creat(path, mode); 234144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 235112918Sjeff 236112918Sjeff return ret; 237112918Sjeff} 238112918Sjeff 239144518Sdavidxu__weak_reference(__fcntl, fcntl); 240112918Sjeff 241112918Sjeffint 242144518Sdavidxu__fcntl(int fd, int cmd,...) 243112918Sjeff{ 244144518Sdavidxu struct pthread *curthread = _get_curthread(); 245144518Sdavidxu int oldcancel; 246112918Sjeff int ret; 247112918Sjeff va_list ap; 248112918Sjeff 249144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 250112918Sjeff 251112918Sjeff va_start(ap, cmd); 252112918Sjeff switch (cmd) { 253144518Sdavidxu case F_DUPFD: 254144518Sdavidxu ret = __sys_fcntl(fd, cmd, va_arg(ap, int)); 255144518Sdavidxu break; 256144518Sdavidxu case F_SETFD: 257144518Sdavidxu case F_SETFL: 258144518Sdavidxu ret = __sys_fcntl(fd, cmd, va_arg(ap, int)); 259144518Sdavidxu break; 260144518Sdavidxu case F_GETFD: 261144518Sdavidxu case F_GETFL: 262144518Sdavidxu ret = __sys_fcntl(fd, cmd); 263144518Sdavidxu break; 264144518Sdavidxu default: 265144518Sdavidxu ret = __sys_fcntl(fd, cmd, va_arg(ap, void *)); 266112918Sjeff } 267112918Sjeff va_end(ap); 268112918Sjeff 269144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 270112918Sjeff 271144518Sdavidxu return (ret); 272112918Sjeff} 273112918Sjeff 274144518Sdavidxu__weak_reference(__fsync, fsync); 275131181Smtm 276131181Smtmint 277144518Sdavidxu__fsync(int fd) 278131181Smtm{ 279144518Sdavidxu struct pthread *curthread = _get_curthread(); 280144518Sdavidxu int oldcancel; 281131181Smtm int ret; 282131181Smtm 283144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 284112918Sjeff ret = __sys_fsync(fd); 285144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 286112918Sjeff 287144518Sdavidxu return (ret); 288112918Sjeff} 289112918Sjeff 290144518Sdavidxu__weak_reference(__msync, msync); 291135301Smtm 292135301Smtmint 293144518Sdavidxu__msync(void *addr, size_t len, int flags) 294135301Smtm{ 295144518Sdavidxu struct pthread *curthread = _get_curthread(); 296144518Sdavidxu int oldcancel; 297112918Sjeff int ret; 298112918Sjeff 299144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 300112918Sjeff ret = __sys_msync(addr, len, flags); 301144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 302112918Sjeff 303112918Sjeff return ret; 304112918Sjeff} 305112918Sjeff 306144518Sdavidxu__weak_reference(__nanosleep, nanosleep); 307112918Sjeff 308112918Sjeffint 309144518Sdavidxu__nanosleep(const struct timespec *time_to_sleep, 310144518Sdavidxu struct timespec *time_remaining) 311112918Sjeff{ 312144518Sdavidxu struct pthread *curthread = _get_curthread(); 313144518Sdavidxu int oldcancel; 314144518Sdavidxu int ret; 315112918Sjeff 316144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 317112918Sjeff ret = __sys_nanosleep(time_to_sleep, time_remaining); 318144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 319112918Sjeff 320144518Sdavidxu return (ret); 321112918Sjeff} 322112918Sjeff 323144518Sdavidxu__weak_reference(__open, open); 324112918Sjeff 325112918Sjeffint 326144518Sdavidxu__open(const char *path, int flags,...) 327112918Sjeff{ 328144518Sdavidxu struct pthread *curthread = _get_curthread(); 329144518Sdavidxu int oldcancel; 330112918Sjeff int ret; 331112918Sjeff int mode = 0; 332112918Sjeff va_list ap; 333112918Sjeff 334144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 335112918Sjeff 336112918Sjeff /* Check if the file is being created: */ 337112918Sjeff if (flags & O_CREAT) { 338112918Sjeff /* Get the creation mode: */ 339112918Sjeff va_start(ap, flags); 340112918Sjeff mode = va_arg(ap, int); 341112918Sjeff va_end(ap); 342112918Sjeff } 343112918Sjeff 344112918Sjeff ret = __sys_open(path, flags, mode); 345112918Sjeff 346144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 347144518Sdavidxu 348112918Sjeff return ret; 349112918Sjeff} 350112918Sjeff 351144518Sdavidxu__weak_reference(__poll, poll); 352112918Sjeff 353112918Sjeffint 354144518Sdavidxu__poll(struct pollfd *fds, unsigned int nfds, int timeout) 355112918Sjeff{ 356144518Sdavidxu struct pthread *curthread = _get_curthread(); 357144518Sdavidxu int oldcancel; 358112918Sjeff int ret; 359112918Sjeff 360144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 361112918Sjeff ret = __sys_poll(fds, nfds, timeout); 362144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 363112918Sjeff 364112918Sjeff return ret; 365112918Sjeff} 366112918Sjeff 367160662Sdavidxu__weak_reference(___pselect, pselect); 368135301Smtm 369112918Sjeffint 370160662Sdavidxu___pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds, 371112918Sjeff const struct timespec *timo, const sigset_t *mask) 372112918Sjeff{ 373144518Sdavidxu struct pthread *curthread = _get_curthread(); 374144518Sdavidxu int oldcancel; 375112918Sjeff int ret; 376112918Sjeff 377144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 378112918Sjeff ret = __pselect(count, rfds, wfds, efds, timo, mask); 379144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 380112918Sjeff 381112918Sjeff return (ret); 382112918Sjeff} 383112918Sjeff 384144518Sdavidxu__weak_reference(__read, read); 385112918Sjeff 386112918Sjeffssize_t 387144518Sdavidxu__read(int fd, void *buf, size_t nbytes) 388112918Sjeff{ 389144518Sdavidxu struct pthread *curthread = _get_curthread(); 390144518Sdavidxu int oldcancel; 391112918Sjeff ssize_t ret; 392112918Sjeff 393144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 394112918Sjeff ret = __sys_read(fd, buf, nbytes); 395144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 396112918Sjeff 397112918Sjeff return ret; 398112918Sjeff} 399112918Sjeff 400144518Sdavidxu__weak_reference(__readv, readv); 401112918Sjeff 402112918Sjeffssize_t 403144518Sdavidxu__readv(int fd, const struct iovec *iov, int iovcnt) 404112918Sjeff{ 405144518Sdavidxu struct pthread *curthread = _get_curthread(); 406144518Sdavidxu int oldcancel; 407112918Sjeff ssize_t ret; 408112918Sjeff 409144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 410112918Sjeff ret = __sys_readv(fd, iov, iovcnt); 411144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 412112918Sjeff 413112918Sjeff return ret; 414112918Sjeff} 415112918Sjeff 416144518Sdavidxu__weak_reference(__recvfrom, recvfrom); 417135301Smtm 418135301Smtmssize_t 419144518Sdavidxu__recvfrom(int s, void *b, size_t l, int f, struct sockaddr *from, 420135301Smtm socklen_t *fl) 421135301Smtm{ 422144518Sdavidxu struct pthread *curthread = _get_curthread(); 423144518Sdavidxu int oldcancel; 424135301Smtm ssize_t ret; 425135301Smtm 426144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 427135301Smtm ret = __sys_recvfrom(s, b, l, f, from, fl); 428144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 429135301Smtm return (ret); 430135301Smtm} 431135301Smtm 432144518Sdavidxu__weak_reference(__recvmsg, recvmsg); 433135301Smtm 434135301Smtmssize_t 435144518Sdavidxu__recvmsg(int s, struct msghdr *m, int f) 436135301Smtm{ 437144518Sdavidxu struct pthread *curthread = _get_curthread(); 438135301Smtm ssize_t ret; 439144518Sdavidxu int oldcancel; 440135301Smtm 441144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 442135301Smtm ret = __sys_recvmsg(s, m, f); 443144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 444135301Smtm return (ret); 445135301Smtm} 446135301Smtm 447144518Sdavidxu__weak_reference(__select, select); 448112918Sjeff 449112918Sjeffint 450144518Sdavidxu__select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 451112918Sjeff struct timeval *timeout) 452112918Sjeff{ 453144518Sdavidxu struct pthread *curthread = _get_curthread(); 454144518Sdavidxu int oldcancel; 455112918Sjeff int ret; 456112918Sjeff 457144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 458112918Sjeff ret = __sys_select(numfds, readfds, writefds, exceptfds, timeout); 459144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 460112918Sjeff return ret; 461112918Sjeff} 462112918Sjeff 463144518Sdavidxu__weak_reference(__sendmsg, sendmsg); 464135301Smtm 465135301Smtmssize_t 466144518Sdavidxu__sendmsg(int s, const struct msghdr *m, int f) 467135301Smtm{ 468144518Sdavidxu struct pthread *curthread = _get_curthread(); 469135301Smtm ssize_t ret; 470144518Sdavidxu int oldcancel; 471135301Smtm 472144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 473135301Smtm ret = __sys_sendmsg(s, m, f); 474144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 475135301Smtm return (ret); 476135301Smtm} 477135301Smtm 478144518Sdavidxu__weak_reference(__sendto, sendto); 479135301Smtm 480135301Smtmssize_t 481144518Sdavidxu__sendto(int s, const void *m, size_t l, int f, const struct sockaddr *t, 482135301Smtm socklen_t tl) 483135301Smtm{ 484144518Sdavidxu struct pthread *curthread = _get_curthread(); 485135301Smtm ssize_t ret; 486144518Sdavidxu int oldcancel; 487135301Smtm 488144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 489135301Smtm ret = __sys_sendto(s, m, l, f, t, tl); 490144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 491135301Smtm return (ret); 492135301Smtm} 493135301Smtm 494160662Sdavidxu__weak_reference(___sleep, sleep); 495148658Sdeischen 496112918Sjeffunsigned int 497160662Sdavidxu___sleep(unsigned int seconds) 498112918Sjeff{ 499144518Sdavidxu struct pthread *curthread = _get_curthread(); 500144518Sdavidxu int oldcancel; 501112918Sjeff unsigned int ret; 502112918Sjeff 503144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 504112918Sjeff ret = __sleep(seconds); 505144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 506112918Sjeff 507144518Sdavidxu return (ret); 508112918Sjeff} 509112918Sjeff 510160662Sdavidxu__weak_reference(___system, system); 511112918Sjeff 512112918Sjeffint 513160662Sdavidxu___system(const char *string) 514112918Sjeff{ 515144518Sdavidxu struct pthread *curthread = _get_curthread(); 516144518Sdavidxu int oldcancel; 517112918Sjeff int ret; 518112918Sjeff 519144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 520112918Sjeff ret = __system(string); 521144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 522112918Sjeff 523112918Sjeff return ret; 524112918Sjeff} 525112918Sjeff 526160662Sdavidxu__weak_reference(___tcdrain, tcdrain); 527112918Sjeff 528112918Sjeffint 529160662Sdavidxu___tcdrain(int fd) 530112918Sjeff{ 531144518Sdavidxu struct pthread *curthread = _get_curthread(); 532144518Sdavidxu int oldcancel; 533112918Sjeff int ret; 534112918Sjeff 535144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 536112918Sjeff ret = __tcdrain(fd); 537144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 538112918Sjeff 539144518Sdavidxu return (ret); 540112918Sjeff} 541112918Sjeff 542160662Sdavidxu__weak_reference(___usleep, usleep); 543148658Sdeischen 544148658Sdeischenint 545160662Sdavidxu___usleep(useconds_t useconds) 546148658Sdeischen{ 547148658Sdeischen struct pthread *curthread = _get_curthread(); 548148658Sdeischen int oldcancel; 549148658Sdeischen int ret; 550148658Sdeischen 551148658Sdeischen oldcancel = _thr_cancel_enter(curthread); 552148658Sdeischen ret = __usleep(useconds); 553148658Sdeischen _thr_cancel_leave(curthread, oldcancel); 554148658Sdeischen 555148658Sdeischen return (ret); 556148658Sdeischen} 557148658Sdeischen 558144518Sdavidxu__weak_reference(_vfork, vfork); 559135301Smtm 560135301Smtmint 561144518Sdavidxu_vfork(void) 562135301Smtm{ 563144518Sdavidxu return (fork()); 564135301Smtm} 565135301Smtm 566160662Sdavidxu__weak_reference(___wait, wait); 567112918Sjeff 568112918Sjeffpid_t 569160662Sdavidxu___wait(int *istat) 570112918Sjeff{ 571144518Sdavidxu struct pthread *curthread = _get_curthread(); 572144518Sdavidxu int oldcancel; 573112918Sjeff pid_t ret; 574112918Sjeff 575144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 576112918Sjeff ret = __wait(istat); 577144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 578112918Sjeff 579112918Sjeff return ret; 580112918Sjeff} 581112918Sjeff 582160662Sdavidxu__weak_reference(__wait3, wait3); 583160662Sdavidxu 584160662Sdavidxupid_t 585160662Sdavidxu__wait3(int *status, int options, struct rusage *rusage) 586160662Sdavidxu{ 587160662Sdavidxu struct pthread *curthread = _get_curthread(); 588160662Sdavidxu int oldcancel; 589160662Sdavidxu pid_t ret; 590160662Sdavidxu 591160662Sdavidxu oldcancel = _thr_cancel_enter(curthread); 592160662Sdavidxu ret = _wait4(WAIT_ANY, status, options, rusage); 593160662Sdavidxu _thr_cancel_leave(curthread, oldcancel); 594160662Sdavidxu 595160662Sdavidxu return (ret); 596160662Sdavidxu} 597160662Sdavidxu 598144518Sdavidxu__weak_reference(__wait4, wait4); 599112918Sjeff 600112918Sjeffpid_t 601160662Sdavidxu__wait4(pid_t pid, int *status, int options, struct rusage *rusage) 602112918Sjeff{ 603144518Sdavidxu struct pthread *curthread = _get_curthread(); 604144518Sdavidxu int oldcancel; 605112918Sjeff pid_t ret; 606112918Sjeff 607144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 608160662Sdavidxu ret = __sys_wait4(pid, status, options, rusage); 609144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 610112918Sjeff 611112918Sjeff return ret; 612112918Sjeff} 613112918Sjeff 614160662Sdavidxu__weak_reference(___waitpid, waitpid); 615112918Sjeff 616112918Sjeffpid_t 617160662Sdavidxu___waitpid(pid_t wpid, int *status, int options) 618112918Sjeff{ 619144518Sdavidxu struct pthread *curthread = _get_curthread(); 620144518Sdavidxu int oldcancel; 621112918Sjeff pid_t ret; 622112918Sjeff 623144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 624112918Sjeff ret = __waitpid(wpid, status, options); 625144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 626112918Sjeff 627112918Sjeff return ret; 628112918Sjeff} 629112918Sjeff 630144518Sdavidxu__weak_reference(__write, write); 631112918Sjeff 632112918Sjeffssize_t 633144518Sdavidxu__write(int fd, const void *buf, size_t nbytes) 634112918Sjeff{ 635144518Sdavidxu struct pthread *curthread = _get_curthread(); 636144518Sdavidxu int oldcancel; 637112918Sjeff ssize_t ret; 638112918Sjeff 639144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 640112918Sjeff ret = __sys_write(fd, buf, nbytes); 641144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 642112918Sjeff 643112918Sjeff return ret; 644112918Sjeff} 645112918Sjeff 646144518Sdavidxu__weak_reference(__writev, writev); 647112918Sjeff 648112918Sjeffssize_t 649144518Sdavidxu__writev(int fd, const struct iovec *iov, int iovcnt) 650112918Sjeff{ 651144518Sdavidxu struct pthread *curthread = _get_curthread(); 652144518Sdavidxu int oldcancel; 653112918Sjeff ssize_t ret; 654112918Sjeff 655144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 656112918Sjeff ret = __sys_writev(fd, iov, iovcnt); 657144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 658112918Sjeff 659112918Sjeff return ret; 660112918Sjeff} 661