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