138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin/* 238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Copyright (c) 2015 Dmitry V. Levin <ldv@altlinux.org> 338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * All rights reserved. 438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * Redistribution and use in source and binary forms, with or without 638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * modification, are permitted provided that the following conditions 738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * are met: 838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1. Redistributions of source code must retain the above copyright 938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * notice, this list of conditions and the following disclaimer. 1038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 2. Redistributions in binary form must reproduce the above copyright 1138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * notice, this list of conditions and the following disclaimer in the 1238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * documentation and/or other materials provided with the distribution. 1338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 3. The name of the author may not be used to endorse or promote products 1438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * derived from this software without specific prior written permission. 1538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * 1638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 1738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 1838a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 1938a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 2038a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 2138a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2238a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2338a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2438a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 2538a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2638a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin */ 2738a34c9349267c99ce1ddbd0b6e985147415d355Dmitry V. Levin 28d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin#ifdef HAVE_CONFIG_H 29d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin# include "config.h" 30d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin#endif 31d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 32d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin#include <poll.h> 33d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin#include <signal.h> 34d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin#include <unistd.h> 35d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 36d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levinstatic int 37d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levintest1(void) 38d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin{ 39d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin sigset_t mask; 40d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin const struct timespec timeout = { .tv_sec = 42, .tv_nsec = 999999999 }; 41d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin struct pollfd fds[] = { 42d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin { .fd = 0, .events = POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND }, 43d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin { .fd = 1, .events = POLLOUT | POLLWRNORM | POLLWRBAND }, 44d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin { .fd = 3, .events = POLLIN | POLLPRI }, 45d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin { .fd = 4, .events = POLLOUT } 46d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin }; 47d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 48d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin sigemptyset(&mask); 49d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin sigaddset(&mask, SIGUSR2); 50d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin sigaddset(&mask, SIGCHLD); 51d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 52d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin return ppoll(fds, sizeof(fds) / sizeof(*fds), &timeout, &mask) == 2 ? 0 : 77; 53d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin} 54d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 55d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levinstatic int 56d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levintest2(void) 57d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin{ 58d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin sigset_t mask; 59d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin const struct timespec timeout = { .tv_sec = 0, .tv_nsec = 999 }; 60d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin struct pollfd fds[] = { 61d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin { .fd = 1, .events = POLLIN | POLLPRI | POLLRDNORM | POLLRDBAND }, 62d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin { .fd = 0, .events = POLLOUT | POLLWRNORM | POLLWRBAND } 63d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin }; 64d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 65d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin sigfillset(&mask); 660c0453a1cb5b945d8c791de9a7bf15d6c3089769Dmitry V. Levin sigdelset(&mask, SIGHUP); 67d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin sigdelset(&mask, SIGKILL); 68d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin sigdelset(&mask, SIGSTOP); 69d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 70d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin return ppoll(fds, sizeof(fds) / sizeof(*fds), &timeout, &mask) == 0 ? 0 : 77; 71d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin} 72d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 73d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levinint 74d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levinmain(void) 75d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin{ 76d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin int rc; 77d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin int fds[2]; 78d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 79d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin (void) close(0); 80d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin (void) close(1); 81d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin (void) close(3); 82d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin (void) close(4); 83d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin if (pipe(fds) || pipe(fds)) 84d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin return 77; 85d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 86d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 87d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin if ((rc = test1())) 88d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin return rc; 89d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 90d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin if ((rc = test2())) 91d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin return rc; 92d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin 93d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin return ppoll(NULL, 42, NULL, NULL) < 0 ? 0 : 77; 94d9fb450748bcb413be09f705958c6335f22fca62Dmitry V. Levin} 95