1/* $OpenBSD: sigwait.c,v 1.1 2019/01/12 00:16:03 jca Exp $ */ 2/* 3 * Copyright (c) 2005 Ted Unangst <tedu@openbsd.org> 4 * All Rights Reserved. 5 * 6 * Permission to use, copy, modify, and distribute this software for any 7 * purpose with or without fee is hereby granted, provided that the above 8 * copyright notice and this permission notice appear in all copies. 9 * 10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17 */ 18/* 19 * signals 20 */ 21 22#include <signal.h> 23#include <errno.h> 24 25#include <pthread.h> 26 27#include "thread/rthread.h" 28#include "cancel.h" /* in libc/include */ 29 30int 31sigwait(const sigset_t *set, int *sig) 32{ 33 sigset_t s = *set; 34 int ret; 35 36 sigdelset(&s, SIGTHR); 37 do { 38 ENTER_CANCEL_POINT(1); 39 ret = __thrsigdivert(s, NULL, NULL); 40 LEAVE_CANCEL_POINT(ret == -1); 41 } while (ret == -1 && errno == EINTR); 42 if (ret == -1) 43 return (errno); 44 *sig = ret; 45 return (0); 46} 47 48#if 0 /* need kernel to fill in more siginfo_t bits first */ 49int 50sigwaitinfo(const sigset_t *set, siginfo_t *info) 51{ 52 sigset_t s = *set; 53 int ret; 54 55 sigdelset(&s, SIGTHR); 56 ENTER_CANCEL_POINT(1); 57 ret = __thrsigdivert(s, info, NULL); 58 LEAVE_CANCEL_POINT(ret == -1); 59 return (ret); 60} 61 62int 63sigtimedwait(const sigset_t *set, siginfo_t *info, 64 const struct timespec *timeout) 65{ 66 sigset_t s = *set; 67 int ret; 68 69 sigdelset(&s, SIGTHR); 70 ENTER_CANCEL_POINT(1); 71 ret = __thrsigdivert(s, info, timeout); 72 LEAVE_CANCEL_POINT(ret == -1); 73 return (ret); 74} 75#endif 76