From d347ec0fc96c1c6ba211ae5e7ca1f412190be2f0 Mon Sep 17 00:00:00 2001 From: Johnothan King Date: Thu, 6 Jan 2022 12:35:44 -0800 Subject: [PATCH] Allow ksh to compile on Haiku; implement SIGKILLTHR support (#408) This commit implements the build fixes required to get ksh running on Haiku. Note that while ksh does compile, it has a ton of regression test failures on Haiku. src/cmd/ksh93/data/signals.c, src/lib/libast/features/signal.c: - Add support for the SIGKILLTHR signal, which is supported by BeOS and Haiku. - SIGINFO was missing an entry in the libast feature test, so add one (re: 658bba74). src/cmd/ksh93/RELEASE: - Add an entry noting that ksh now compiles on Haiku, albeit with many regression test failures. src/cmd/ksh93/{include/terminal.h,sh/path.c}: - Silence compiler warnings on Haiku. src/lib/libast/features/mmap: - The mmap feature test freezes on Haiku, so modify the test to fail immediately on that OS. src/lib/libast/misc/signal.c: - Avoid redefining the signal definition on Haiku to fix a compiler error. src/lib/libast/features/nl_types: - For some reason the nl_item typedef on Haiku doesn't work correctly. Work around that by creating the nl_item type in the libast nl_types feature test. --- NEWS | 7 +++++++ src/cmd/ksh93/README | 1 + src/cmd/ksh93/data/signals.c | 3 +++ src/cmd/ksh93/include/terminal.h | 1 + src/cmd/ksh93/include/version.h | 2 +- src/cmd/ksh93/sh/path.c | 1 + src/lib/libast/features/mmap | 3 +++ src/lib/libast/features/nl_types | 3 +++ src/lib/libast/features/signal.c | 8 ++++++++ src/lib/libast/misc/signal.c | 2 +- 10 files changed, 29 insertions(+), 2 deletions(-) diff --git a/NEWS b/NEWS index 62c1c771f..b97242500 100644 --- a/NEWS +++ b/NEWS @@ -3,6 +3,13 @@ For full details, see the git log at: https://github.com/ksh93/ksh Any uppercase BUG_* names are modernish shell bug IDs. +2021-12-29: + +- Fixed numerous build errors that prevented ksh from running on Haiku OS. + +- Added support for the SIGKILLTHR signal on operating systems that + implement it. + 2021-12-28: - Fixed a bug that caused CDPATH to continue working after unsetting it. diff --git a/src/cmd/ksh93/README b/src/cmd/ksh93/README index 949c49611..f3c9b9247 100644 --- a/src/cmd/ksh93/README +++ b/src/cmd/ksh93/README @@ -277,6 +277,7 @@ failures (crashes, and/or important functionality does not work). *** Windows 7 using Cygwin on x86 *** Windows 10 using Cygwin on x86_64 *** Windows 11 using Cygwin on x86_64 +*** Haiku R1/beta3 on x86_64 #### REPORTING BUGS #### diff --git a/src/cmd/ksh93/data/signals.c b/src/cmd/ksh93/data/signals.c index 59296bb9e..34bb751c9 100644 --- a/src/cmd/ksh93/data/signals.c +++ b/src/cmd/ksh93/data/signals.c @@ -128,6 +128,9 @@ const struct shtable2 shtab_signals[] = #ifdef SIGKILL "KILL", VAL(SIGKILL,0), S("Killed"), #endif /* SIGKILL */ +#ifdef SIGKILLTHR + "KILLTHR", VAL(SIGKILLTHR,SH_SIGDONE), S("Kill Thread"), +#endif /* SIGKILLTHR */ #ifdef SIGLAB "LAB", VAL(SIGLAB,0), S("Security label changed"), #endif /* SIGLAB */ diff --git a/src/cmd/ksh93/include/terminal.h b/src/cmd/ksh93/include/terminal.h index c0897cfc9..a741d28e1 100644 --- a/src/cmd/ksh93/include/terminal.h +++ b/src/cmd/ksh93/include/terminal.h @@ -196,6 +196,7 @@ extern int tty_raw(int,int); extern int tty_check(int); extern int tty_set(int, int, struct termios*); extern int sh_ioctl(int,int,void*,int); +#undef ioctl #define ioctl(a,b,c) sh_ioctl(a,b,c,sizeof(c)) #ifdef _lib_tcgetattr extern int sh_tcgetattr(int,struct termios*); diff --git a/src/cmd/ksh93/include/version.h b/src/cmd/ksh93/include/version.h index 0549bfb5e..8ad076597 100644 --- a/src/cmd/ksh93/include/version.h +++ b/src/cmd/ksh93/include/version.h @@ -21,7 +21,7 @@ #define SH_RELEASE_FORK "93u+m" /* only change if you develop a new ksh93 fork */ #define SH_RELEASE_SVER "1.0.0-beta.2" /* semantic version number: https://semver.org */ -#define SH_RELEASE_DATE "2021-12-28" /* must be in this format for $((.sh.version)) */ +#define SH_RELEASE_DATE "2021-12-29" /* must be in this format for $((.sh.version)) */ #define SH_RELEASE_CPYR "(c) 2020-2021 Contributors to ksh " SH_RELEASE_FORK /* Scripts sometimes field-split ${.sh.version}, so don't change amount of whitespace. */ diff --git a/src/cmd/ksh93/sh/path.c b/src/cmd/ksh93/sh/path.c index 82574609d..1aff73a33 100644 --- a/src/cmd/ksh93/sh/path.c +++ b/src/cmd/ksh93/sh/path.c @@ -1417,6 +1417,7 @@ static noreturn void exscript(register char *path,register char *argv[],char **e if(sh.sigflag[SIGCHLD]==SH_SIGOFF) sh.sigflag[SIGCHLD] = SH_SIGFAULT; siglongjmp(*sh.jmplist,SH_JMPSCRIPT); + UNREACHABLE(); /* silence warning on Haiku */ } #if SHOPT_ACCT diff --git a/src/lib/libast/features/mmap b/src/lib/libast/features/mmap index 934a6d333..8ef44d978 100644 --- a/src/lib/libast/features/mmap +++ b/src/lib/libast/features/mmap @@ -19,6 +19,9 @@ tst lib_mmap note{ standard mmap interface that works }end execute{ int main(int argc, char** argv) { + #ifdef __HAIKU__ + return 1; /* don't even bother, on Haiku it freezes the system */ + #endif caddr_t mm; char *t, *u, *f; int i, fd, okfixed; diff --git a/src/lib/libast/features/nl_types b/src/lib/libast/features/nl_types index 1d1bdcd22..b4d72e160 100644 --- a/src/lib/libast/features/nl_types +++ b/src/lib/libast/features/nl_types @@ -19,6 +19,9 @@ tst output{ printf("#include <%s> /* the native nl_types.h */\n", _nxt_nl_types_str); #endif printf("\n"); + printf("#ifdef __HAIKU__\n"); + printf("typedef int nl_item; /* workaround system header bug */\n"); + printf("#endif\n"); #ifndef NL_SETMAX printf("#undef NL_SETMAX\n"); printf("#define NL_SETMAX 1023\n"); diff --git a/src/lib/libast/features/signal.c b/src/lib/libast/features/signal.c index 17039e119..0bdd883dc 100644 --- a/src/lib/libast/features/signal.c +++ b/src/lib/libast/features/signal.c @@ -120,6 +120,10 @@ static struct _m_ map[] = #define HAD_SIGILL 1 "Illegal instruction", "ILL", SIGILL, #endif +#ifdef SIGINFO +#define HAD_SIGINFO 1 +"Information request", "INFO", SIGINFO, +#endif #ifdef SIGINT #define HAD_SIGINT 1 "Interrupt", "INT", SIGINT, @@ -136,6 +140,10 @@ static struct _m_ map[] = #define HAD_SIGKILL 1 "Killed", "KILL", SIGKILL, #endif +#ifdef SIGKILLTHR +#define HAD_SIGKILLTHR 1 +"Kill Thread", "KILLTHR", SIGKILLTHR, +#endif #ifdef SIGLAB #define HAD_SIGLAB 1 "Security label changed", "LAB", SIGLAB, diff --git a/src/lib/libast/misc/signal.c b/src/lib/libast/misc/signal.c index 235ce9169..201d649df 100644 --- a/src/lib/libast/misc/signal.c +++ b/src/lib/libast/misc/signal.c @@ -26,7 +26,7 @@ * fun==SIG_DFL also unblocks signal */ -#if !_UWIN +#if !_UWIN && !__HAIKU__ #undef signal #define signal ______signal