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:
parent
829fe38ab1
commit
f32fd2df69
36
tmux.c
36
tmux.c
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user