diff -ruwN source/bashline.c source-new/bashline.c
--- source/bashline.c	2022-04-18 05:37:12.000000000 +0700
+++ source-new/bashline.c	2025-09-01 04:36:35.272926519 +0700
@@ -2645,7 +2645,7 @@
      const char *text;
      int state;
 {
-#if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GRP_H)
+#if defined (__WIN32__) || defined (__OPENNT) || !defined (HAVE_GRP_H) || defined(__redox__)
   return ((char *)NULL);
 #else
   static char *gname = (char *)NULL;
diff -ruwN source/builtins/ulimit.def source-new/builtins/ulimit.def
--- source/builtins/ulimit.def	2021-11-05 20:19:53.000000000 +0700
+++ source-new/builtins/ulimit.def	2025-09-01 04:36:35.272926519 +0700
@@ -609,7 +609,7 @@
       }
   else
     {
-#if defined (HAVE_RESOURCE)
+#if defined (HAVE_RESOURCE) && !defined(__redox__)
       if (getrlimit (limits[ind].parameter, &limit) < 0)
 	return -1;
 #  if defined (HPUX9)
diff -ruwN source/config-top.h source-new/config-top.h
--- source/config-top.h	2021-11-05 20:11:12.000000000 +0700
+++ source-new/config-top.h	2025-09-19 21:55:55.439030906 +0700
@@ -199,3 +199,6 @@
 /* Undefine or define to 0 if you don't want to allow associative array
    assignment using a compound list of key-value pairs. */
 #define ASSOC_KVPAIR_ASSIGNMENT 1
+
+/* Don't check for a valid inode number when pattern matching on Redox */
+#define BROKEN_DIRENT_D_INO 1
diff -ruwN source/configure source-new/configure
--- source/configure	2022-09-23 21:13:22.000000000 +0700
+++ source-new/configure	2025-09-01 04:52:47.542177017 +0700
@@ -3298,6 +3298,7 @@
 *-nsk*)		opt_bash_malloc=no ;;	# HP NonStop
 *-haiku*)	opt_bash_malloc=no ;;	# Haiku OS
 *-genode*)	opt_bash_malloc=no ;;	# Genode has no sbrk
+*-redox*)	opt_bash_malloc=no ;;	# Redox OS
 esac
 
 # memory scrambling on free()
diff -ruwN source/configure.ac source-new/configure.ac
--- source/configure.ac	2022-09-23 21:12:27.000000000 +0700
+++ source-new/configure.ac	2025-09-01 04:36:35.275926660 +0700
@@ -92,6 +92,7 @@
 *-nsk*)		opt_bash_malloc=no ;;	# HP NonStop
 *-haiku*)	opt_bash_malloc=no ;;	# Haiku OS
 *-genode*)	opt_bash_malloc=no ;;	# Genode has no sbrk
+*-redox*)	opt_bash_malloc=no ;;	# Redox OS
 esac
 
 # memory scrambling on free()
diff -ruwN source/execute_cmd.c source-new/execute_cmd.c
--- source/execute_cmd.c	2022-12-14 00:09:02.000000000 +0700
+++ source-new/execute_cmd.c	2025-09-01 04:36:35.275926660 +0700
@@ -1379,11 +1379,11 @@
   nullcmd = (command == 0) || (command->type == cm_simple && command->value.Simple->words == 0 && command->value.Simple->redirects == 0);
   if (posixly_correct && nullcmd)
     {
-#if defined (HAVE_GETRUSAGE)
+#if defined (HAVE_GETRUSAGE) && defined (HAVE_GETTIMEOFDAY)
       selfb.ru_utime.tv_sec = kidsb.ru_utime.tv_sec = selfb.ru_stime.tv_sec = kidsb.ru_stime.tv_sec = 0;
       selfb.ru_utime.tv_usec = kidsb.ru_utime.tv_usec = selfb.ru_stime.tv_usec = kidsb.ru_stime.tv_usec = 0;
       before = shellstart;
-#else
+#elif defined (HAVE_TIMES)
       before.tms_utime = before.tms_stime = before.tms_cutime = before.tms_cstime = 0;
       tbefore = shell_start_time;
 #endif
diff -ruwN source/general.c source-new/general.c
--- source/general.c	2022-11-24 05:10:12.000000000 +0700
+++ source-new/general.c	2025-09-19 17:09:24.754782168 +0700
@@ -589,6 +589,7 @@
 void
 check_dev_tty ()
 {
+#if !defined(__redox__)
   int tty_fd;
   char *tty;
 
@@ -603,6 +604,7 @@
     }
   if (tty_fd >= 0)
     close (tty_fd);
+#endif
 }
 
 /* Return 1 if PATH1 and PATH2 are the same file.  This is kind of
diff -ruwN source/include/posixwait.h source-new/include/posixwait.h
--- source/include/posixwait.h	2019-03-30 00:25:52.000000000 +0700
+++ source-new/include/posixwait.h	2025-09-01 04:36:35.276926707 +0700
@@ -34,7 +34,7 @@
 
 /* How to get the status of a job.  For Posix, this is just an
    int, but for other systems we have to crack the union wait. */
