#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include "common.h"
int
main(void)
{
int err;
ssize_t sz;
signalfd_siginfo_t info[3];
const int fd = test_basic_prep(0);
sz = read(fd, info, sizeof (signalfd_siginfo_t) - 1);
err = errno;
if (sz != -1 || errno != EINVAL) {
test_fail("expected EINVAL for too-small read, "
"found res=%ld errno=%d", sz, err);
}
const int pid = getpid();
assert(kill(pid, SIGUSR1) == 0);
sz = read(fd, info, sizeof (signalfd_siginfo_t));
err = errno;
if (sz != sizeof (signalfd_siginfo_t)) {
test_fail("bad read result, found sz=%ld errno=%d", sz, err);
}
if (info[0].ssi_signo != SIGUSR1) {
test_fail("bad ssi_signo %d != %d", info[0].ssi_signo, SIGUSR1);
}
struct sigevent sigev = {
.sigev_notify = SIGEV_SIGNAL,
.sigev_signo = SIGALRM,
};
timer_t tid;
struct itimerspec its_1ms = {
.it_value = {
.tv_sec = 0,
.tv_nsec = MSEC2NSEC(1),
}
};
assert(timer_create(CLOCK_HIGHRES, &sigev, &tid) == 0);
assert(timer_settime(tid, 0, &its_1ms, NULL) == 0);
sz = read(fd, info, sizeof (signalfd_siginfo_t));
err = errno;
if (sz != sizeof (signalfd_siginfo_t)) {
test_fail("bad read result, found sz=%ld errno=%d", sz, err);
}
if (info[0].ssi_signo != SIGALRM) {
test_fail("bad ssi_signo %d != %d", info[0].ssi_signo, SIGALRM);
}
assert(kill(pid, SIGUSR1) == 0);
assert(kill(pid, SIGUSR2) == 0);
sz = read(fd, info, sizeof (info));
err = errno;
if (sz != (2 * sizeof (signalfd_siginfo_t))) {
test_fail("bad read result, found sz=%ld errno=%d", sz, err);
}
if (info[0].ssi_signo != SIGUSR1) {
test_fail("bad ssi_signo %d != %d", info[0].ssi_signo, SIGUSR1);
}
if (info[1].ssi_signo != SIGUSR2) {
test_fail("bad ssi_signo %d != %d", info[1].ssi_signo, SIGUSR2);
}
test_pass();
}