1
0
mirror of https://github.com/postgres/postgres.git synced 2025-12-12 02:37:31 +03:00

Allow psql to handle tilde user expansion for file names.

Zach Irmen
This commit is contained in:
Bruce Momjian
2004-01-09 21:12:20 +00:00
parent 38081fd000
commit 55a92063a7
4 changed files with 83 additions and 4 deletions

View 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;
}