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; }