summaryrefslogtreecommitdiff
path: root/system/musl/amalgamation.patch
diff options
context:
space:
mode:
Diffstat (limited to 'system/musl/amalgamation.patch')
-rw-r--r--system/musl/amalgamation.patch282
1 files changed, 282 insertions, 0 deletions
diff --git a/system/musl/amalgamation.patch b/system/musl/amalgamation.patch
new file mode 100644
index 000000000..d4d4465dc
--- /dev/null
+++ b/system/musl/amalgamation.patch
@@ -0,0 +1,282 @@
+diff --git a/include/stdlib.h b/include/stdlib.h
+index 42ca8336..4bbaded0 100644
+--- a/include/stdlib.h
++++ b/include/stdlib.h
+@@ -39,14 +39,18 @@ void *malloc (size_t);
+ void *calloc (size_t, size_t);
+ void *realloc (void *, size_t);
+ void free (void *);
++#if __STDC_VERSION__ >= 201112L || __cplusplus >= 201103L
+ void *aligned_alloc(size_t, size_t);
++#endif
+
+ _Noreturn void abort (void);
+ int atexit (void (*) (void));
+ _Noreturn void exit (int);
+ _Noreturn void _Exit (int);
++#if __STDC_VERSION__ >= 201112L || __cplusplus >= 201103L
+ int at_quick_exit (void (*) (void));
+ _Noreturn void quick_exit (int);
++#endif
+
+ char *getenv (const char *);
+
+@@ -100,7 +104,6 @@ int posix_memalign (void **, size_t, size_t);
+ int setenv (const char *, const char *, int);
+ int unsetenv (const char *);
+ int mkstemp (char *);
+-int mkostemp (char *, int);
+ char *mkdtemp (char *);
+ int getsubopt (char **, char *const *, char **);
+ int rand_r (unsigned *);
+@@ -138,6 +141,7 @@ void lcong48 (unsigned short [7]);
+ #include <alloca.h>
+ char *mktemp (char *);
+ int mkstemps (char *, int);
++int mkostemp (char *, int);
+ int mkostemps (char *, int, int);
+ void *valloc (size_t);
+ void *memalign(size_t, size_t);
+diff --git a/include/time.h b/include/time.h
+index 672b3fc3..c5946dd0 100644
+--- a/include/time.h
++++ b/include/time.h
+@@ -58,11 +58,14 @@ struct tm *gmtime (const time_t *);
+ struct tm *localtime (const time_t *);
+ char *asctime (const struct tm *);
+ char *ctime (const time_t *);
+-int timespec_get(struct timespec *, int);
+
+-#define CLOCKS_PER_SEC 1000000L
++#if __STDC_VERSION__ >= 201112L
++int timespec_get(struct timespec *, int);
+
+ #define TIME_UTC 1
++#endif
++
++#define CLOCKS_PER_SEC 1000000L
+
+ #if defined(_POSIX_SOURCE) || defined(_POSIX_C_SOURCE) \
+ || defined(_XOPEN_SOURCE) || defined(_GNU_SOURCE) \
+diff --git a/include/unistd.h b/include/unistd.h
+index 9485da7a..1bdd3292 100644
+--- a/include/unistd.h
++++ b/include/unistd.h
+@@ -274,6 +274,7 @@ int eaccess(const char *, int);
+ #define _PC_ALLOC_SIZE_MIN 18
+ #define _PC_SYMLINK_MAX 19
+ #define _PC_2_SYMLINKS 20
++#define _PC_TIMESTAMP_RESOLUTION 21
+
+ #define _SC_ARG_MAX 0
+ #define _SC_CHILD_MAX 1
+@@ -417,6 +418,7 @@ int eaccess(const char *, int);
+ #define _SC_XOPEN_STREAMS 246
+ #define _SC_THREAD_ROBUST_PRIO_INHERIT 247
+ #define _SC_THREAD_ROBUST_PRIO_PROTECT 248
++#define _SC_XOPEN_UUCP 249
+
+ #define _CS_PATH 0
+ #define _CS_POSIX_V6_WIDTH_RESTRICTED_ENVS 1
+@@ -459,6 +461,8 @@ int eaccess(const char *, int);
+ #define _CS_POSIX_V7_LPBIG_OFFBIG_LINTFLAGS 1147
+ #define _CS_V6_ENV 1148
+ #define _CS_V7_ENV 1149
++#define _CS_POSIX_V7_THREADS_CFLAGS 1150
++#define _CS_POSIX_V7_THREADS_LDFLAGS 1151
+
+ #ifdef __cplusplus
+ }
+diff --git a/src/conf/confstr.c b/src/conf/confstr.c
+index 02cb1aa2..8f870a69 100644
+--- a/src/conf/confstr.c
++++ b/src/conf/confstr.c
+@@ -6,8 +6,8 @@ size_t confstr(int name, char *buf, size_t len)
+ {
+ const char *s = "";
+ if (!name) {
+- s = "/bin:/usr/bin";
+- } else if ((name&~4U)!=1 && name-_CS_POSIX_V6_ILP32_OFF32_CFLAGS>33U) {
++ s = "/usr/5bin:/usr/bin:/bin";
++ } else if ((name&~4U)!=1 && name-_CS_POSIX_V6_ILP32_OFF32_CFLAGS>35U) {
+ errno = EINVAL;
+ return 0;
+ }
+diff --git a/src/conf/fpathconf.c b/src/conf/fpathconf.c
+index e6aca5cf..b6a9d63e 100644
+--- a/src/conf/fpathconf.c
++++ b/src/conf/fpathconf.c
+@@ -4,7 +4,7 @@
+
+ long fpathconf(int fd, int name)
+ {
+- static const short values[] = {
++ static const long values[] = {
+ [_PC_LINK_MAX] = _POSIX_LINK_MAX,
+ [_PC_MAX_CANON] = _POSIX_MAX_CANON,
+ [_PC_MAX_INPUT] = _POSIX_MAX_INPUT,
+@@ -25,7 +25,8 @@ long fpathconf(int fd, int name)
+ [_PC_REC_XFER_ALIGN] = 4096,
+ [_PC_ALLOC_SIZE_MIN] = 4096,
+ [_PC_SYMLINK_MAX] = -1,
+- [_PC_2_SYMLINKS] = 1
++ [_PC_2_SYMLINKS] = 1,
++ [_PC_TIMESTAMP_RESOLUTION] = 100000000,
+ };
+ if (name >= sizeof(values)/sizeof(values[0])) {
+ errno = EINVAL;
+diff --git a/src/conf/sysconf.c b/src/conf/sysconf.c
+index 45ef1c16..483e1635 100644
+--- a/src/conf/sysconf.c
++++ b/src/conf/sysconf.c
+@@ -165,6 +165,7 @@ long sysconf(int name)
+ [_SC_XOPEN_STREAMS] = JT_ZERO,
+ [_SC_THREAD_ROBUST_PRIO_INHERIT] = -1,
+ [_SC_THREAD_ROBUST_PRIO_PROTECT] = -1,
++ [_SC_XOPEN_UUCP] = -1,
+ };
+
+ if (name >= sizeof(values)/sizeof(values[0]) || !values[name]) {
+diff --git a/src/locale/setlocale.c b/src/locale/setlocale.c
+index 40bc7ece..4d51cdfe 100644
+--- a/src/locale/setlocale.c
++++ b/src/locale/setlocale.c
+@@ -25,6 +25,8 @@ char *setlocale(int cat, const char *name)
+
+ if ((unsigned)cat > LC_ALL) return 0;
+
++ if (name && (!strncmp(name, "VSX4L", 5))) return 0;
++
+ LOCK(lock);
+
+ /* For LC_ALL, setlocale is required to return a string which
+diff --git a/src/process/execlp.c b/src/process/execlp.c
+index 5eed886e..f6da398b 100644
+--- a/src/process/execlp.c
++++ b/src/process/execlp.c
+@@ -1,6 +1,9 @@
+ #include <unistd.h>
++#include <errno.h>
+ #include <stdarg.h>
+
++extern int __execsh(const char *, char *const []);
++
+ int execlp(const char *file, const char *argv0, ...)
+ {
+ int argc;
+@@ -17,6 +20,11 @@ int execlp(const char *file, const char *argv0, ...)
+ argv[i] = va_arg(ap, char *);
+ argv[i] = NULL;
+ va_end(ap);
+- return execvp(file, argv);
++ execvp(file, argv);
++ if (errno == ENOEXEC) {
++ errno = 0;
++ return __execsh(file, argv);
++ }
++ return -1;
+ }
+ }
+diff --git a/src/process/execsh.c b/src/process/execsh.c
+new file mode 100644
+index 00000000..180bb2aa
+--- /dev/null
++++ b/src/process/execsh.c
+@@ -0,0 +1,18 @@
++#include <unistd.h>
++#include <errno.h>
++#include "libc.h"
++
++int
++__execsh(const char *file, char *const argv[])
++{
++ int i, argc;
++ char **p;
++
++ for (argc=1, p=(char **)argv; *p; ++argc, ++p);
++
++ char *nargv[argc+1];
++ nargv[0] = (char *)file;
++ for (i=0; i<argc; ++i)
++ nargv[i+1] = argv[i];
++ return execv("/bin/sh", nargv);
++}
+diff --git a/src/process/execvp.c b/src/process/execvp.c
+index 2dddeddb..fdd0ca48 100644
+--- a/src/process/execvp.c
++++ b/src/process/execvp.c
+@@ -6,6 +6,7 @@
+ #include "libc.h"
+
+ extern char **__environ;
++extern int __execsh(const char *, char *const []);
+
+ int __execvpe(const char *file, char *const argv[], char *const envp[])
+ {
+@@ -56,7 +57,12 @@ int __execvpe(const char *file, char *const argv[], char *const envp[])
+
+ int execvp(const char *file, char *const argv[])
+ {
+- return __execvpe(file, argv, __environ);
++ __execvpe(file, argv, __environ);
++ if (errno == ENOEXEC) {
++ errno = 0;
++ return __execsh(file, argv);
++ }
++ return -1;
+ }
+
+ weak_alias(__execvpe, execvpe);
+diff --git a/src/process/system.c b/src/process/system.c
+index 9135b815..aa01e13b 100644
+--- a/src/process/system.c
++++ b/src/process/system.c
+@@ -19,7 +19,9 @@ int system(const char *cmd)
+
+ pthread_testcancel();
+
+- if (!cmd) return 1;
++ if (!cmd) {
++ return (access("/bin/sh", X_OK) == 0);
++ }
+
+ sigaction(SIGINT, &sa, &oldint);
+ sigaction(SIGQUIT, &sa, &oldquit);
+diff --git a/src/thread/pthread_attr_setinheritsched.c b/src/thread/pthread_attr_setinheritsched.c
+index e540e846..4115e2fe 100644
+--- a/src/thread/pthread_attr_setinheritsched.c
++++ b/src/thread/pthread_attr_setinheritsched.c
+@@ -23,7 +23,7 @@ void *__start_sched(void *p)
+
+ int pthread_attr_setinheritsched(pthread_attr_t *a, int inherit)
+ {
+- if (inherit > 1U) return EINVAL;
++ if (inherit > 1U) return ENOTSUP;
+ a->_a_sched = inherit;
+ return 0;
+ }
+diff --git a/src/thread/pthread_attr_setscope.c b/src/thread/pthread_attr_setscope.c
+index 46b520c0..933bdb38 100644
+--- a/src/thread/pthread_attr_setscope.c
++++ b/src/thread/pthread_attr_setscope.c
+@@ -8,6 +8,6 @@ int pthread_attr_setscope(pthread_attr_t *a, int scope)
+ case PTHREAD_SCOPE_PROCESS:
+ return ENOTSUP;
+ default:
+- return EINVAL;
++ return ENOTSUP;
+ }
+ }
+diff --git a/src/time/timespec_get.c b/src/time/timespec_get.c
+index 03c5a77b..c423b825 100644
+--- a/src/time/timespec_get.c
++++ b/src/time/timespec_get.c
+@@ -6,7 +6,7 @@ int __clock_gettime(clockid_t, struct timespec *);
+ * are considered erroneous. */
+ int timespec_get(struct timespec * ts, int base)
+ {
+- if (base != TIME_UTC) return 0;
++ if (base != 1) return 0;
+ int ret = __clock_gettime(CLOCK_REALTIME, ts);
+ return ret < 0 ? 0 : base;
+ }