mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-12-21 08:29:39 +08:00
Prefer $HOME when looking up the current user's home directory.
When we need to identify the home directory on non-Windows, first consult getenv("HOME"). If that's empty or unset, fall back on our previous method of checking the <pwd.h> database. Preferring $HOME allows the user to intentionally point at some other directory, and it seems to be in line with the behavior of most other utilities. However, we shouldn't rely on it completely, as $HOME is likely to be unset when running as a daemon. Anders Kaseorg Discussion: https://postgr.es/m/1634252654444.90107@mit.edu
This commit is contained in:
parent
6867f963e3
commit
376ce3e404
@ -558,19 +558,25 @@ exec_command_cd(PsqlScanState scan_state, bool active_branch, const char *cmd)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
struct passwd *pw;
|
/* This should match get_home_path() */
|
||||||
uid_t user_id = geteuid();
|
dir = getenv("HOME");
|
||||||
|
if (dir == NULL || dir[0] == '\0')
|
||||||
errno = 0; /* clear errno before call */
|
|
||||||
pw = getpwuid(user_id);
|
|
||||||
if (!pw)
|
|
||||||
{
|
{
|
||||||
pg_log_error("could not get home directory for user ID %ld: %s",
|
uid_t user_id = geteuid();
|
||||||
(long) user_id,
|
struct passwd *pw;
|
||||||
errno ? strerror(errno) : _("user does not exist"));
|
|
||||||
exit(EXIT_FAILURE);
|
errno = 0; /* clear errno before call */
|
||||||
|
pw = getpwuid(user_id);
|
||||||
|
if (pw)
|
||||||
|
dir = pw->pw_dir;
|
||||||
|
else
|
||||||
|
{
|
||||||
|
pg_log_error("could not get home directory for user ID %ld: %s",
|
||||||
|
(long) user_id,
|
||||||
|
errno ? strerror(errno) : _("user does not exist"));
|
||||||
|
success = false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
dir = pw->pw_dir;
|
|
||||||
#else /* WIN32 */
|
#else /* WIN32 */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -581,7 +587,8 @@ exec_command_cd(PsqlScanState scan_state, bool active_branch, const char *cmd)
|
|||||||
#endif /* WIN32 */
|
#endif /* WIN32 */
|
||||||
}
|
}
|
||||||
|
|
||||||
if (chdir(dir) == -1)
|
if (success &&
|
||||||
|
chdir(dir) < 0)
|
||||||
{
|
{
|
||||||
pg_log_error("\\%s: could not change directory to \"%s\": %m",
|
pg_log_error("\\%s: could not change directory to \"%s\": %m",
|
||||||
cmd, dir);
|
cmd, dir);
|
||||||
|
@ -7267,14 +7267,21 @@ bool
|
|||||||
pqGetHomeDirectory(char *buf, int bufsize)
|
pqGetHomeDirectory(char *buf, int bufsize)
|
||||||
{
|
{
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
char pwdbuf[BUFSIZ];
|
const char *home;
|
||||||
struct passwd pwdstr;
|
|
||||||
struct passwd *pwd = NULL;
|
|
||||||
|
|
||||||
(void) pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd);
|
home = getenv("HOME");
|
||||||
if (pwd == NULL)
|
if (home == NULL || home[0] == '\0')
|
||||||
return false;
|
{
|
||||||
strlcpy(buf, pwd->pw_dir, bufsize);
|
char pwdbuf[BUFSIZ];
|
||||||
|
struct passwd pwdstr;
|
||||||
|
struct passwd *pwd = NULL;
|
||||||
|
|
||||||
|
(void) pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd);
|
||||||
|
if (pwd == NULL)
|
||||||
|
return false;
|
||||||
|
home = pwd->pw_dir;
|
||||||
|
}
|
||||||
|
strlcpy(buf, home, bufsize);
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
char tmppath[MAX_PATH];
|
char tmppath[MAX_PATH];
|
||||||
|
@ -807,14 +807,25 @@ bool
|
|||||||
get_home_path(char *ret_path)
|
get_home_path(char *ret_path)
|
||||||
{
|
{
|
||||||
#ifndef WIN32
|
#ifndef WIN32
|
||||||
char pwdbuf[BUFSIZ];
|
/*
|
||||||
struct passwd pwdstr;
|
* We first consult $HOME. If that's unset, try to get the info from
|
||||||
struct passwd *pwd = NULL;
|
* <pwd.h>.
|
||||||
|
*/
|
||||||
|
const char *home;
|
||||||
|
|
||||||
(void) pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd);
|
home = getenv("HOME");
|
||||||
if (pwd == NULL)
|
if (home == NULL || home[0] == '\0')
|
||||||
return false;
|
{
|
||||||
strlcpy(ret_path, pwd->pw_dir, MAXPGPATH);
|
char pwdbuf[BUFSIZ];
|
||||||
|
struct passwd pwdstr;
|
||||||
|
struct passwd *pwd = NULL;
|
||||||
|
|
||||||
|
(void) pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd);
|
||||||
|
if (pwd == NULL)
|
||||||
|
return false;
|
||||||
|
home = pwd->pw_dir;
|
||||||
|
}
|
||||||
|
strlcpy(ret_path, home, MAXPGPATH);
|
||||||
return true;
|
return true;
|
||||||
#else
|
#else
|
||||||
char *tmppath;
|
char *tmppath;
|
||||||
|
Loading…
Reference in New Issue
Block a user