Merge "libstdc++: Fix x86 thread-safe one-time-construction implementation."
diff --git a/libc/SYSCALLS.TXT b/libc/SYSCALLS.TXT
index 2da38b7..765d2fa 100644
--- a/libc/SYSCALLS.TXT
+++ b/libc/SYSCALLS.TXT
@@ -47,8 +47,8 @@
gid_t getgid:getgid32 () 200
uid_t geteuid:geteuid32 () 201
gid_t getegid:getegid32 () 202
-uid_t getresuid:getresuid32 () 209
-gid_t getresgid:getresgid32 () 211
+uid_t getresuid:getresuid32 (uid_t *ruid, uid_t *euid, uid_t *suid) 209
+gid_t getresgid:getresgid32 (gid_t *rgid, gid_t *egid, gid_t *sgid) 211
pid_t gettid() 224
ssize_t readahead(int, off64_t, size_t) 225
int getgroups:getgroups32(int, gid_t *) 205
@@ -181,7 +181,7 @@
int clock_gettime(clockid_t clk_id, struct timespec *tp) 263,265
int clock_settime(clockid_t clk_id, const struct timespec *tp) 262,264
int clock_getres(clockid_t clk_id, struct timespec *res) 264,266
-int clock_nanosleep(const struct timespec *req, struct timespec *rem) 265,267
+int clock_nanosleep(clockid_t clock_id, int flags, const struct timespec *req, struct timespec *rem) 265,267
int getitimer(int, const struct itimerval *) 105
int setitimer(int, const struct itimerval *, struct itimerval *) 104
int __timer_create:timer_create(clockid_t clockid, struct sigevent *evp, timer_t *timerid) 257,259
diff --git a/libc/arch-x86/syscalls/clock_nanosleep.S b/libc/arch-x86/syscalls/clock_nanosleep.S
index c400e3f..23e1e6f 100644
--- a/libc/arch-x86/syscalls/clock_nanosleep.S
+++ b/libc/arch-x86/syscalls/clock_nanosleep.S
@@ -9,8 +9,12 @@
clock_nanosleep:
pushl %ebx
pushl %ecx
- mov 12(%esp), %ebx
- mov 16(%esp), %ecx
+ pushl %edx
+ pushl %esi
+ mov 20(%esp), %ebx
+ mov 24(%esp), %ecx
+ mov 28(%esp), %edx
+ mov 32(%esp), %esi
movl $__NR_clock_nanosleep, %eax
int $0x80
cmpl $-129, %eax
@@ -21,6 +25,8 @@
addl $4, %esp
orl $-1, %eax
1:
+ popl %esi
+ popl %edx
popl %ecx
popl %ebx
ret
diff --git a/libc/arch-x86/syscalls/getresgid.S b/libc/arch-x86/syscalls/getresgid.S
index 454d32b..d43aec4 100644
--- a/libc/arch-x86/syscalls/getresgid.S
+++ b/libc/arch-x86/syscalls/getresgid.S
@@ -7,6 +7,12 @@
.align 4
getresgid:
+ pushl %ebx
+ pushl %ecx
+ pushl %edx
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
+ mov 24(%esp), %edx
movl $__NR_getresgid32, %eax
int $0x80
cmpl $-129, %eax
@@ -17,4 +23,7 @@
addl $4, %esp
orl $-1, %eax
1:
+ popl %edx
+ popl %ecx
+ popl %ebx
ret
diff --git a/libc/arch-x86/syscalls/getresuid.S b/libc/arch-x86/syscalls/getresuid.S
index f07b5c5..f489d40 100644
--- a/libc/arch-x86/syscalls/getresuid.S
+++ b/libc/arch-x86/syscalls/getresuid.S
@@ -7,6 +7,12 @@
.align 4
getresuid:
+ pushl %ebx
+ pushl %ecx
+ pushl %edx
+ mov 16(%esp), %ebx
+ mov 20(%esp), %ecx
+ mov 24(%esp), %edx
movl $__NR_getresuid32, %eax
int $0x80
cmpl $-129, %eax
@@ -17,4 +23,7 @@
addl $4, %esp
orl $-1, %eax
1:
+ popl %edx
+ popl %ecx
+ popl %ebx
ret
diff --git a/libc/include/sys/linux-unistd.h b/libc/include/sys/linux-unistd.h
index d945d87..12a7ac4 100644
--- a/libc/include/sys/linux-unistd.h
+++ b/libc/include/sys/linux-unistd.h
@@ -17,8 +17,8 @@
gid_t getgid (void);
uid_t geteuid (void);
gid_t getegid (void);
-uid_t getresuid (void);
-gid_t getresgid (void);
+uid_t getresuid (uid_t *ruid, uid_t *euid, uid_t *suid);
+gid_t getresgid (gid_t *rgid, gid_t *egid, gid_t *sgid);
pid_t gettid (void);
ssize_t readahead (int, off64_t, size_t);
int getgroups (int, gid_t *);
@@ -142,7 +142,7 @@
int clock_gettime (clockid_t clk_id, struct timespec *tp);
int clock_settime (clockid_t clk_id, const struct timespec *tp);
int clock_getres (clockid_t clk_id, struct timespec *res);
-int clock_nanosleep (const struct timespec *req, struct timespec *rem);
+int clock_nanosleep (clockid_t clock_id, int flags, const struct timespec *req, struct timespec *rem);
int getitimer (int, const struct itimerval *);
int setitimer (int, const struct itimerval *, struct itimerval *);
int __timer_create (clockid_t clockid, struct sigevent *evp, timer_t *timerid);
diff --git a/libc/unistd/getcwd.c b/libc/unistd/getcwd.c
index 1cf80e9..1172445 100644
--- a/libc/unistd/getcwd.c
+++ b/libc/unistd/getcwd.c
@@ -26,10 +26,15 @@
* SUCH DAMAGE.
*/
#include <unistd.h>
+#include <errno.h>
extern int __getcwd(char * buf, size_t size);
char *getcwd(char *buf, size_t size)
{
+ if (buf == NULL || size == 0) {
+ errno = EINVAL;
+ return NULL;
+ }
return ( __getcwd(buf, size) < 0 ) ? NULL : buf;
}