int uv_os_homedir(char* buffer, size_t* size) { uv_passwd_t pwd; size_t len; int r; /* Check if the HOME environment variable is set first. The task of performing input validation on buffer and size is taken care of by uv_os_getenv(). */ r = uv_os_getenv("HOME", buffer, size); if (r != UV_ENOENT) return r; /* HOME is not set, so call uv__getpwuid_r() */ r = uv__getpwuid_r(&pwd); if (r != 0) { return r; } len = strlen(pwd.homedir); if (len >= *size) { *size = len + 1; uv_os_free_passwd(&pwd); return UV_ENOBUFS; } memcpy(buffer, pwd.homedir, len + 1); *size = len; uv_os_free_passwd(&pwd); return 0; }
static int luv_os_getenv(lua_State* L) { const char* name = luaL_checkstring(L, 1); size_t size = luaL_optinteger(L, 2, LUAL_BUFFERSIZE); char *buff = malloc(size); int ret = uv_os_getenv(name, buff, &size); if (ret == 0) { lua_pushlstring(L, buff, size); ret = 1; } else ret = luv_error(L, ret); free(buff); return ret; }