mescc: Support GNU Bash.
authorJan Nieuwenhuizen <janneke@gnu.org>
Fri, 9 Nov 2018 20:26:10 +0000 (21:26 +0100)
committerJan Nieuwenhuizen <janneke@gnu.org>
Fri, 9 Nov 2018 20:26:10 +0000 (21:26 +0100)
* include/errno.h (EACCES, ENOSPC, ESPIPE): New macro.
* include/linux/x86/syscall.h (SYS_setuid, SYS_geteuid, SYS_getegid,
SYS_setgid): New macro.
* include/linux/x86_64/syscall.h: Likewise.
* include/stdint.h (LLONG_MIN, LLONG_MAX, SIZE_MAX): New macro.
* include/sys/stat.h (S_ISUID, S_ISGID, S_IXGRP, S_IXOTH, S_IRGRP,
S_IROTH, S_IWGRP, S_IWOTH, S_IRWXG, S_IRWXO): New macro.
* include/termio.h: New file.
* include/unistd.h (_POSIX_VERSION): New macro.
* lib/linux/gnu.c (geteuid, getegid, setuid, setgid): New function.
* lib/string/memchr.c: New file.
* lib/stub/getpwuid.c: New file.
* lib/stub/rand.c: New file.
* lib/stub/ttyname.c: New file.
* include/string.h (memchr): Declare.
* include/unistd.h (geteuid, getegid, setuid, setgid): Declare.

16 files changed:
include/errno.h
include/linux/x86/syscall.h
include/linux/x86_64/syscall.h
include/pwd.h
include/stdint.h
include/stdlib.h
include/string.h
include/sys/stat.h
include/termio.h [new file with mode: 0644]
include/unistd.h
lib/libc+gnu.c
lib/linux/gnu.c
lib/string/memchr.c [new file with mode: 0644]
lib/stub/getpwuid.c [new file with mode: 0644]
lib/stub/rand.c [new file with mode: 0644]
lib/stub/ttyname.c [new file with mode: 0644]

index fe3c78c27dd40942c15cf1a2b06c303747f03be3..63257384baaf8680068bfec8a4986dcc013c8157 100644 (file)
@@ -44,11 +44,14 @@ int errno;
 #define        ECHILD  10
 #define EAGAIN  11
 #define ENOMEM  12
+#define EACCES  13
 #define EEXIST  17
 #define ENOTDIR 20
 #define EISDIR  21
 #define EINVAL  22
 #define EMFILE  24
+#define ENOSPC  28
+#define ESPIPE  29
 #define EPIPE   32
 #define ERANGE  34
 
index e9ed6f36ee10435de33761b1ccdd2a649850ae65..dd063c82446eeff230dd3a6c25d4d3b0a1c20810 100644 (file)
 #define SYS_getdents  0x8d
 #define SYS_clock_gettime 0x109
 
+// bash
+#define SYS_setuid    0x17
+#define SYS_geteuid   0x31
+#define SYS_getegid   0x32
+#define SYS_setgid    0x3e
+
 #endif // __MES_LINUX_X86_SYSCALL_H
index ab10bdfb5cf71e5c48548f50bbc4d5a84c73ab73..fddce5c4d44bba9af119e5c42b5d66f0e538863f 100644 (file)
 #define SYS_getdents  0x4e
 #define SYS_clock_gettime 0xe4
 
+// bash
+#define SYS_setuid    0x69
+#define SYS_setgid    0x6a
+#define SYS_geteuid   0x6b
+#define SYS_getegid   0x6c
+
 #endif // __MES_LINUX_X86_64_SYSCALL_H
index 416d0e9ac5873d7606b29b8c39bab85b4f556b16..f0ce92442a9749ef9c3f8e64736bc593a5189d0e 100644 (file)
@@ -36,6 +36,9 @@ struct passwd
   char *pw_shell;
 };
 
+struct passwd * getpwuid ();
+
+
 #endif  // ! WITH_GLIBC
 
 #endif // __MES_PWD_H
index a7aec03cd339dcba348f2e35be1df0f4c8fbedb3..e225c7e9423aee0216d6ad7fa997505a44baf9fa 100644 (file)
@@ -108,11 +108,17 @@ typedef long ptrdiff_t;
 #define LONG_MAX INT_MAX
 #define UINT_MAX UINT32_MAX
 #define ULONG_MAX UINT32_MAX
