-
Notifications
You must be signed in to change notification settings - Fork 233
Expand file tree
/
Copy pathgetcwd.c
More file actions
39 lines (35 loc) · 865 Bytes
/
getcwd.c
File metadata and controls
39 lines (35 loc) · 865 Bytes
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <errno.h>
#include <string.h>
#include <unistd.h>
#include "lock.h"
char *__wasilibc_cwd = "/";
#ifdef _REENTRANT
static __lock_t lock[1];
// Critical section contains no yield points, so we can use weak locks.
void __wasilibc_cwd_lock(void) { WEAK_LOCK(lock); }
void __wasilibc_cwd_unlock(void) { WEAK_UNLOCK(lock); }
#else
#define __wasilibc_cwd_lock() (void)0
#define __wasilibc_cwd_unlock() (void)0
#endif
char *getcwd(char *buf, size_t size) {
__wasilibc_cwd_lock();
if (!buf) {
buf = strdup(__wasilibc_cwd);
if (!buf) {
errno = ENOMEM;
__wasilibc_cwd_unlock();
return NULL;
}
} else {
size_t len = strlen(__wasilibc_cwd);
if (size < len + 1) {
errno = ERANGE;
__wasilibc_cwd_unlock();
return NULL;
}
strcpy(buf, __wasilibc_cwd);
}
__wasilibc_cwd_unlock();
return buf;
}