]>
Commit | Line | Data |
---|---|---|
5b148b61 AC |
1 | #include <unistd.h> |
2 | #include <errno.h> | |
3 | #include <string.h> | |
dcd28cf8 AB |
4 | #include "lock.h" |
5 | ||
6 | char *__wasilibc_cwd = "/"; | |
5b148b61 | 7 | |
5b148b61 | 8 | #ifdef _REENTRANT |
dcd28cf8 AB |
9 | static volatile int lock[1]; |
10 | void __wasilibc_cwd_lock(void) { LOCK(lock); } | |
11 | void __wasilibc_cwd_unlock(void) { UNLOCK(lock); } | |
12 | #else | |
13 | #define __wasilibc_cwd_lock() (void)0 | |
14 | #define __wasilibc_cwd_unlock() (void)0 | |
5b148b61 AC |
15 | #endif |
16 | ||
5b148b61 AC |
17 | char *getcwd(char *buf, size_t size) |
18 | { | |
dcd28cf8 | 19 | __wasilibc_cwd_lock(); |
5b148b61 AC |
20 | if (!buf) { |
21 | buf = strdup(__wasilibc_cwd); | |
22 | if (!buf) { | |
23 | errno = ENOMEM; | |
dcd28cf8 | 24 | __wasilibc_cwd_unlock(); |
5b148b61 AC |
25 | return NULL; |
26 | } | |
27 | } else { | |
28 | size_t len = strlen(__wasilibc_cwd); | |
f4cc7a23 | 29 | if (size < len + 1) { |
5b148b61 | 30 | errno = ERANGE; |
dcd28cf8 | 31 | __wasilibc_cwd_unlock(); |
5b148b61 AC |
32 | return NULL; |
33 | } | |
34 | strcpy(buf, __wasilibc_cwd); | |
35 | } | |
dcd28cf8 | 36 | __wasilibc_cwd_unlock(); |
5b148b61 AC |
37 | return buf; |
38 | } | |
39 |