Compat work towards making bash-5.0 build with less patches.

Hacked implementations of sigsetjmp() and siglongjmp(). I didn't know about
these APIs until just now, but I hope I got them right.
This commit is contained in:
Andreas Kling 2019-02-26 14:05:28 +01:00
parent 4a5b474f1d
commit e0c1541847
Notes: sideshowbarker 2024-07-19 15:37:17 +09:00
7 changed files with 46 additions and 3 deletions

View file

@ -1968,7 +1968,9 @@ int Process::sys$select(const Syscall::SC_select_params* params)
auto* timeout = params->timeout;
// FIXME: Implement exceptfds support.
ASSERT(!exceptfds);
//ASSERT(!exceptfds);
if (exceptfds)
kprintf("%s(%u): FIXME: select() with exceptfds\n", name().characters(), pid());
if (timeout) {
m_select_timeout = *timeout;

View file

@ -13,7 +13,9 @@ enum {
};
struct lconv {
char *decimal_point;
char* decimal_point;
char* thousands_sep;
char* grouping;
};
struct lconv* localeconv();

View file

@ -2,12 +2,24 @@
#include <sys/cdefs.h>
#include <sys/types.h>
#include <stdint.h>
#include <signal.h>
#include <stdbool.h>
__BEGIN_DECLS
typedef uint32_t jmp_buf[6];
struct __jmp_buf {
uint32_t regs[6];
bool did_save_signal_mask;
sigset_t saved_signal_mask;
};
typedef struct __jmp_buf jmp_buf[1];
int setjmp(jmp_buf);
void longjmp(jmp_buf, int val);
int sigsetjmp(jmp_buf, int savesigs);
void siglongjmp(jmp_buf, int val);
__END_DECLS

View file

@ -2,6 +2,8 @@
#include <errno.h>
#include <signal.h>
#include <stdio.h>
#include <setjmp.h>
#include <assert.h>
#include <Kernel/Syscall.h>
extern "C" {
@ -106,4 +108,24 @@ const char* sys_siglist[NSIG] = {
#undef __SIGNAL
};
int sigsetjmp(jmp_buf env, int savesigs)
{
if (savesigs) {
int rc = sigprocmask(0, nullptr, &env->saved_signal_mask);
assert(rc == 0);
env->did_save_signal_mask = true;
} else {
env->did_save_signal_mask = false;
}
return setjmp(env);
}
void siglongjmp(jmp_buf env, int val)
{
if (env->did_save_signal_mask) {
int rc = sigprocmask(SIG_SETMASK, &env->saved_signal_mask, nullptr);
assert(rc == 0);
}
longjmp(env, val);
}
}

View file

@ -1,5 +1,7 @@
#pragma once
#ifndef __cplusplus
#include <sys/cdefs.h>
__BEGIN_DECLS
@ -11,3 +13,4 @@ __BEGIN_DECLS
__END_DECLS
#endif

View file

@ -2,6 +2,7 @@
#include <sys/cdefs.h>
#include <sys/types.h>
#include <stddef.h>
__BEGIN_DECLS

View file

@ -35,6 +35,7 @@ gid_t getegid();
uid_t getuid();
gid_t getgid();
pid_t getpid();
pid_t getppid();
int getgroups(int size, gid_t list[]);
int setgroups(size_t, const gid_t*);
int setuid(uid_t);