thr_syscalls.c revision 157457
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 157457 2006-04-04 02:57:49Z 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 __pause(void); 97157457Sdavidxuextern int __pselect(int, fd_set *, fd_set *, fd_set *, 98157457Sdavidxu const struct timespec *, const sigset_t *); 99157457Sdavidxuextern unsigned __sleep(unsigned int); 100157457Sdavidxuextern int __system(const char *); 101157457Sdavidxuextern int __tcdrain(int); 102157457Sdavidxuextern int __usleep(useconds_t); 103157457Sdavidxuextern pid_t __wait(int *); 104157457Sdavidxuextern pid_t __waitpid(pid_t, int *, int); 105157457Sdavidxuextern int __sys_aio_suspend(const struct aiocb * const[], int, 106157457Sdavidxu const struct timespec *); 107157457Sdavidxuextern int __sys_accept(int, struct sockaddr *, socklen_t *); 108157457Sdavidxuextern int __sys_connect(int, const struct sockaddr *, socklen_t); 109157457Sdavidxuextern int __sys_fsync(int); 110157457Sdavidxuextern int __sys_msync(void *, size_t, int); 111157457Sdavidxuextern int __sys_poll(struct pollfd *, unsigned, int); 112157457Sdavidxuextern ssize_t __sys_recv(int, void *, size_t, int); 113157457Sdavidxuextern ssize_t __sys_recvfrom(int, void *, size_t, int, struct sockaddr *, socklen_t *); 114157457Sdavidxuextern ssize_t __sys_recvmsg(int, struct msghdr *, int); 115157457Sdavidxuextern int __sys_select(int, fd_set *, fd_set *, fd_set *, struct timeval *); 116157457Sdavidxuextern int __sys_sendfile(int, int, off_t, size_t, struct sf_hdtr *, 117157457Sdavidxu off_t *, int); 118157457Sdavidxuextern ssize_t __sys_sendmsg(int, const struct msghdr *, int); 119157457Sdavidxuextern ssize_t __sys_sendto(int, const void *,size_t, int, const struct sockaddr *, socklen_t); 120157457Sdavidxuextern ssize_t __sys_readv(int, const struct iovec *, int); 121157457Sdavidxuextern pid_t __sys_wait4(pid_t, int *, int, struct rusage *); 122157457Sdavidxuextern ssize_t __sys_writev(int, const struct iovec *, int); 123115260Smtm 124157457Sdavidxuint ___creat(const char *, mode_t); 125157457Sdavidxuint __accept(int, struct sockaddr *, socklen_t *); 126157457Sdavidxuint __close(int); 127157457Sdavidxuint __connect(int, const struct sockaddr *, socklen_t); 128157457Sdavidxuint __fcntl(int, int,...); 129157457Sdavidxuint __fsync(int); 130157457Sdavidxuint __msync(void *, size_t, int); 131157457Sdavidxuint __nanosleep(const struct timespec *, struct timespec *); 132157457Sdavidxuint __open(const char *, int,...); 133157457Sdavidxuint __poll(struct pollfd *, unsigned int, int); 134157457Sdavidxussize_t __read(int, void *buf, size_t); 135157457Sdavidxussize_t __readv(int, const struct iovec *, int); 136157457Sdavidxussize_t __recvfrom(int, void *, size_t, int f, struct sockaddr *, socklen_t *); 137157457Sdavidxussize_t __recvmsg(int, struct msghdr *, int); 138157457Sdavidxuint __select(int, fd_set *, fd_set *, fd_set *, struct timeval *); 139157457Sdavidxussize_t __sendmsg(int, const struct msghdr *, int); 140157457Sdavidxussize_t __sendto(int, const void *, size_t, int, 141157457Sdavidxu const struct sockaddr *, socklen_t); 142157457Sdavidxupid_t __wait4(pid_t, int *, int, struct rusage *); 143157457Sdavidxussize_t __write(int, const void *, size_t); 144157457Sdavidxussize_t __writev(int, const struct iovec *, int); 145157457Sdavidxuint _aio_suspend(const struct aiocb * const iocbs[], int, 146157457Sdavidxu const struct timespec *); 147157457Sdavidxuint _pause(void); 148157457Sdavidxuint _pselect(int, fd_set *, fd_set *, fd_set *, 149157457Sdavidxu const struct timespec *, const sigset_t *); 150157457Sdavidxuint _raise(int); 151157457Sdavidxuunsigned _sleep(unsigned); 152157457Sdavidxuint _system(const char *); 153157457Sdavidxuint _tcdrain(int); 154157457Sdavidxuint _vfork(void); 155157457Sdavidxupid_t _wait(int *); 156157457Sdavidxu 157157457Sdavidxu 158144518Sdavidxu__weak_reference(__accept, accept); 159157457Sdavidxu 160135301Smtmint 161144518Sdavidxu__accept(int s, struct sockaddr *addr, socklen_t *addrlen) 162135301Smtm{ 163144518Sdavidxu struct pthread *curthread; 164144518Sdavidxu int oldcancel; 165135301Smtm int ret; 166135301Smtm 167144518Sdavidxu curthread = _get_curthread(); 168144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 169135301Smtm ret = __sys_accept(s, addr, addrlen); 170144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 171144518Sdavidxu 172144518Sdavidxu return (ret); 173135301Smtm} 174135301Smtm 175112918Sjeff__weak_reference(_aio_suspend, aio_suspend); 176112918Sjeff 177112918Sjeffint 178112918Sjeff_aio_suspend(const struct aiocb * const iocbs[], int niocb, const struct 179112918Sjeff timespec *timeout) 180112918Sjeff{ 181144518Sdavidxu struct pthread *curthread = _get_curthread(); 182144518Sdavidxu int oldcancel; 183144518Sdavidxu int ret; 184112918Sjeff 185144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 186112918Sjeff ret = __sys_aio_suspend(iocbs, niocb, timeout); 187144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 188112918Sjeff 189144518Sdavidxu return (ret); 190112918Sjeff} 191112918Sjeff 192144518Sdavidxu__weak_reference(__close, close); 193112918Sjeff 194112918Sjeffint 195144518Sdavidxu__close(int fd) 196112918Sjeff{ 197144518Sdavidxu struct pthread *curthread = _get_curthread(); 198144518Sdavidxu int oldcancel; 199112918Sjeff int ret; 200112918Sjeff 201144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 202112918Sjeff ret = __sys_close(fd); 203144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 204112918Sjeff 205144518Sdavidxu return (ret); 206112918Sjeff} 207135301Smtm 208144518Sdavidxu__weak_reference(__connect, connect); 209135301Smtm 210135301Smtmint 211144518Sdavidxu__connect(int fd, const struct sockaddr *name, socklen_t namelen) 212135301Smtm{ 213144518Sdavidxu struct pthread *curthread = _get_curthread(); 214144518Sdavidxu int oldcancel; 215135301Smtm int ret; 216135301Smtm 217144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 218144518Sdavidxu ret = __sys_connect(fd, name, namelen); 219144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 220144518Sdavidxu 221144518Sdavidxu return (ret); 222135301Smtm} 223112918Sjeff 224144518Sdavidxu__weak_reference(___creat, creat); 225144518Sdavidxu 226112918Sjeffint 227144518Sdavidxu___creat(const char *path, mode_t mode) 228112918Sjeff{ 229144518Sdavidxu struct pthread *curthread = _get_curthread(); 230144518Sdavidxu int oldcancel; 231144518Sdavidxu int ret; 232112918Sjeff 233144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 234112918Sjeff ret = __creat(path, mode); 235144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 236112918Sjeff 237112918Sjeff return ret; 238112918Sjeff} 239112918Sjeff 240144518Sdavidxu__weak_reference(__fcntl, fcntl); 241112918Sjeff 242112918Sjeffint 243144518Sdavidxu__fcntl(int fd, int cmd,...) 244112918Sjeff{ 245144518Sdavidxu struct pthread *curthread = _get_curthread(); 246144518Sdavidxu int oldcancel; 247112918Sjeff int ret; 248112918Sjeff va_list ap; 249112918Sjeff 250144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 251112918Sjeff 252112918Sjeff va_start(ap, cmd); 253112918Sjeff switch (cmd) { 254144518Sdavidxu case F_DUPFD: 255144518Sdavidxu ret = __sys_fcntl(fd, cmd, va_arg(ap, int)); 256144518Sdavidxu break; 257144518Sdavidxu case F_SETFD: 258144518Sdavidxu case F_SETFL: 259144518Sdavidxu ret = __sys_fcntl(fd, cmd, va_arg(ap, int)); 260144518Sdavidxu break; 261144518Sdavidxu case F_GETFD: 262144518Sdavidxu case F_GETFL: 263144518Sdavidxu ret = __sys_fcntl(fd, cmd); 264144518Sdavidxu break; 265144518Sdavidxu default: 266144518Sdavidxu ret = __sys_fcntl(fd, cmd, va_arg(ap, void *)); 267112918Sjeff } 268112918Sjeff va_end(ap); 269112918Sjeff 270144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 271112918Sjeff 272144518Sdavidxu return (ret); 273112918Sjeff} 274112918Sjeff 275144518Sdavidxu__weak_reference(__fsync, fsync); 276131181Smtm 277131181Smtmint 278144518Sdavidxu__fsync(int fd) 279131181Smtm{ 280144518Sdavidxu struct pthread *curthread = _get_curthread(); 281144518Sdavidxu int oldcancel; 282131181Smtm int ret; 283131181Smtm 284144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 285112918Sjeff ret = __sys_fsync(fd); 286144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 287112918Sjeff 288144518Sdavidxu return (ret); 289112918Sjeff} 290112918Sjeff 291144518Sdavidxu__weak_reference(__msync, msync); 292135301Smtm 293135301Smtmint 294144518Sdavidxu__msync(void *addr, size_t len, int flags) 295135301Smtm{ 296144518Sdavidxu struct pthread *curthread = _get_curthread(); 297144518Sdavidxu int oldcancel; 298112918Sjeff int ret; 299112918Sjeff 300144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 301112918Sjeff ret = __sys_msync(addr, len, flags); 302144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 303112918Sjeff 304112918Sjeff return ret; 305112918Sjeff} 306112918Sjeff 307144518Sdavidxu__weak_reference(__nanosleep, nanosleep); 308112918Sjeff 309112918Sjeffint 310144518Sdavidxu__nanosleep(const struct timespec *time_to_sleep, 311144518Sdavidxu struct timespec *time_remaining) 312112918Sjeff{ 313144518Sdavidxu struct pthread *curthread = _get_curthread(); 314144518Sdavidxu int oldcancel; 315144518Sdavidxu int ret; 316112918Sjeff 317144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 318112918Sjeff ret = __sys_nanosleep(time_to_sleep, time_remaining); 319144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 320112918Sjeff 321144518Sdavidxu return (ret); 322112918Sjeff} 323112918Sjeff 324144518Sdavidxu__weak_reference(__open, open); 325112918Sjeff 326112918Sjeffint 327144518Sdavidxu__open(const char *path, int flags,...) 328112918Sjeff{ 329144518Sdavidxu struct pthread *curthread = _get_curthread(); 330144518Sdavidxu int oldcancel; 331112918Sjeff int ret; 332112918Sjeff int mode = 0; 333112918Sjeff va_list ap; 334112918Sjeff 335144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 336112918Sjeff 337112918Sjeff /* Check if the file is being created: */ 338112918Sjeff if (flags & O_CREAT) { 339112918Sjeff /* Get the creation mode: */ 340112918Sjeff va_start(ap, flags); 341112918Sjeff mode = va_arg(ap, int); 342112918Sjeff va_end(ap); 343112918Sjeff } 344112918Sjeff 345112918Sjeff ret = __sys_open(path, flags, mode); 346112918Sjeff 347144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 348144518Sdavidxu 349112918Sjeff return ret; 350112918Sjeff} 351112918Sjeff 352135301Smtm__weak_reference(_pause, pause); 353135301Smtm 354135301Smtmint 355135301Smtm_pause(void) 356135301Smtm{ 357144518Sdavidxu struct pthread *curthread = _get_curthread(); 358144518Sdavidxu int oldcancel; 359144518Sdavidxu int ret; 360144518Sdavidxu 361144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 362144518Sdavidxu ret = __pause(); 363144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 364144518Sdavidxu 365144518Sdavidxu return ret; 366135301Smtm} 367135301Smtm 368144518Sdavidxu__weak_reference(__poll, poll); 369112918Sjeff 370112918Sjeffint 371144518Sdavidxu__poll(struct pollfd *fds, unsigned int nfds, int timeout) 372112918Sjeff{ 373144518Sdavidxu struct pthread *curthread = _get_curthread(); 374144518Sdavidxu int oldcancel; 375112918Sjeff int ret; 376112918Sjeff 377144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 378112918Sjeff ret = __sys_poll(fds, nfds, timeout); 379144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 380112918Sjeff 381112918Sjeff return ret; 382112918Sjeff} 383112918Sjeff 384144518Sdavidxu__weak_reference(_pselect, pselect); 385135301Smtm 386112918Sjeffint 387144518Sdavidxu_pselect(int count, fd_set *rfds, fd_set *wfds, fd_set *efds, 388112918Sjeff const struct timespec *timo, const sigset_t *mask) 389112918Sjeff{ 390144518Sdavidxu struct pthread *curthread = _get_curthread(); 391144518Sdavidxu int oldcancel; 392112918Sjeff int ret; 393112918Sjeff 394144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 395112918Sjeff ret = __pselect(count, rfds, wfds, efds, timo, mask); 396144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 397112918Sjeff 398112918Sjeff return (ret); 399112918Sjeff} 400112918Sjeff 401127486Smtm__weak_reference(_raise, raise); 402127486Smtm 403127486Smtmint 404127486Smtm_raise(int sig) 405127486Smtm{ 406144518Sdavidxu int ret; 407127486Smtm 408144518Sdavidxu if (!_thr_isthreaded()) 409144518Sdavidxu ret = kill(getpid(), sig); 410151968Sdavidxu else 411151968Sdavidxu ret = _thr_send_sig(_get_curthread(), sig); 412144518Sdavidxu return (ret); 413127486Smtm} 414127486Smtm 415144518Sdavidxu__weak_reference(__read, read); 416112918Sjeff 417112918Sjeffssize_t 418144518Sdavidxu__read(int fd, void *buf, size_t nbytes) 419112918Sjeff{ 420144518Sdavidxu struct pthread *curthread = _get_curthread(); 421144518Sdavidxu int oldcancel; 422112918Sjeff ssize_t ret; 423112918Sjeff 424144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 425112918Sjeff ret = __sys_read(fd, buf, nbytes); 426144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 427112918Sjeff 428112918Sjeff return ret; 429112918Sjeff} 430112918Sjeff 431144518Sdavidxu__weak_reference(__readv, readv); 432112918Sjeff 433112918Sjeffssize_t 434144518Sdavidxu__readv(int fd, const struct iovec *iov, int iovcnt) 435112918Sjeff{ 436144518Sdavidxu struct pthread *curthread = _get_curthread(); 437144518Sdavidxu int oldcancel; 438112918Sjeff ssize_t ret; 439112918Sjeff 440144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 441112918Sjeff ret = __sys_readv(fd, iov, iovcnt); 442144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 443112918Sjeff 444112918Sjeff return ret; 445112918Sjeff} 446112918Sjeff 447144518Sdavidxu__weak_reference(__recvfrom, recvfrom); 448135301Smtm 449135301Smtmssize_t 450144518Sdavidxu__recvfrom(int s, void *b, size_t l, int f, struct sockaddr *from, 451135301Smtm socklen_t *fl) 452135301Smtm{ 453144518Sdavidxu struct pthread *curthread = _get_curthread(); 454144518Sdavidxu int oldcancel; 455135301Smtm ssize_t ret; 456135301Smtm 457144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 458135301Smtm ret = __sys_recvfrom(s, b, l, f, from, fl); 459144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 460135301Smtm return (ret); 461135301Smtm} 462135301Smtm 463144518Sdavidxu__weak_reference(__recvmsg, recvmsg); 464135301Smtm 465135301Smtmssize_t 466144518Sdavidxu__recvmsg(int s, 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_recvmsg(s, m, f); 474144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 475135301Smtm return (ret); 476135301Smtm} 477135301Smtm 478144518Sdavidxu__weak_reference(__select, select); 479112918Sjeff 480112918Sjeffint 481144518Sdavidxu__select(int numfds, fd_set *readfds, fd_set *writefds, fd_set *exceptfds, 482112918Sjeff struct timeval *timeout) 483112918Sjeff{ 484144518Sdavidxu struct pthread *curthread = _get_curthread(); 485144518Sdavidxu int oldcancel; 486112918Sjeff int ret; 487112918Sjeff 488144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 489112918Sjeff ret = __sys_select(numfds, readfds, writefds, exceptfds, timeout); 490144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 491112918Sjeff return ret; 492112918Sjeff} 493112918Sjeff 494144518Sdavidxu__weak_reference(__sendmsg, sendmsg); 495135301Smtm 496135301Smtmssize_t 497144518Sdavidxu__sendmsg(int s, const struct msghdr *m, int f) 498135301Smtm{ 499144518Sdavidxu struct pthread *curthread = _get_curthread(); 500135301Smtm ssize_t ret; 501144518Sdavidxu int oldcancel; 502135301Smtm 503144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 504135301Smtm ret = __sys_sendmsg(s, m, f); 505144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 506135301Smtm return (ret); 507135301Smtm} 508135301Smtm 509144518Sdavidxu__weak_reference(__sendto, sendto); 510135301Smtm 511135301Smtmssize_t 512144518Sdavidxu__sendto(int s, const void *m, size_t l, int f, const struct sockaddr *t, 513135301Smtm socklen_t tl) 514135301Smtm{ 515144518Sdavidxu struct pthread *curthread = _get_curthread(); 516135301Smtm ssize_t ret; 517144518Sdavidxu int oldcancel; 518135301Smtm 519144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 520135301Smtm ret = __sys_sendto(s, m, l, f, t, tl); 521144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 522135301Smtm return (ret); 523135301Smtm} 524135301Smtm 525148658Sdeischen__weak_reference(_sleep, sleep); 526148658Sdeischen 527112918Sjeffunsigned int 528112918Sjeff_sleep(unsigned int seconds) 529112918Sjeff{ 530144518Sdavidxu struct pthread *curthread = _get_curthread(); 531144518Sdavidxu int oldcancel; 532112918Sjeff unsigned int ret; 533112918Sjeff 534144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 535112918Sjeff ret = __sleep(seconds); 536144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 537112918Sjeff 538144518Sdavidxu return (ret); 539112918Sjeff} 540112918Sjeff 541112918Sjeff__weak_reference(_system, system); 542112918Sjeff 543112918Sjeffint 544112918Sjeff_system(const char *string) 545112918Sjeff{ 546144518Sdavidxu struct pthread *curthread = _get_curthread(); 547144518Sdavidxu int oldcancel; 548112918Sjeff int ret; 549112918Sjeff 550144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 551112918Sjeff ret = __system(string); 552144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 553112918Sjeff 554112918Sjeff return ret; 555112918Sjeff} 556112918Sjeff 557112918Sjeff__weak_reference(_tcdrain, tcdrain); 558112918Sjeff 559112918Sjeffint 560112918Sjeff_tcdrain(int fd) 561112918Sjeff{ 562144518Sdavidxu struct pthread *curthread = _get_curthread(); 563144518Sdavidxu int oldcancel; 564112918Sjeff int ret; 565112918Sjeff 566144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 567112918Sjeff ret = __tcdrain(fd); 568144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 569112918Sjeff 570144518Sdavidxu return (ret); 571112918Sjeff} 572112918Sjeff 573148658Sdeischen__weak_reference(_usleep, usleep); 574148658Sdeischen 575148658Sdeischenint 576148658Sdeischen_usleep(useconds_t useconds) 577148658Sdeischen{ 578148658Sdeischen struct pthread *curthread = _get_curthread(); 579148658Sdeischen int oldcancel; 580148658Sdeischen int ret; 581148658Sdeischen 582148658Sdeischen oldcancel = _thr_cancel_enter(curthread); 583148658Sdeischen ret = __usleep(useconds); 584148658Sdeischen _thr_cancel_leave(curthread, oldcancel); 585148658Sdeischen 586148658Sdeischen return (ret); 587148658Sdeischen} 588148658Sdeischen 589144518Sdavidxu__weak_reference(_vfork, vfork); 590135301Smtm 591135301Smtmint 592144518Sdavidxu_vfork(void) 593135301Smtm{ 594144518Sdavidxu return (fork()); 595135301Smtm} 596135301Smtm 597112918Sjeff__weak_reference(_wait, wait); 598112918Sjeff 599112918Sjeffpid_t 600112918Sjeff_wait(int *istat) 601112918Sjeff{ 602144518Sdavidxu struct pthread *curthread = _get_curthread(); 603144518Sdavidxu int oldcancel; 604112918Sjeff pid_t ret; 605112918Sjeff 606144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 607112918Sjeff ret = __wait(istat); 608144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 609112918Sjeff 610112918Sjeff return ret; 611112918Sjeff} 612112918Sjeff 613144518Sdavidxu__weak_reference(__wait4, wait4); 614112918Sjeff 615112918Sjeffpid_t 616144518Sdavidxu__wait4(pid_t pid, int *istat, int options, struct rusage *rusage) 617112918Sjeff{ 618144518Sdavidxu struct pthread *curthread = _get_curthread(); 619144518Sdavidxu int oldcancel; 620112918Sjeff pid_t ret; 621112918Sjeff 622144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 623123347Smtm ret = __sys_wait4(pid, istat, options, rusage); 624144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 625112918Sjeff 626112918Sjeff return ret; 627112918Sjeff} 628112918Sjeff 629112918Sjeff__weak_reference(_waitpid, waitpid); 630112918Sjeff 631112918Sjeffpid_t 632112918Sjeff_waitpid(pid_t wpid, int *status, int options) 633112918Sjeff{ 634144518Sdavidxu struct pthread *curthread = _get_curthread(); 635144518Sdavidxu int oldcancel; 636112918Sjeff pid_t ret; 637112918Sjeff 638144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 639112918Sjeff ret = __waitpid(wpid, status, options); 640144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 641112918Sjeff 642112918Sjeff return ret; 643112918Sjeff} 644112918Sjeff 645144518Sdavidxu__weak_reference(__write, write); 646112918Sjeff 647112918Sjeffssize_t 648144518Sdavidxu__write(int fd, const void *buf, size_t nbytes) 649112918Sjeff{ 650144518Sdavidxu struct pthread *curthread = _get_curthread(); 651144518Sdavidxu int oldcancel; 652112918Sjeff ssize_t ret; 653112918Sjeff 654144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 655112918Sjeff ret = __sys_write(fd, buf, nbytes); 656144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 657112918Sjeff 658112918Sjeff return ret; 659112918Sjeff} 660112918Sjeff 661144518Sdavidxu__weak_reference(__writev, writev); 662112918Sjeff 663112918Sjeffssize_t 664144518Sdavidxu__writev(int fd, const struct iovec *iov, int iovcnt) 665112918Sjeff{ 666144518Sdavidxu struct pthread *curthread = _get_curthread(); 667144518Sdavidxu int oldcancel; 668112918Sjeff ssize_t ret; 669112918Sjeff 670144518Sdavidxu oldcancel = _thr_cancel_enter(curthread); 671112918Sjeff ret = __sys_writev(fd, iov, iovcnt); 672144518Sdavidxu _thr_cancel_leave(curthread, oldcancel); 673112918Sjeff 674112918Sjeff return ret; 675112918Sjeff} 676