version 1.87, 2013/10/10 12:07:36 |
version 1.88, 2013/10/10 12:28:56 |
|
|
|
|
return (buf); |
return (buf); |
} |
} |
|
|
/* |
|
* Return the default path for a new pane. Several special values are accepted: |
|
* the empty string or relative path for the current working directory, |
|
* ~ for the user's home, - for the base working directory, . for the server |
|
* working directory. |
|
*/ |
|
const char * |
|
cmd_default_path(const char *base, const char *current, const char *in) |
|
{ |
|
const char *root; |
|
struct environ_entry *envent; |
|
char tmp[MAXPATHLEN]; |
|
struct passwd *pw; |
|
int n; |
|
size_t skip; |
|
static char path[MAXPATHLEN]; |
|
|
|
skip = 1; |
|
if (strcmp(in, "$HOME") == 0 || strncmp(in, "$HOME/", 6) == 0) { |
|
/* User's home directory - $HOME. */ |
|
skip = 5; |
|
goto find_home; |
|
} else if (in[0] == '~' && (in[1] == '\0' || in[1] == '/')) { |
|
/* User's home directory - ~. */ |
|
goto find_home; |
|
} else if (in[0] == '-' && (in[1] == '\0' || in[1] == '/')) { |
|
/* Base working directory. */ |
|
root = base; |
|
goto complete_path; |
|
} else if (in[0] == '.' && (in[1] == '\0' || in[1] == '/')) { |
|
/* Server working directory. */ |
|
if (getcwd(tmp, sizeof tmp) != NULL) { |
|
root = tmp; |
|
goto complete_path; |
|
} |
|
return ("/"); |
|
} else if (*in == '/') { |
|
/* Absolute path. */ |
|
return (in); |
|
} else { |
|
/* Empty or relative path. */ |
|
if (current != NULL) |
|
root = current; |
|
else |
|
return (base); |
|
skip = 0; |
|
goto complete_path; |
|
} |
|
|
|
return (base); |
|
|
|
find_home: |
|
envent = environ_find(&global_environ, "HOME"); |
|
if (envent != NULL && *envent->value != '\0') |
|
root = envent->value; |
|
else if ((pw = getpwuid(getuid())) != NULL) |
|
root = pw->pw_dir; |
|
else |
|
return (base); |
|
|
|
complete_path: |
|
if (root[skip] == '\0') { |
|
strlcpy(path, root, sizeof path); |
|
return (path); |
|
} |
|
n = snprintf(path, sizeof path, "%s/%s", root, in + skip); |
|
if (n > 0 && (size_t)n < sizeof path) |
|
return (path); |
|
return (base); |
|
} |
|