From 1abf13db3c7f1ffa4e40c9f51f7ba76f390e7f06 Mon Sep 17 00:00:00 2001
From: Bruce Momjian <bruce@momjian.us>
Date: Wed, 18 Aug 2004 02:59:12 +0000
Subject: [PATCH] Add get_home_path() to use USERPROFILE on Win32 and HOME on
 Unix.

---
 src/bin/psql/common.c             | 12 ++++++------
 src/bin/psql/input.c              | 12 +++++-------
 src/bin/psql/startup.c            |  6 +++---
 src/include/port.h                | 12 ++++++++----
 src/interfaces/libpq/fe-connect.c |  7 +++----
 src/port/path.c                   | 23 ++++++++++++++++++++++-
 6 files changed, 47 insertions(+), 25 deletions(-)

diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 681c88cc4e..40316c5d8a 100644
--- a/src/bin/psql/common.c
+++ b/src/bin/psql/common.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/common.c,v 1.87 2004/05/23 22:20:10 neilc Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/common.c,v 1.88 2004/08/18 02:59:11 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "common.h"
@@ -1078,13 +1078,13 @@ expand_tilde(char **filename)
 	if (**filename == '~')
 	{
 		char	   *fn;
-		char	   *home;
 		char		oldp,
 				   *p;
 		struct passwd *pw;
+		char		home[MAXPGPATH];
 
 		fn = *filename;
-		home = NULL;
+		*home = '\0';
 
 		p = fn + 1;
 		while (*p != '/' && *p != '\0')
@@ -1094,12 +1094,12 @@ expand_tilde(char **filename)
 		*p = '\0';
 
 		if (*(fn + 1) == '\0')
-			home = getenv("HOME");
+			get_home_path(home);
 		else if ((pw = getpwnam(fn + 1)) != NULL)
-			home = pw->pw_dir;
+			StrNCpy(home, pw->pw_dir, MAXPGPATH);
 
 		*p = oldp;
-		if (home)
+		if (strlen(home) != 0)
 		{
 			char	   *newfn;
 
diff --git a/src/bin/psql/input.c b/src/bin/psql/input.c
index 326f91ef67..d1ad9dd615 100644
--- a/src/bin/psql/input.c
+++ b/src/bin/psql/input.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/input.c,v 1.34 2004/01/25 03:07:22 neilc Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/input.c,v 1.35 2004/08/18 02:59:11 momjian Exp $
  */
 #include "postgres_fe.h"
 #include "input.h"
@@ -171,7 +171,7 @@ initializeInput(int flags)
 #ifdef USE_READLINE
 	if (flags & 1)
 	{
-		const char *home;
+		char home[MAXPGPATH];
 
 		useReadline = true;
 		initialize_readline();
@@ -180,8 +180,7 @@ initializeInput(int flags)
 		if (GetVariable(pset.vars, "HISTSIZE") == NULL)
 			SetVariable(pset.vars, "HISTSIZE", "500");
 		using_history();
-		home = getenv("HOME");
-		if (home)
+		if (get_home_path(home))
 		{
 			char *psql_history;
 
@@ -231,10 +230,9 @@ finishInput(int exitstatus, void *arg)
 #ifdef USE_READLINE
 	if (useHistory)
 	{
-		char	   *home;
+		char	   home[MAXPGPATH];
 
-		home = getenv("HOME");
-		if (home)
+		if (get_home_path(home))
 		{
 			char	*psql_history;
 			int		 hist_size;
diff --git a/src/bin/psql/startup.c b/src/bin/psql/startup.c
index e0f55c536d..2bd2b50aff 100644
--- a/src/bin/psql/startup.c
+++ b/src/bin/psql/startup.c
@@ -3,7 +3,7 @@
  *
  * Copyright (c) 2000-2003, PostgreSQL Global Development Group
  *
- * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.95 2004/06/03 00:07:37 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/startup.c,v 1.96 2004/08/18 02:59:11 momjian Exp $
  */
 #include "postgres_fe.h"
 
@@ -570,8 +570,8 @@ parse_psql_options(int argc, char *argv[], struct adhoc_opts * options)
 static void
 process_psqlrc(char *argv0)
 {
-	char	   *home;
 	char	   *psqlrc;
+	char	   home[MAXPGPATH];
 	char	   global_file[MAXPGPATH];
 	char	   my_exec_path[MAXPGPATH];
 	char	   etc_path[MAXPGPATH];
@@ -582,7 +582,7 @@ process_psqlrc(char *argv0)
 	snprintf(global_file, MAXPGPATH, "%s/%s", etc_path, SYSPSQLRC);
 	process_psqlrc_file(global_file);
 
-	if ((home = getenv("HOME")) != NULL)
+	if (get_home_path(home))
 	{
 		psqlrc = pg_malloc(strlen(home) + 1 + strlen(PSQLRC) + 1);
 		sprintf(psqlrc, "%s/%s", home, PSQLRC);
diff --git a/src/include/port.h b/src/include/port.h
index c03e72f163..58585fc77d 100644
--- a/src/include/port.h
+++ b/src/include/port.h
@@ -6,7 +6,7 @@
  * Portions Copyright (c) 1996-2003, PostgreSQL Global Development Group
  * Portions Copyright (c) 1994, Regents of the University of California
  *
- * $PostgreSQL: pgsql/src/include/port.h,v 1.53 2004/08/17 14:38:38 momjian Exp $
+ * $PostgreSQL: pgsql/src/include/port.h,v 1.54 2004/08/18 02:59:11 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -50,6 +50,7 @@ extern void get_lib_path(const char *my_exec_path, char *ret_path);
 extern void get_pkglib_path(const char *my_exec_path, char *ret_path);
 extern void get_locale_path(const char *my_exec_path, char *ret_path);
 extern void set_pglocale_pgservice(const char *argv0, const char *app);
+extern bool get_home_path(char *ret_path);
 
 /*
  *	is_absolute_path
@@ -74,9 +75,6 @@ extern void set_pglocale_pgservice(const char *argv0, const char *app);
 #endif
 
 
-
-
-
 /* Portable way to find binaries */
 extern int find_my_exec(const char *argv0, char *retpath);
 extern int find_other_exec(const char *argv0, const char *target,
@@ -104,6 +102,12 @@ extern int find_other_exec(const char *argv0, const char *target,
 #define SYSTEMQUOTE ""
 #endif
 
+#ifdef WIN32
+#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 b560f358a6..319563d92e 100644
--- a/src/interfaces/libpq/fe-connect.c
+++ b/src/interfaces/libpq/fe-connect.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.280 2004/08/17 04:24:23 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/interfaces/libpq/fe-connect.c,v 1.281 2004/08/18 02:59:11 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -3093,7 +3093,7 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
 {
 	FILE	   *fp;
 	char	   *pgpassfile;
-	char	   *home;
+	char	   home[MAXPGPATH];
 	struct stat stat_buf;
 
 #define LINELEN NAMEDATALEN*5
@@ -3112,8 +3112,7 @@ PasswordFromFile(char *hostname, char *port, char *dbname, char *username)
 		port = DEF_PGPORT_STR;
 
 	/* Look for it in the home dir */
-	home = getenv("HOME");
-	if (!home)
+	if (!get_home_path(home))
 		return NULL;
 
 	pgpassfile = malloc(strlen(home) + 1 + strlen(PGPASSFILE) + 1);
diff --git a/src/port/path.c b/src/port/path.c
index 7e99ec80ad..db5913f387 100644
--- a/src/port/path.c
+++ b/src/port/path.c
@@ -8,7 +8,7 @@
  *
  *
  * IDENTIFICATION
- *	  $PostgreSQL: pgsql/src/port/path.c,v 1.30 2004/08/13 14:47:23 tgl Exp $
+ *	  $PostgreSQL: pgsql/src/port/path.c,v 1.31 2004/08/18 02:59:12 momjian Exp $
  *
  *-------------------------------------------------------------------------
  */
@@ -370,6 +370,27 @@ set_pglocale_pgservice(const char *argv0, const char *app)
 }
 
 
+/*
+ *	get_include_path
+ */
+bool
+get_home_path(char *ret_path)
+{
+	if (getenv(HOMEDIR) == NULL)
+	{
+		*ret_path = '\0';
+		return false;
+	}
+	else
+	{
+		StrNCpy(ret_path, getenv(HOMEDIR), MAXPGPATH);
+		canonicalize_path(ret_path);
+		return true;
+	}
+}
+
+
+
 /*
  *	make_relative - adjust path to be relative to bin/
  */