From 6f4b089a74ab55aae8a0d9c07ae55511690cb9f0 Mon Sep 17 00:00:00 2001 From: Micah Cowan Date: Thu, 7 Aug 2008 02:13:13 -0700 Subject: [PATCH] Tilde expansion from Debian. --- src/fileio.c | 47 ++++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 3 deletions(-) diff --git a/src/fileio.c b/src/fileio.c index 0ffba66..04b03d7 100644 --- a/src/fileio.c +++ b/src/fileio.c @@ -24,6 +24,7 @@ #include #include #include +#include #ifndef SIGINT # include @@ -298,9 +299,49 @@ char *rcfilename; Msg(0, "%s: source: recursion limit reached", rc_name); return; } - rc_recursion++; - FinishRc(rcfilename); - rc_recursion--; + /* Tilde prefix support courtesy , + * taken from a Debian patch. */ + if (*rcfilename == '~') + { + char rcfilename_tilde_exp[MAXPATHLEN+1]; + char *slash_position = strchr(rcfilename, '/'); + if (slash_position == rcfilename+1) + { + char *home = getenv("HOME"); + if (!home) + { + Msg(0, "%s: source: tilde expansion failed", rc_name); + return; + } + snprintf(rcfilename_tilde_exp, MAXPATHLEN, "%s/%s", home, rcfilename+2); + } + else if (slash_position) + { + struct passwd *p; + *slash_position = 0; + p = getpwnam(rcfilename+1); + if (!p) + { + Msg(0, "%s: source: tilde expansion failed for user %s", rc_name, rcfilename+1); + return; + } + snprintf(rcfilename_tilde_exp, MAXPATHLEN, "%s/%s", p->pw_dir, slash_position+1); + } + else + { + Msg(0, "%s: source: illegal tilde expression.", rc_name); + return; + } + rc_recursion++; + FinishRc(rcfilename_tilde_exp); + rc_recursion--; + } + else + { + rc_recursion++; + FinishRc(rcfilename); + rc_recursion--; + } } -- 2.11.4.GIT