/* * Low-level extraction code to overcome rust's libc not having the best access * to siginfo_t details. */ #include #include #include struct Const { int native; // The signal this applies to, or -1 if it applies to anything. int signal; uint8_t translated; }; // Warning: must be in sync with the rust source code struct Const consts[] = { #ifdef SI_KERNEL { SI_KERNEL, -1, 1 }, #endif { SI_USER, -1, 2 }, #ifdef SI_TKILL { SI_TKILL, -1, 3 }, #endif { SI_QUEUE, -1, 4 }, #ifdef SI_MESGQ { SI_MESGQ, -1, 5 }, #endif { CLD_EXITED, SIGCHLD, 6 }, { CLD_KILLED, SIGCHLD, 7 }, { CLD_DUMPED, SIGCHLD, 8 }, { CLD_TRAPPED, SIGCHLD, 9 }, { CLD_STOPPED, SIGCHLD, 10 }, { CLD_CONTINUED, SIGCHLD, 11 }, }; uint8_t sighook_signal_cause(const siginfo_t *info) { const size_t const_len = sizeof consts / sizeof *consts; size_t i; for (i = 0; i < const_len; i ++) { if ( consts[i].native == info->si_code && (consts[i].signal == -1 || consts[i].signal == info->si_signo) ) { return consts[i].translated; } } return 0; // The "Unknown" variant } pid_t sighook_signal_pid(const siginfo_t *info) { return info->si_pid; } uid_t sighook_signal_uid(const siginfo_t *info) { return info->si_uid; }