=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/Attic/cmd-string.c,v retrieving revision 1.3 retrieving revision 1.4 diff -c -r1.3 -r1.4 *** src/usr.bin/tmux/Attic/cmd-string.c 2009/07/08 16:04:56 1.3 --- src/usr.bin/tmux/Attic/cmd-string.c 2009/07/13 18:49:36 1.4 *************** *** 1,4 **** ! /* $OpenBSD: cmd-string.c,v 1.3 2009/07/08 16:04:56 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott --- 1,4 ---- ! /* $OpenBSD: cmd-string.c,v 1.4 2009/07/13 18:49:36 nicm Exp $ */ /* * Copyright (c) 2008 Nicholas Marriott *************** *** 19,27 **** --- 19,29 ---- #include #include + #include #include #include #include + #include #include "tmux.h" *************** *** 33,38 **** --- 35,41 ---- 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,159 **** --- 157,173 ---- 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; *************** *** 308,311 **** --- 322,353 ---- if (buf != NULL) 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); }