From: Tom Lane Date: Thu, 6 Jan 2005 01:00:12 +0000 (+0000) Subject: Make the various places that determine the user's "home directory" X-Git-Url: http://git.postgresql.org/gitweb/static/gitweb.js?a=commitdiff_plain;h=b423f628f512047de95edd3c27f12f1e4e7f11ab;p=users%2Fbernd%2Fpostgres.git Make the various places that determine the user's "home directory" consistent. On Unix we now always consult getpwuid(); $HOME isn't used at all. On Windows the code currently consults $USERPROFILE, or $HOME if that's not defined, but I expect this will change as soon as the win32 hackers come to a consensus. Nothing done yet about changing the file names used underneath $USERPROFILE. --- diff --git a/src/include/port.h b/src/include/port.h index 9a73045a07..c1db902647 100644 --- a/src/include/port.h +++ b/src/include/port.h @@ -98,12 +98,6 @@ extern int find_other_exec(const char *argv0, const char *target, #define SYSTEMQUOTE "" #endif -#if defined(WIN32) && !defined(__CYGWIN__) -#define HOMEDIR "USERPROFILE" -#else -#define HOMEDIR "HOME" -#endif - /* Portable delay handling */ extern void pg_usleep(long microsec); diff --git a/src/interfaces/libpq/fe-connect.c b/src/interfaces/libpq/fe-connect.c index 0cdc51895c..f213c8cd48 100644 --- a/src/interfaces/libpq/fe-connect.c +++ b/src/interfaces/libpq/fe-connect.c @@ -3175,8 +3175,7 @@ static char * PasswordFromFile(char *hostname, char *port, char *dbname, char *username) { FILE *fp; - char *pgpassfile; - char *home; + char pgpassfile[MAXPGPATH]; struct stat stat_buf; #define LINELEN NAMEDATALEN*5 @@ -3194,32 +3193,16 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username) if (port == NULL) port = DEF_PGPORT_STR; - /* - * Look for it in the home dir. We don't use get_home_path() so we - * don't pull path.c into our library. - */ - if (!(home = getenv(HOMEDIR))) + if (!pqGetHomeDirectory(pgpassfile, sizeof(pgpassfile))) return NULL; - pgpassfile = malloc(strlen(home) + 1 + strlen(PGPASSFILE) + 1); - if (!pgpassfile) - { - fprintf(stderr, libpq_gettext("out of memory\n")); - return NULL; - } - -#ifndef WIN32 - sprintf(pgpassfile, "%s/%s", home, PGPASSFILE); -#else - sprintf(pgpassfile, "%s\\%s", home, PGPASSFILE); -#endif + snprintf(pgpassfile + strlen(pgpassfile), + sizeof(pgpassfile) - strlen(pgpassfile), + "/%s", PGPASSFILE); /* If password file cannot be opened, ignore it. */ if (stat(pgpassfile, &stat_buf) == -1) - { - free(pgpassfile); return NULL; - } #ifndef WIN32 /* If password file is insecure, alert the user and ignore it. */ @@ -3228,13 +3211,11 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username) fprintf(stderr, libpq_gettext("WARNING: Password file %s has world or group read access; permission should be u=rw (0600)\n"), pgpassfile); - free(pgpassfile); return NULL; } #endif fp = fopen(pgpassfile, "r"); - free(pgpassfile); if (fp == NULL) return NULL; @@ -3270,6 +3251,41 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username) #undef LINELEN } +/* + * Obtain user's home directory, return in given buffer + * + * This is essentially the same as get_home_path(), but we don't use that + * because we don't want to pull path.c into libpq (it pollutes application + * namespace) + */ +bool +pqGetHomeDirectory(char *buf, int bufsize) +{ +#ifndef WIN32 + char pwdbuf[BUFSIZ]; + struct passwd pwdstr; + struct passwd *pwd = NULL; + + if (pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd) != 0) + return false; + StrNCpy(buf, pwd->pw_dir, bufsize); + return true; + +#else + + /* TEMPORARY PLACEHOLDER IMPLEMENTATION */ + const char *homedir; + + homedir = getenv("USERPROFILE"); + if (homedir == NULL) + homedir = getenv("HOME"); + if (homedir == NULL) + return false; + StrNCpy(buf, homedir, bufsize); + return true; +#endif +} + /* * To keep the API consistent, the locking stubs are always provided, even * if they are not required. diff --git a/src/interfaces/libpq/fe-secure.c b/src/interfaces/libpq/fe-secure.c index bc3011a302..0ae0837a98 100644 --- a/src/interfaces/libpq/fe-secure.c +++ b/src/interfaces/libpq/fe-secure.c @@ -107,6 +107,7 @@ #endif #include #endif +#include #ifdef ENABLE_THREAD_SAFETY #include @@ -116,11 +117,6 @@ #include "strdup.h" #endif -#ifndef WIN32 -#include -#endif -#include - #ifdef USE_SSL #include #include @@ -493,31 +489,6 @@ pqsecure_write(PGconn *conn, const void *ptr, size_t len) /* ------------------------------------------------------------ */ #ifdef USE_SSL -/* - * Obtain user's home directory, return in given buffer - * - * This code isn't really SSL-specific, but currently we only need it in - * SSL-related places. - */ -static bool -pqGetHomeDirectory(char *buf, int bufsize) -{ -#ifndef WIN32 - char pwdbuf[BUFSIZ]; - struct passwd pwdstr; - struct passwd *pwd = NULL; - - if (pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd) != 0) - return false; - StrNCpy(buf, pwd->pw_dir, bufsize); - return true; - -#else - - return false; /* PLACEHOLDER */ -#endif -} - /* * Certificate verification callback * diff --git a/src/interfaces/libpq/libpq-int.h b/src/interfaces/libpq/libpq-int.h index 4b252a6b1d..407e8c5517 100644 --- a/src/interfaces/libpq/libpq-int.h +++ b/src/interfaces/libpq/libpq-int.h @@ -377,6 +377,7 @@ extern char *const pgresStatus[]; extern int pqPacketSend(PGconn *conn, char pack_type, const void *buf, size_t buf_len); +extern bool pqGetHomeDirectory(char *buf, int bufsize); #ifdef ENABLE_THREAD_SAFETY extern pgthreadlock_t pg_g_threadlock; diff --git a/src/port/path.c b/src/port/path.c index 3ebd388913..3e18f5b714 100644 --- a/src/port/path.c +++ b/src/port/path.c @@ -16,6 +16,10 @@ #include "c.h" #include +#include +#ifndef WIN32 +#include +#endif #include "pg_config_paths.h" @@ -445,19 +449,29 @@ get_locale_path(const char *my_exec_path, char *ret_path) bool get_home_path(char *ret_path) { - const char *homedir = getenv(HOMEDIR); +#ifndef WIN32 + char pwdbuf[BUFSIZ]; + struct passwd pwdstr; + struct passwd *pwd = NULL; + + if (pqGetpwuid(geteuid(), &pwdstr, pwdbuf, sizeof(pwdbuf), &pwd) != 0) + return false; + StrNCpy(ret_path, pwd->pw_dir, MAXPGPATH); + return true; + +#else + + /* TEMPORARY PLACEHOLDER IMPLEMENTATION */ + const char *homedir; + homedir = getenv("USERPROFILE"); + if (homedir == NULL) + homedir = getenv("HOME"); if (homedir == NULL) - { - *ret_path = '\0'; return false; - } - else - { - StrNCpy(ret_path, homedir, MAXPGPATH); - canonicalize_path(ret_path); - return true; - } + StrNCpy(ret_path, homedir, MAXPGPATH); + return true; +#endif }