blob: 4296d4882d7db37e2706918e854e66d1591e5bc8 [file] [log] [blame]
/* -*- Mode: C; tab-width: 8; c-basic-offset: 2; indent-tabs-mode: nil; -*- */
#include "util.h"
static void queue_siginfo(int sig, int val) {
siginfo_t si;
memset(&si, 0, sizeof(si));
si.si_code = SI_QUEUE;
si.si_pid = getpid();
si.si_uid = geteuid();
si.si_value.sival_int = val;
syscall(SYS_rt_sigqueueinfo, getpid(), sig, &si);
}
static void queue_siginfo_tg(int sig, int val) {
siginfo_t si;
memset(&si, 0, sizeof(si));
si.si_code = SI_QUEUE;
si.si_pid = getpid();
si.si_uid = geteuid();
si.si_value.sival_int = val;
syscall(SYS_rt_tgsigqueueinfo, getpid(), getpid(), sig, &si);
}
static int usr1_val;
static int usr2_val;
static void handle_signal(int sig, siginfo_t* si,
__attribute__((unused)) void* ctx) {
int val = si->si_value.sival_int;
if (SIGUSR1 == sig) {
usr1_val = val;
} else if (SIGUSR2 == sig) {
usr2_val = val;
} else {
test_assert("Unexpected signal" && 0);
}
}
int main(void) {
struct sigaction sa;
sa.sa_sigaction = handle_signal;
sigemptyset(&sa.sa_mask);
sa.sa_flags = SA_SIGINFO;
sigaction(SIGUSR1, &sa, NULL);
sigaction(SIGUSR2, &sa, NULL);
queue_siginfo(SIGUSR1, -42);
test_assert(-42 == usr1_val);
queue_siginfo(SIGUSR2, 12345);
test_assert(12345 == usr2_val);
queue_siginfo_tg(SIGUSR1, -43);
test_assert(-43 == usr1_val);
queue_siginfo_tg(SIGUSR2, 123456);
test_assert(123456 == usr2_val);
atomic_puts("EXIT-SUCCESS");
return 0;
}