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_get_passwd(lua_State* L) { uv_passwd_t pwd; int ret = uv_os_get_passwd(&pwd); if (ret < 0) return luv_error(L, ret); lua_newtable(L); if (pwd.username) { lua_pushstring(L, pwd.username); lua_setfield(L, -2, "username"); } if (pwd.uid >= 0) { lua_pushinteger(L, pwd.uid); lua_setfield(L, -2, "uid"); } if (pwd.gid >= 0) { lua_pushinteger(L, pwd.gid); lua_setfield(L, -2, "gid"); } if (pwd.shell) { lua_pushstring(L, pwd.shell); lua_setfield(L, -2, "shell"); } if (pwd.homedir) { lua_pushstring(L, pwd.homedir); lua_setfield(L, -2, "homedir"); } uv_os_free_passwd(&pwd); return 1; }
int uv_os_homedir(char* buffer, size_t* size) { uv_passwd_t pwd; char* buf; size_t len; int r; if (buffer == NULL || size == NULL || *size == 0) return -EINVAL; /* Check if the HOME environment variable is set first */ buf = getenv("HOME"); if (buf != NULL) { len = strlen(buf); if (len >= *size) { *size = len + 1; return -ENOBUFS; } memcpy(buffer, buf, len + 1); *size = len; return 0; } /* 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 -ENOBUFS; } memcpy(buffer, pwd.homedir, len + 1); *size = len; uv_os_free_passwd(&pwd); return 0; }