diff options
author | Nicholas Marriott <nicholas.marriott@gmail.com> | 2013-10-06 09:06:07 +0100 |
---|---|---|
committer | Nicholas Marriott <nicholas.marriott@gmail.com> | 2013-10-06 09:06:07 +0100 |
commit | 446eb11cdeba97a24996cee36ba331491aba6211 (patch) | |
tree | a6c718f759628358db081ef5b793d60e02e0614d | |
parent | fa1375c09f13118c5be70aa6ba64284bdda1c03f (diff) | |
download | rtmux-446eb11cdeba97a24996cee36ba331491aba6211.tar.gz rtmux-446eb11cdeba97a24996cee36ba331491aba6211.tar.bz2 rtmux-446eb11cdeba97a24996cee36ba331491aba6211.zip |
Make tilde expansion in command strings work even if it isn't terminated by /.
-rw-r--r-- | cmd-string.c | 29 |
1 files changed, 22 insertions, 7 deletions
diff --git a/cmd-string.c b/cmd-string.c index 7e84eda6..e793ea02 100644 --- a/cmd-string.c +++ b/cmd-string.c @@ -318,10 +318,13 @@ cmd_string_expand_tilde(const char *s, size_t *p) { struct passwd *pw; struct environ_entry *envent; - char *home, *path, *username; + char *home, *path, *user, *cp; + int last; home = NULL; - if (cmd_string_getc(s, p) == '/') { + + last = cmd_string_getc(s, p); + if (last == EOF || last == '/' || last == ' '|| last == '\t') { envent = environ_find(&global_environ, "HOME"); if (envent != NULL && *envent->value != '\0') home = envent->value; @@ -329,15 +332,27 @@ cmd_string_expand_tilde(const char *s, size_t *p) home = pw->pw_dir; } else { cmd_string_ungetc(p); - if ((username = cmd_string_string(s, p, '/', 0)) == NULL) - return (NULL); - if ((pw = getpwnam(username)) != NULL) + + cp = user = xmalloc(strlen(s)); + for (;;) { + last = cmd_string_getc(s, p); + if (last == EOF || last == '/' || last == ' '|| last == '\t') + break; + *cp++ = last; + } + *cp = '\0'; + + if ((pw = getpwnam(user)) != NULL) home = pw->pw_dir; - free(username); + free(user); } + if (home == NULL) return (NULL); - xasprintf(&path, "%s/", home); + if (last != EOF) + xasprintf(&path, "%s%c", home, last); + else + xasprintf(&path, "%s", home); return (path); } |