From 4392f538b5214b284e94894ac454d05202e7fc67 Mon Sep 17 00:00:00 2001 From: Matthias Kruk Date: Fri, 1 May 2020 18:41:09 +0900 Subject: [PATCH] libc: Add signal handling code from klibc --- libc/Makefile | 2 +- libc/signal.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 libc/signal.c diff --git a/libc/Makefile b/libc/Makefile index f10ed46..9e7b07a 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -1,5 +1,5 @@ OUTPUT = libc.a -OBJECTS = syscall.o string.o +OBJECTS = syscall.o string.o signal.o PHONY = clean INCLUDES = -I../include CFLAGS = -m32 -Wall -nostdlib -nodefaultlibs -nostartfiles -ffreestanding $(INCLUDES) diff --git a/libc/signal.c b/libc/signal.c new file mode 100644 index 0000000..07891fa --- /dev/null +++ b/libc/signal.c @@ -0,0 +1,77 @@ +#include +#include +#include + +/* FIXME: Update errno so that callers can tell what went wrong */ + +#define __SIGIDX(i) ((i) / (sizeof(((sigset_t*)0)->val[0]) * 8)) +#define __SIGBIT(i) ((i) & ((sizeof(((sigset_t*)0)->val[0]) * 8) - 1)) + +int sigemptyset(sigset_t *set) +{ + int error; + + error = EINVAL; + + if(set) { + memset(set, 0, sizeof(*set)); + error = 0; + } + + return(error ? -1 : 0); +} + +int sigfillset(sigset_t *set) +{ + int error; + + error = EINVAL; + + if(set) { + memset(set, 0xff, sizeof(*set)); + error = 0; + } + + return(error ? -1 : 0); +} + +int sigaddset(sigset_t *set, int sig) +{ + int error; + + error = EINVAL; + + if(set) { + set->val[__SIGIDX(sig)] |= (1 << __SIGBIT(sig)); + error = 0; + } + + return(error ? -1 : 0); +} + +int sigdelset(sigset_t *set, int sig) +{ + int error; + + error = EINVAL; + + if(set) { + set->val[__SIGIDX(sig)] &= ~(1 << __SIGBIT(sig)); + error = 0; + } + + return(error ? -1 : 0); +} + +int sigismember(const sigset_t *set, int sig) +{ + int ret_val; + + ret_val = -1; + + if(set) { + ret_val = set->val[__SIGIDX(sig)] & (1 << __SIGBIT(sig)) ? 1 : 0; + } + + return(ret_val); +} -- 2.47.3