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