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:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user