+#define LLONG_MIN INT64_MIN
+#define LLONG_MAX INT64_MAX
+#define SIZE_MAX UINT32_MAX
 #elif __x86_64__
 #define LONG_MIN INT64_MIN
 #define LONG_MAX INT64_MAX
 #define UINT_MAX UINT32_MAX
 #define ULONG_MAX UINT64_MAX
+#define LLONG_MIN INT64_MIN
+#define LLONG_MAX INT64_MAX
+#define SIZE_MAX UINT64_MAX
 #endif
 
 #endif // ! WITH_GLIBC
index a5f94ed300697410a6491ed4289c8363e4ded158..5d8d62f309c92ef02d6f806a7f26cac588b32ed1 100644 (file)
@@ -42,6 +42,7 @@ int setenv (char const* s, char const* v, int overwrite_p);
 void unsetenv (char const *name);
 void *malloc (size_t);
 void qsort (void *base, size_t nmemb, size_t size, int (*compar)(void const *, void const *));
+int rand (void);
 void *realloc (void *p, size_t size);
 double strtod (char const *string, char **tailptr);
 float strtof (char const *string, char **tailptr);
index 450c623549fb0ce5b99125369a93f367ac315cf7..eb3a621529ed6f6ede5907ef3771d61afd14bf32 100644 (file)
@@ -45,6 +45,7 @@ typedef unsigned long size_t;
 typedef long ssize_t;
 #endif
 
+void * memchr (void const *block, int c, size_t size);
 void *memcpy (void *dest, void const *src, size_t n);
 void *memmove (void *dest, void const *src, size_t n);
 void *memset (void *s, int c, size_t n);
index 17626f4130c49568d5be08719fd88e8976b7caac..aab69a9a801bbb5d692647a4b8e2199e7bff385b 100644 (file)
@@ -101,6 +101,17 @@ int stat (char const *file_name, struct stat *buf);
 #define S_IWUSR 00200
 #define S_IRUSR 00400
 
+#define S_ISUID 0400
+#define S_ISGID 02000
+#define S_IXGRP 00010
+#define S_IXOTH 00001
+#define S_IRGRP 00040
+#define S_IROTH 00004
+#define S_IWGRP 00020
+#define S_IWOTH 00002
+#define S_IRWXG 00070
+#define S_IRWXO 00007
+
 #endif // ! WITH_GLIBC
 
 #endif // __MES_SYS_STAT_H
diff --git a/include/termio.h b/include/termio.h
new file mode 100644 (file)
index 0000000..8bd86e0
--- /dev/null
@@ -0,0 +1,64 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#ifndef __MES_TERMIO_H
+#define __MES_TERMIO_H 1
+
+#if WITH_GLIBC
+#ifndef _GNU_SOURCE
+#define _GNU_SOURCE
+#endif
+#undef __MES_TERMIO_H
+#include_next <termio.h>
+
+#else // ! WITH_GLIBC
+
+#define TIOCGWINSZ     0x5413
+#define TCGETA         0x5405
+#define TCSETAW                0x5407
+
+#define VTIME 5
+#define VMIN 6
+
+#define ISIG   0000001
+#define ICANON 0000002
+#define ECHO   0000010
+#define ECHOK  0000040
+#define ECHONL 0000100
+
+#define ISTRIP 0000040
+#define INLCR  0000100
+#define ICRNL  0000400
+
+#define   CS8  0000060
+#define PARENB 0000400
+
+struct termio
+{
+  unsigned short c_iflag;
+  unsigned short c_oflag;
+  unsigned short c_cflag;
+  unsigned short c_lflag;
+  unsigned char c_line;
+  unsigned char c_cc[8];
+};
+
+#endif // ! WITH_GLIBC
+
+#endif // __MES_TERMIO_H
index c34584cf23ec312fe4cd37d0efc1d15aa7712da8..d6c218e4ffcbdae277a60c51362d1af2db0ea2b8 100644 (file)
@@ -29,6 +29,8 @@
 
 #else // ! WITH_GLIBC
 