-#if !defined (_POSIX_VERSION)
+#if 0
 typedef union wait WAIT;
 #  define WSTATUS(t)  (t.w_status)
 #else /* _POSIX_VERSION */
@@ -50,7 +50,7 @@
 
 /* More Posix P1003.1 definitions.  In the POSIX versions, the parameter is
    passed as an `int', in the non-POSIX version, as `union wait'. */
-#if defined (_POSIX_VERSION)
+#if 1
 
 #  if !defined (WSTOPSIG)
 #    define WSTOPSIG(s)       ((s) >> 8)
diff -ruwN source/include/timer.h source-new/include/timer.h
--- source/include/timer.h	2021-03-09 04:30:55.000000000 +0700
+++ source-new/include/timer.h	2026-05-13 08:32:53.062805289 +0700
@@ -22,6 +22,7 @@
 #include "config.h"
 #endif
 
+#include <sys/time.h>
 #include "bashjmp.h"
 typedef struct _shtimer
 {
diff -ruwN source/jobs.c source-new/jobs.c
--- source/jobs.c	2022-12-14 00:09:02.000000000 +0700
+++ source-new/jobs.c	2026-02-09 23:29:28.811403291 +0700
@@ -4417,9 +4417,11 @@
 	{
 	  shell_pgrp = getpid ();
 	  setpgid (0, shell_pgrp);
+  }
+
+    // shell pgrep is not set automatically on Redox
 	  if (shell_tty != -1)
 	    tcsetpgrp (shell_tty, shell_pgrp);
-	}
 
       tty_sigs = 0;
       while ((terminal_pgrp = tcgetpgrp (shell_tty)) != -1)
diff -ruwN source/lib/readline/input.c source-new/lib/readline/input.c
--- source/lib/readline/input.c	2022-04-09 02:43:24.000000000 +0700
+++ source-new/lib/readline/input.c	2025-09-01 04:36:35.276926707 +0700
@@ -805,7 +805,7 @@
   int result;
   unsigned char c;
   int fd;
-#if defined (HAVE_PSELECT)
+#if defined (HAVE_PSELECT) || defined (HAVE_SELECT)
   sigset_t empty_set;
   fd_set readfds;
 #endif
diff -ruwN source/lib/readline/terminal.c source-new/lib/readline/terminal.c
--- source/lib/readline/terminal.c	2022-04-05 21:44:17.000000000 +0700
+++ source-new/lib/readline/terminal.c	2025-09-01 04:36:35.286927174 +0700
@@ -102,7 +102,7 @@
 
 static int tcap_initialized;
 
-#if !defined (__linux__) && !defined (NCURSES_VERSION)
+#if !defined (__linux__) && !defined (NCURSES_VERSION) && !defined (__redox__)
 #  if defined (__EMX__) || defined (NEED_EXTERN_PC)
 extern 
 #  endif /* __EMX__ || NEED_EXTERN_PC */
