Allow psql to handle tilde user expansion for file names.
authorBruce Momjian
Fri, 9 Jan 2004 21:12:20 +0000 (21:12 +0000)
committerBruce Momjian
Fri, 9 Jan 2004 21:12:20 +0000 (21:12 +0000)
Zach Irmen

src/bin/psql/command.c
src/bin/psql/common.c
src/bin/psql/common.h
src/bin/psql/copy.c

index 67d0ad7b3b7d764d3656e16a273be10fc46a362a..e1294785d702781d7ec4d00b18e06ed0b82adef1 100644 (file)
@@ -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)
            {
index 9d00e4ad80f75e7b838b7c9d917bdc70c81b0753..1e113ac49aa21ad73c3c0c0e9fc2c992b4fbcb73 100644 (file)
@@ -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;
+}
index 2e9cc5952e0c867ded68fd4312a32044f0849cca..db8037b1ed5a80997971589b8236d29a0da6958b 100644 (file)
@@ -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 */
index 200029b77bd9ea190ca4e441b70049cd05630052..36937d2606e47db4237a54498c534adabd3fb467 100644 (file)
@@ -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);