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)
--- /dev/null
+#include <corax/errno.h>
+#include <signal.h>
+#include <string.h>
+
+/* 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);
+}