diff --git a/Makefile b/Makefile index 348519c..2e78b93 100644 --- a/Makefile +++ b/Makefile @@ -63,8 +63,8 @@ $(O)/obj/crt%.o: crt/crt%.c $(HEADERS) ### lib $(O)/lib/libc.a: $(OBJ_LIBC) - $(CROSS_COMPILE)ar rcs $@ - $(foreach obj,$(OBJ_LIBC), \ + @$(CROSS_COMPILE)ar rcs $@ + @$(foreach obj,$(OBJ_LIBC), \ $(CROSS_COMPILE)ar rs $@ $(obj); \ ) diff --git a/include/_libc/signal.h b/include/_libc/signal.h index c6258bd..c6ebf82 100644 --- a/include/_libc/signal.h +++ b/include/_libc/signal.h @@ -1,4 +1,6 @@ #pragma once +#include #define __LIBC_SIGNAL_STACK_SIZE 4096 +sighandler_t __libc_signal(int signum, sighandler_t h); void __libc_signal_init(void); diff --git a/include/sys/wait.h b/include/sys/wait.h new file mode 100644 index 0000000..48fb7db --- /dev/null +++ b/include/sys/wait.h @@ -0,0 +1,5 @@ +#pragma once +#include +#include + +pid_t waitpid(pid_t pid, int *status, int flags); diff --git a/src/signal/impl.c b/src/signal/impl.c index 63eeffe..03530d9 100644 --- a/src/signal/impl.c +++ b/src/signal/impl.c @@ -29,6 +29,16 @@ static _Noreturn void __libc_signal_handle(int signum) { while (1); } +sighandler_t __libc_signal(int signum, sighandler_t s) { + if (signum >= NSIG || signum <= 0) { + exit(-1); + } + + sighandler_t old = signal_handlers[signum]; + signal_handlers[signum] = s; + return old; +} + void __libc_signal_init(void) { stack_t ss; void *sig_stack; diff --git a/src/signal/kill.c b/src/signal/kill.c new file mode 100644 index 0000000..432e2c8 --- /dev/null +++ b/src/signal/kill.c @@ -0,0 +1,8 @@ +#include <_libc/syscalls.h> +#include +#include +#include + +int kill(pid_t pid, int signum) { + return SET_ERRNO(int, __syscall2(SYSCALL_NR_KILL, pid, signum)); +} diff --git a/src/signal/signal.c b/src/signal/signal.c index e69de29..099f350 100644 --- a/src/signal/signal.c +++ b/src/signal/signal.c @@ -0,0 +1,5 @@ +#include <_libc/signal.h> + +sighandler_t signal(int signum, sighandler_t s) { + return __libc_signal(signum, s); +} diff --git a/src/sys/wait/waitpid.c b/src/sys/wait/waitpid.c new file mode 100644 index 0000000..8125785 --- /dev/null +++ b/src/sys/wait/waitpid.c @@ -0,0 +1,8 @@ +#include <_libc/syscalls.h> +#include +#include +#include + +pid_t waitpid(pid_t pid, int *status, int opt) { + return SET_ERRNO(pid_t, __syscall3(SYSCALL_NRX_WAITPID, pid, (long) status, opt)); +}