+#define _POSIX_VERSION 199009L
+
 #include <sys/types.h>
 #ifndef NULL
 #define NULL 0
@@ -62,8 +64,12 @@ int execve (char const *file, char *const argv[], char *const env[]);
 int execvp (char const *file, char *const argv[]);
 int fork (void);
 char *getcwd (char *buf, size_t size);
-gid_t getgid (void);
 uid_t getuid (void);
+gid_t getgid (void);
+int setgid (gid_t newgid);
+int setuid (uid_t newuid);
+uid_t geteuid (void);
+gid_t getegid (void);
 int isatty (int fd);
 int link (char const *oldname, char const *newname);
 off_t lseek (int fd, off_t offset, int whence);
index 4f997e2f05851b47561950cf70d09dc130afb282..c23783866b87032d37132f2594b8c153f50cfed6 100644 (file)
 #include <stub/sigblock.c>
 #include <stub/sigaddset.c>
 #include <stub/setlocale.c>
+
+// bash
+#include <stub/getpwuid.c>
+#include <stub/rand.c>
+#include <stub/ttyname.c>
index 7fc5a8be6d623b70ec54995c867cd3c1b6129c3b..bd914d2879f2920453b89e87351591e869727905 100644 (file)
@@ -173,3 +173,28 @@ chdir (char const *file_name)
 {
   return _sys_call1 (SYS_chdir, (long)file_name);
 }
+
+// bash
+uid_t
+geteuid ()
+{
+  return _sys_call (SYS_geteuid);
+}
+
+gid_t
+getegid ()
+{
+  return _sys_call (SYS_getegid);
+}
+
+int
+setuid (uid_t newuid)
+{
+  return _sys_call1 (SYS_setuid, (long)newuid);
+}
+
+int
+setgid (gid_t newgid)
+{
+  return _sys_call1 (SYS_setgid, (long)newgid);
+}
diff --git a/lib/string/memchr.c b/lib/string/memchr.c
new file mode 100644 (file)
index 0000000..eac13a9
--- /dev/null
@@ -0,0 +1,34 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2017,2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <string.h>
+
+void *
+memchr (void const *block, int c, size_t size)
+{
+  char const *p = block;
+  while (size--)
+    {
+      if (c == *p)
+        return p;
+      p++;
+    }
+  return 0;
+}
diff --git a/lib/stub/getpwuid.c b/lib/stub/getpwuid.c
new file mode 100644 (file)
index 0000000..647fd54
--- /dev/null
@@ -0,0 +1,33 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <pwd.h>
+
+struct passwd *
+getpwuid ()
+{
+  static int stub = 0;
+  if (__mes_debug () && !stub)
+    eputs ("getpwuid stub\n");
+  stub = 1;
+  errno = 0;
+  return 0;
+}
diff --git a/lib/stub/rand.c b/lib/stub/rand.c
new file mode 100644 (file)
index 0000000..2e07282
--- /dev/null
@@ -0,0 +1,33 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <pwd.h>
+
+int
+rand (void)
+{
+  static int stub = 0;
+  if (__mes_debug () && !stub)
+    eputs ("rand stub\n");
+  stub = 1;
+  errno = 0;
+  return 0;
+}
diff --git a/lib/stub/ttyname.c b/lib/stub/ttyname.c
new file mode 100644 (file)
index 0000000..093e5c0
--- /dev/null
@@ -0,0 +1,35 @@
+/* -*-comment-start: "//";comment-end:""-*-
+ * GNU Mes --- Maxwell Equations of Software
+ * Copyright © 2018 Jan (janneke) Nieuwenhuizen <janneke@gnu.org>
+ *
+ * This file is part of GNU Mes.
+ *
+ * GNU Mes is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or (at
+ * your option) any later version.
+ *
+ * GNU Mes is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Mes.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <libmes.h>
+#include <unistd.h>
+
+char *
+ttyname (int filedes)
+{
+  static int stub = 0;
+  if (__mes_debug () && !stub)
+    eputs ("ttyname stub\n");
+  stub = 1;
+  errno = 0;
+  if (isatty (filedes))
+      return "/dev/tty0";
+  return 0;
+}