diff -ruwN source/lib/sh/getcwd.c source-new/lib/sh/getcwd.c
--- source/lib/sh/getcwd.c	2012-03-10 22:48:50.000000000 +0700
+++ source-new/lib/sh/getcwd.c	2025-09-01 04:36:35.286927174 +0700
@@ -20,7 +20,7 @@
 
 #include <config.h>
 
-#if !defined (HAVE_GETCWD)
+#if !defined (HAVE_GETCWD) && !defined(__redox__)
 
 #if !defined (__GNUC__) && !defined (HAVE_ALLOCA_H) && defined (_AIX)
   #pragma alloca
diff -ruwN source/lib/sh/input_avail.c source-new/lib/sh/input_avail.c
--- source/lib/sh/input_avail.c	2021-05-24 22:16:33.000000000 +0700
+++ source-new/lib/sh/input_avail.c	2025-09-01 04:36:35.298927735 +0700
@@ -33,7 +33,7 @@
 #  include <sys/file.h>
 #endif /* HAVE_SYS_FILE_H */
 
-#if defined (HAVE_PSELECT)
+#if defined (HAVE_PSELECT) || defined (HAVE_SELECT)
 #  include <signal.h>
 #endif
 
diff -ruwN source/lib/sh/random.c source-new/lib/sh/random.c
--- source/lib/sh/random.c	2020-05-30 01:21:10.000000000 +0700
+++ source-new/lib/sh/random.c	2026-05-13 08:34:01.486529163 +0700
@@ -32,6 +32,7 @@
 #include "filecntl.h"
 
 #include <stdio.h>
+#include <sys/time.h>
 #include "bashansi.h"
 
 #include "shell.h"
diff -ruwN source/lib/sh/strtoimax.c source-new/lib/sh/strtoimax.c
--- source/lib/sh/strtoimax.c	2021-09-10 21:32:35.000000000 +0700
+++ source-new/lib/sh/strtoimax.c	2025-09-01 04:36:35.301927876 +0700
@@ -55,6 +55,8 @@
 extern long long strtoll PARAMS((const char *, char **, int));
 #endif
 
+#if !defined (__redox__)
+
 #ifdef strtoimax
 #undef strtoimax
 #endif
@@ -79,6 +81,8 @@
   return (strtol (ptr, endptr, base));
 }
 
+#endif
+
 #ifdef TESTING
 # include <stdio.h>
 int
diff -ruwN source/parse.y source-new/parse.y
--- source/parse.y	2022-12-14 00:09:02.000000000 +0700
+++ source-new/parse.y	2025-09-01 04:36:35.302927923 +0700
@@ -2625,6 +2625,7 @@
       parser_state |= PST_ENDALIAS;
       /* We need to do this to make sure last_shell_getc_is_singlebyte returns
 	 true, since we are returning a single-byte space. */
+#if defined (HANDLE_MULTIBYTE)
       if (shell_input_line_index == shell_input_line_len && last_shell_getc_is_singlebyte == 0)
 	{
 #if 0
@@ -2638,6 +2639,7 @@
 	  shell_input_line_property[shell_input_line_index - 1] = 1;
 #endif
 	}
+#endif /* HANDLE_MULTIBYTE */
       return ' ';	/* END_ALIAS */
     }
 #endif
diff -ruwN source/y.tab.c source-new/y.tab.c
--- source/y.tab.c	2022-12-14 00:09:02.000000000 +0700
+++ source-new/y.tab.c	2025-09-01 04:36:35.307928157 +0700
@@ -4936,6 +4936,7 @@
       parser_state |= PST_ENDALIAS;
       /* We need to do this to make sure last_shell_getc_is_singlebyte returns
 	 true, since we are returning a single-byte space. */
+#if defined (HANDLE_MULTIBYTE)
       if (shell_input_line_index == shell_input_line_len && last_shell_getc_is_singlebyte == 0)
 	{
 #if 0
@@ -4949,6 +4950,7 @@
 	  shell_input_line_property[shell_input_line_index - 1] = 1;
 #endif
 	}
+#endif /* HANDLE_MULTIBYTE */
       return ' ';	/* END_ALIAS */
     }
 #endif
