123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109 |
- #include <unistd.h>
- #include <errno.h>
- #include <signal.h>
- #include <stdio.h>
- #include <Kernel/Syscall.h>
- extern "C" {
- int kill(pid_t pid, int sig)
- {
- int rc = syscall(SC_kill, pid, sig);
- __RETURN_WITH_ERRNO(rc, rc, -1);
- }
- int killpg(int pgrp, int sig)
- {
- int rc = syscall(SC_killpg, pgrp, sig);
- __RETURN_WITH_ERRNO(rc, rc, -1);
- }
- int raise(int sig)
- {
- // FIXME: Support multi-threaded programs.
- return kill(getpid(), sig);
- }
- sighandler_t signal(int signum, sighandler_t handler)
- {
- struct sigaction new_act;
- struct sigaction old_act;
- new_act.sa_handler = handler;
- new_act.sa_flags = 0;
- new_act.sa_mask = 0;
- new_act.sa_restorer = nullptr;
- int rc = sigaction(signum, &new_act, &old_act);
- if (rc < 0)
- return SIG_ERR;
- return old_act.sa_handler;
- }
- int sigaction(int signum, const struct sigaction* act, struct sigaction* old_act)
- {
- int rc = syscall(SC_sigaction, signum, act, old_act);
- __RETURN_WITH_ERRNO(rc, rc, -1);
- }
- int sigemptyset(sigset_t* set)
- {
- *set = 0;
- return 0;
- }
- int sigfillset(sigset_t* set)
- {
- *set = 0xffffffff;
- return 0;
- }
- int sigaddset(sigset_t* set, int sig)
- {
- if (sig < 1 || sig > 32) {
- errno = EINVAL;
- return -1;
- }
- *set |= 1 << (sig);
- return 0;
- }
- int sigdelset(sigset_t* set, int sig)
- {
- if (sig < 1 || sig > 32) {
- errno = EINVAL;
- return -1;
- }
- *set &= ~(1 << (sig));
- return 0;
- }
- int sigismember(const sigset_t* set, int sig)
- {
- if (sig < 1 || sig > 32) {
- errno = EINVAL;
- return -1;
- }
- if (*set & (1 << (sig)))
- return 1;
- return 0;
- }
- int sigprocmask(int how, const sigset_t* set, sigset_t* old_set)
- {
- int rc = syscall(SC_sigprocmask, how, set, old_set);
- __RETURN_WITH_ERRNO(rc, rc, -1);
- }
- int sigpending(sigset_t* set)
- {
- int rc = syscall(SC_sigpending, set);
- __RETURN_WITH_ERRNO(rc, rc, -1);
- }
- const char* sys_siglist[NSIG] = {
- #undef __SIGNAL
- #define __SIGNAL(a, b) b,
- __ENUMERATE_ALL_SIGNALS
- #undef __SIGNAL
- };
- }
|