summaryrefslogtreecommitdiffstats
path: root/cmd-string.c
diff options
context:
space:
mode:
authorTiago Cunha <tcunha@gmx.com>2009-07-13 18:03:18 +0000
committerTiago Cunha <tcunha@gmx.com>2009-07-13 18:03:18 +0000
commit280619a4e86f8873fcf99c217f5504ade708b2b7 (patch)
tree2ded7f8cb4fb49b1a6960ad625f0a04e256f4f8a /cmd-string.c
parent6db6df882cd2f82405506e01f938e74b716f13aa (diff)
Expand leading tilde on commands which expect a filename.
Diffstat (limited to 'cmd-string.c')
-rw-r--r--cmd-string.c44
1 files changed, 43 insertions, 1 deletions
diff --git a/cmd-string.c b/cmd-string.c
index 0994e3fd..e2f451a6 100644
--- a/cmd-string.c
+++ b/cmd-string.c
@@ -1,4 +1,4 @@
-/* $Id: cmd-string.c,v 1.18 2009-07-09 18:03:28 nicm Exp $ */
+/* $Id: cmd-string.c,v 1.19 2009-07-13 18:03:18 tcunha Exp $ */
/*
* Copyright (c) 2008 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -19,9 +19,11 @@
#include <sys/types.h>
#include <errno.h>
+#include <pwd.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
+#include <unistd.h>
#include "tmux.h"
@@ -33,6 +35,7 @@ int cmd_string_getc(const char *, size_t *);
void cmd_string_ungetc(const char *, size_t *);
char *cmd_string_string(const char *, size_t *, char, int);
char *cmd_string_variable(const char *, size_t *);
+char *cmd_string_expand_tilde(const char *, size_t *);
int
cmd_string_getc(const char *s, size_t *p)
@@ -154,6 +157,17 @@ cmd_string_parse(const char *s, struct cmd_list **cmdlist, char **cause)
rval = 0;
goto out;
+ case '~':
+ if (have_arg == 0) {
+ if ((t = cmd_string_expand_tilde(s, &p)) == NULL)
+ goto error;
+ buf = xrealloc(buf, 1, len + strlen(t) + 1);
+ strlcpy(buf + len, t, strlen(t) + 1);
+ len += strlen(t);
+ xfree(t);
+ break;
+ }
+ /* FALLTHROUGH */
default:
if (len >= SIZE_MAX - 2)
goto error;
@@ -309,3 +323,31 @@ error:
xfree(buf);
return (NULL);
}
+
+char *
+cmd_string_expand_tilde(const char *s, size_t *p)
+{
+ struct passwd *pw;
+ char *home, *path, *username;
+
+ home = NULL;
+ if (cmd_string_getc(s, p) == '/') {
+ if ((home = getenv("HOME")) == NULL) {
+ if ((pw = getpwuid(getuid())) != NULL)
+ home = pw->pw_dir;
+ }
+ } else {
+ cmd_string_ungetc(s, p);
+ if ((username = cmd_string_string(s, p, '/', 0)) == NULL)
+ return (NULL);
+ if ((pw = getpwnam(username)) != NULL)
+ home = pw->pw_dir;
+ if (username != NULL)
+ xfree(username);
+ }
+ if (home == NULL)
+ return (NULL);
+
+ xasprintf(&path, "%s/", home);
+ return (path);
+}