aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/bin/psql/command.c16
-rw-r--r--src/bin/psql/common.c64
-rw-r--r--src/bin/psql/common.h4
-rw-r--r--src/bin/psql/copy.c3
4 files changed, 83 insertions, 4 deletions
diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c
index 67d0ad7b3b7..e1294785d70 100644
--- a/src/bin/psql/command.c
+++ b/src/bin/psql/command.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2003, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.108 2003/12/01 22:21:54 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/command.c,v 1.109 2004/01/09 21:12:20 momjian Exp $
*/
#include "postgres_fe.h"
#include "command.h"
@@ -413,6 +413,7 @@ exec_command(const char *cmd,
else
{
fname = scan_option(&string, OT_NORMAL, NULL, true);
+ expand_tilde(&fname);
status = do_edit(fname, query_buf) ? CMD_NEWEDIT : CMD_ERROR;
free(fname);
}
@@ -494,7 +495,10 @@ exec_command(const char *cmd,
if (!fname)
pset.gfname = NULL;
else
+ {
+ expand_tilde(&fname);
pset.gfname = xstrdup(fname);
+ }
free(fname);
status = CMD_SEND;
}
@@ -531,6 +535,7 @@ exec_command(const char *cmd,
}
else
{
+ expand_tilde(&fname);
success = (process_file(fname) == EXIT_SUCCESS);
free(fname);
}
@@ -561,7 +566,10 @@ exec_command(const char *cmd,
success = false;
}
else
+ {
+ expand_tilde(&opt2);
success = do_lo_export(opt1, opt2);
+ }
}
else if (strcmp(cmd + 3, "import") == 0)
@@ -572,7 +580,10 @@ exec_command(const char *cmd,
success = false;
}
else
+ {
+ expand_tilde(&opt1);
success = do_lo_import(opt1, opt2);
+ }
}
else if (strcmp(cmd + 3, "list") == 0)
@@ -602,6 +613,7 @@ exec_command(const char *cmd,
{
char *fname = scan_option(&string, OT_FILEPIPE, NULL, true);
+ expand_tilde(&fname);
success = setQFout(fname);
free(fname);
}
@@ -653,6 +665,7 @@ exec_command(const char *cmd,
{
char *fname = scan_option(&string, OT_NORMAL, NULL, true);
+ expand_tilde(&fname);
success = saveHistory(fname ? fname : "/dev/tty");
if (success && !quiet && fname)
@@ -771,6 +784,7 @@ exec_command(const char *cmd,
else
{
fname = scan_option(&string, OT_FILEPIPE, NULL, true);
+ expand_tilde(&fname);
if (!fname)
{
diff --git a/src/bin/psql/common.c b/src/bin/psql/common.c
index 9d00e4ad80f..1e113ac49aa 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.78 2003/11/29 19:52:06 pgsql Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/common.c,v 1.79 2004/01/09 21:12:20 momjian Exp $
*/
#include "postgres_fe.h"
#include "common.h"
@@ -814,3 +814,65 @@ session_username(void)
else
return PQuser(pset.db);
}
+
+
+/* expand_tilde
+ *
+ * substitute '~' with HOME or '~username' with username's home dir
+ *
+ */
+char *
+expand_tilde(char **filename)
+{
+ if (!filename || !(*filename))
+ return NULL;
+
+ /* MSDOS uses tilde for short versions of long file names, so skip it. */
+#ifndef WIN32
+
+ /* try tilde expansion */
+ if (**filename == '~')
+ {
+ char *fn;
+ char *home;
+ char oldp,
+ *p;
+ struct passwd *pw;
+
+ fn = *filename;
+ home = NULL;
+
+ p = fn + 1;
+ while (*p != '/' && *p != '\0')
+ p++;
+
+ oldp = *p;
+ *p = '\0';
+
+ if (*(fn + 1) == '\0')
+ home = getenv("HOME");
+ else if ((pw = getpwnam(fn + 1)) != NULL)
+ home = pw->pw_dir;
+
+ *p = oldp;
+ if (home)
+ {
+ char *newfn;
+
+ newfn = malloc(strlen(home) + strlen(p) + 1);
+ if (!newfn)
+ {
+ psql_error("out of memory\n");
+ exit(EXIT_FAILURE);
+ }
+ strcpy(newfn, home);
+ strcat(newfn, p);
+
+ free(fn);
+ *filename = newfn;
+ }
+ }
+#endif
+
+ return *filename;
+}
diff --git a/src/bin/psql/common.h b/src/bin/psql/common.h
index 2e9cc5952e0..db8037b1ed5 100644
--- a/src/bin/psql/common.h
+++ b/src/bin/psql/common.h
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2003, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/common.h,v 1.31 2003/12/01 22:14:40 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/common.h,v 1.32 2004/01/09 21:12:20 momjian Exp $
*/
#ifndef COMMON_H
#define COMMON_H
@@ -58,4 +58,6 @@ extern char parse_char(char **buf);
#define pclose(x) _pclose(x)
#endif
+extern char *expand_tilde(char **filename);
+
#endif /* COMMON_H */
diff --git a/src/bin/psql/copy.c b/src/bin/psql/copy.c
index 200029b77bd..36937d2606e 100644
--- a/src/bin/psql/copy.c
+++ b/src/bin/psql/copy.c
@@ -3,7 +3,7 @@
*
* Copyright (c) 2000-2003, PostgreSQL Global Development Group
*
- * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.35 2003/12/01 22:14:40 momjian Exp $
+ * $PostgreSQL: pgsql/src/bin/psql/copy.c,v 1.36 2004/01/09 21:12:20 momjian Exp $
*/
#include "postgres_fe.h"
#include "copy.h"
@@ -221,6 +221,7 @@ parse_slash_copy(const char *args)
result->file = NULL;
else
result->file = xstrdup(token);
+ expand_tilde(&result->file);
token = strtokx(NULL, whitespace, NULL, NULL,
0, false, pset.encoding);