summaryrefslogtreecommitdiffstats
path: root/tmux.c
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2020-04-23 18:15:02 +0100
committerNicholas Marriott <nicholas.marriott@gmail.com>2020-04-23 18:15:02 +0100
commitd53e1fedd595db68a4e5bc9e3e7024fa924300d3 (patch)
tree0c602f035c7520fcdaf9b73b83e7cb97cd03a3ec /tmux.c
parent0d3fdae7b623bd992b1fd2058e59920b2efd47da (diff)
Add TMUX_SOCK like TMUX_PATH for the socket directory.
Diffstat (limited to 'tmux.c')
-rw-r--r--tmux.c37
1 files changed, 19 insertions, 18 deletions
diff --git a/tmux.c b/tmux.c
index 727c9b99..82c3441c 100644
--- a/tmux.c
+++ b/tmux.c
@@ -180,31 +180,30 @@ expand_paths(const char *s, char ***paths, u_int *n)
static char *
make_label(const char *label, char **cause)
{
- char *base, resolved[PATH_MAX], *path, *s;
- struct stat sb;
- uid_t uid;
+ char **paths, *path, *base;
+ u_int i, n;
+ struct stat sb;
+ uid_t uid;
*cause = NULL;
-
if (label == NULL)
label = "default";
uid = getuid();
- if ((s = getenv("TMUX_TMPDIR")) != NULL && *s != '\0')
- xasprintf(&base, "%s/tmux-%ld", s, (long)uid);
- else
- xasprintf(&base, "%s/tmux-%ld", _PATH_TMP, (long)uid);
- if (realpath(base, resolved) == NULL &&
- strlcpy(resolved, base, sizeof resolved) >= sizeof resolved) {
- errno = ERANGE;
- free(base);
- goto fail;
+ expand_paths(TMUX_SOCK, &paths, &n);
+ if (n == 0) {
+ xasprintf(cause, "no suitable socket path");
+ return (NULL);
}
- free(base);
+ path = paths[0]; /* can only have one socket! */
+ for (i = 1; i < n; i++)
+ free(paths[i]);
+ free(paths);
- if (mkdir(resolved, S_IRWXU) != 0 && errno != EEXIST)
+ xasprintf(&base, "%s/tmux-%ld", path, (long)uid);
+ if (mkdir(base, S_IRWXU) != 0 && errno != EEXIST)
goto fail;
- if (lstat(resolved, &sb) != 0)
+ if (lstat(base, &sb) != 0)
goto fail;
if (!S_ISDIR(sb.st_mode)) {
errno = ENOTDIR;
@@ -214,11 +213,13 @@ make_label(const char *label, char **cause)
errno = EACCES;
goto fail;
}
- xasprintf(&path, "%s/%s", resolved, label);
+ xasprintf(&path, "%s/%s", base, label);
+ free(base);
return (path);
fail:
- xasprintf(cause, "error creating %s (%s)", resolved, strerror(errno));
+ xasprintf(cause, "error creating %s (%s)", base, strerror(errno));
+ free(base);
return (NULL);
}