mirror of
https://github.com/EnderIce2/Fennix.git
synced 2025-05-30 00:07:59 +00:00
userspace/libc: implement sigaction(), sigemptyset(), signal() & strcspn()
Signed-off-by: EnderIce2 <enderice2@protonmail.com>
This commit is contained in:
parent
1b55332027
commit
833d8d497a
@ -197,14 +197,14 @@ extern "C"
|
|||||||
int pthread_sigmask(int, const sigset_t *restrict, sigset_t *restrict);
|
int pthread_sigmask(int, const sigset_t *restrict, sigset_t *restrict);
|
||||||
int raise(int);
|
int raise(int);
|
||||||
int sig2str(int, char *);
|
int sig2str(int, char *);
|
||||||
int sigaction(int, const struct sigaction *restrict, struct sigaction *restrict);
|
int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact);
|
||||||
int sigaddset(sigset_t *, int);
|
int sigaddset(sigset_t *, int);
|
||||||
int sigaltstack(const stack_t *restrict, stack_t *restrict);
|
int sigaltstack(const stack_t *restrict, stack_t *restrict);
|
||||||
int sigdelset(sigset_t *, int);
|
int sigdelset(sigset_t *, int);
|
||||||
int sigemptyset(sigset_t *);
|
int sigemptyset(sigset_t *set);
|
||||||
int sigfillset(sigset_t *);
|
int sigfillset(sigset_t *);
|
||||||
int sigismember(const sigset_t *, int);
|
int sigismember(const sigset_t *, int);
|
||||||
void (*signal(int, void (*)(int)))(int);
|
void (*signal(int sig, void (*func)(int)))(int);
|
||||||
int sigpending(sigset_t *);
|
int sigpending(sigset_t *);
|
||||||
int sigprocmask(int, const sigset_t *restrict, sigset_t *restrict);
|
int sigprocmask(int, const sigset_t *restrict, sigset_t *restrict);
|
||||||
int sigqueue(pid_t, int, union sigval);
|
int sigqueue(pid_t, int, union sigval);
|
||||||
|
@ -41,7 +41,7 @@ extern "C"
|
|||||||
int strcoll(const char *, const char *);
|
int strcoll(const char *, const char *);
|
||||||
int strcoll_l(const char *, const char *, locale_t);
|
int strcoll_l(const char *, const char *, locale_t);
|
||||||
char *strcpy(char *restrict, const char *restrict);
|
char *strcpy(char *restrict, const char *restrict);
|
||||||
size_t strcspn(const char *, const char *);
|
size_t strcspn(const char *s1, const char *s2);
|
||||||
char *strdup(const char *);
|
char *strdup(const char *);
|
||||||
char *strerror(int);
|
char *strerror(int);
|
||||||
char *strerror_l(int, locale_t);
|
char *strerror_l(int, locale_t);
|
||||||
|
@ -16,6 +16,8 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include <signal.h>
|
#include <signal.h>
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
export int kill(pid_t pid, int sig)
|
export int kill(pid_t pid, int sig)
|
||||||
{
|
{
|
||||||
@ -29,14 +31,65 @@ export int pthread_kill(pthread_t, int);
|
|||||||
export int pthread_sigmask(int, const sigset_t *restrict, sigset_t *restrict);
|
export int pthread_sigmask(int, const sigset_t *restrict, sigset_t *restrict);
|
||||||
export int raise(int);
|
export int raise(int);
|
||||||
export int sig2str(int, char *);
|
export int sig2str(int, char *);
|
||||||
export int sigaction(int, const struct sigaction *restrict, struct sigaction *restrict);
|
|
||||||
|
export int sigaction(int sig, const struct sigaction *restrict act, struct sigaction *restrict oact)
|
||||||
|
{
|
||||||
|
if (sig == SIGKILL || sig == SIGSTOP)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (oact != NULL)
|
||||||
|
{
|
||||||
|
printf("sigaction() is unimplemented\n");
|
||||||
|
// if (syscall3(SYS_RT_SIGACTION, sig, NULL, oact, sizeof(sigset_t)) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (act != NULL)
|
||||||
|
{
|
||||||
|
printf("sigaction() is unimplemented\n");
|
||||||
|
// if (syscall3(SYS_RT_SIGACTION, sig, act, NULL, sizeof(sigset_t)) < 0)
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
export int sigaddset(sigset_t *, int);
|
export int sigaddset(sigset_t *, int);
|
||||||
export int sigaltstack(const stack_t *restrict, stack_t *restrict);
|
export int sigaltstack(const stack_t *restrict, stack_t *restrict);
|
||||||
export int sigdelset(sigset_t *, int);
|
export int sigdelset(sigset_t *, int);
|
||||||
export int sigemptyset(sigset_t *);
|
|
||||||
|
export int sigemptyset(sigset_t *set)
|
||||||
|
{
|
||||||
|
if (set == NULL)
|
||||||
|
{
|
||||||
|
errno = EINVAL;
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
*set = 0;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
export int sigfillset(sigset_t *);
|
export int sigfillset(sigset_t *);
|
||||||
export int sigismember(const sigset_t *, int);
|
export int sigismember(const sigset_t *, int);
|
||||||
export void (*signal(int, void (*)(int)))(int);
|
|
||||||
|
export void (*signal(int sig, void (*func)(int)))(int)
|
||||||
|
{
|
||||||
|
struct sigaction act, oact;
|
||||||
|
|
||||||
|
act.sa_handler = func;
|
||||||
|
sigemptyset(&act.sa_mask);
|
||||||
|
act.sa_flags = 0;
|
||||||
|
|
||||||
|
if (sigaction(sig, &act, &oact) < 0)
|
||||||
|
return SIG_ERR;
|
||||||
|
|
||||||
|
return oact.sa_handler;
|
||||||
|
}
|
||||||
|
|
||||||
export int sigpending(sigset_t *);
|
export int sigpending(sigset_t *);
|
||||||
export int sigprocmask(int, const sigset_t *restrict, sigset_t *restrict);
|
export int sigprocmask(int, const sigset_t *restrict, sigset_t *restrict);
|
||||||
export int sigqueue(pid_t, int, union sigval);
|
export int sigqueue(pid_t, int, union sigval);
|
||||||
|
@ -75,7 +75,24 @@ export int strcmp(const char *s1, const char *s2)
|
|||||||
export int strcoll(const char *, const char *);
|
export int strcoll(const char *, const char *);
|
||||||
export int strcoll_l(const char *, const char *, locale_t);
|
export int strcoll_l(const char *, const char *, locale_t);
|
||||||
export char *strcpy(char *restrict, const char *restrict);
|
export char *strcpy(char *restrict, const char *restrict);
|
||||||
export size_t strcspn(const char *, const char *);
|
|
||||||
|
export size_t strcspn(const char *s1, const char *s2)
|
||||||
|
{
|
||||||
|
const char *p = s1;
|
||||||
|
const char *spanp;
|
||||||
|
char c, sc;
|
||||||
|
|
||||||
|
while ((c = *p++) != 0)
|
||||||
|
{
|
||||||
|
for (spanp = s2; (sc = *spanp++) != 0;)
|
||||||
|
{
|
||||||
|
if (sc == c)
|
||||||
|
return p - 1 - s1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return p - 1 - s1;
|
||||||
|
}
|
||||||
|
|
||||||
export char *strdup(const char *);
|
export char *strdup(const char *);
|
||||||
export char *strerror(int);
|
export char *strerror(int);
|
||||||
export char *strerror_l(int, locale_t);
|
export char *strerror_l(int, locale_t);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user