1
0
mirror of https://github.com/tmux/tmux.git synced 2025-03-30 03:18:51 +00:00

Improve error message if creating socket parent directory fails, from

Thomas Adam for GitHub issue 1215.
This commit is contained in:
nicm 2018-01-12 10:22:02 +00:00
parent 829fe38ab1
commit f32fd2df69

36
tmux.c
View File

@ -47,7 +47,7 @@ int ptm_fd = -1;
const char *shell_command; const char *shell_command;
static __dead void usage(void); static __dead void usage(void);
static char *make_label(const char *); static char *make_label(const char *, char **);
static const char *getshell(void); static const char *getshell(void);
static int checkshell(const char *); static int checkshell(const char *);
@ -109,12 +109,13 @@ areshell(const char *shell)
} }
static char * static char *
make_label(const char *label) make_label(const char *label, char **cause)
{ {
char *base, resolved[PATH_MAX], *path, *s; char *base, resolved[PATH_MAX], *path, *s;
struct stat sb; struct stat sb;
uid_t uid; uid_t uid;
int saved_errno;
*cause = NULL;
if (label == NULL) if (label == NULL)
label = "default"; label = "default";
@ -124,11 +125,16 @@ make_label(const char *label)
xasprintf(&base, "%s/tmux-%ld", s, (long)uid); xasprintf(&base, "%s/tmux-%ld", s, (long)uid);
else else
xasprintf(&base, "%s/tmux-%ld", _PATH_TMP, (long)uid); xasprintf(&base, "%s/tmux-%ld", _PATH_TMP, (long)uid);
if (realpath(base, resolved) == NULL &&
if (mkdir(base, S_IRWXU) != 0 && errno != EEXIST) strlcpy(resolved, base, sizeof resolved) >= sizeof resolved) {
errno = ERANGE;
free(base);
goto fail; goto fail;
}
if (lstat(base, &sb) != 0) if (mkdir(resolved, S_IRWXU) != 0 && errno != EEXIST)
goto fail;
if (lstat(resolved, &sb) != 0)
goto fail; goto fail;
if (!S_ISDIR(sb.st_mode)) { if (!S_ISDIR(sb.st_mode)) {
errno = ENOTDIR; errno = ENOTDIR;
@ -138,18 +144,11 @@ make_label(const char *label)
errno = EACCES; errno = EACCES;
goto fail; goto fail;
} }
if (realpath(base, resolved) == NULL)
strlcpy(resolved, base, sizeof resolved);
xasprintf(&path, "%s/%s", resolved, label); xasprintf(&path, "%s/%s", resolved, label);
free(base);
return (path); return (path);
fail: fail:
saved_errno = errno; xasprintf(cause, "error creating %s (%s)", resolved, strerror(errno));
free(base);
errno = saved_errno;
return (NULL); return (NULL);
} }
@ -191,7 +190,7 @@ find_home(void)
int int
main(int argc, char **argv) main(int argc, char **argv)
{ {
char *path, *label, **var; char *path, *label, *cause, **var;
char tmp[PATH_MAX]; char tmp[PATH_MAX];
const char *s, *shell, *cwd; const char *s, *shell, *cwd;
int opt, flags, keys; int opt, flags, keys;
@ -341,8 +340,11 @@ main(int argc, char **argv)
path[strcspn(path, ",")] = '\0'; path[strcspn(path, ",")] = '\0';
} }
} }
if (path == NULL && (path = make_label(label)) == NULL) { if (path == NULL && (path = make_label(label, &cause)) == NULL) {
fprintf(stderr, "can't create socket: %s\n", strerror(errno)); if (cause != NULL) {
fprintf(stderr, "%s\n", cause);
free(cause);
}
exit(1); exit(1);
} }
socket_path = path; socket_path = path;