From 55a92063a73b60dc7b7b260e3bd8e322acaefe33 Mon Sep 17 00:00:00 2001 From: Bruce Momjian Date: Fri, 9 Jan 2004 21:12:20 +0000 Subject: [PATCH] Allow psql to handle tilde user expansion for file names. Zach Irmen --- src/bin/psql/command.c | 16 ++++++++++++- src/bin/psql/common.c | 64 +++++++++++++++++++++++++++++++++++++++++++++++++- src/bin/psql/common.h | 4 +++- src/bin/psql/copy.c | 3 ++- 4 files changed, 83 insertions(+), 4 deletions(-) diff --git a/src/bin/psql/command.c b/src/bin/psql/command.c index 67d0ad7b3b..e1294785d7 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 9d00e4ad80..1e113ac49a 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 2e9cc5952e..db8037b1ed 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 200029b77b..36937d2606 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); -- 2.11.0