Tidy the code that works out the socket path, and just use the full path

in the global socket_path rather than copying it.
This commit is contained in:
nicm 2015-11-24 22:27:22 +00:00
parent 8976dac9e0
commit c913fb99b6
3 changed files with 42 additions and 50 deletions

View File

@ -55,7 +55,7 @@ int client_attached;
__dead void client_exec(const char *);
int client_get_lock(char *);
int client_connect(struct event_base *, char *, int);
int client_connect(struct event_base *, const char *, int);
void client_send_identify(const char *, const char *);
void client_stdin_callback(int, short, void *);
void client_write(int, const char *, size_t);
@ -96,7 +96,7 @@ client_get_lock(char *lockfile)
/* Connect client to server. */
int
client_connect(struct event_base *base, char *path, int start_server)
client_connect(struct event_base *base, const char *path, int start_server)
{
struct sockaddr_un sa;
size_t size;

86
tmux.c
View File

@ -41,10 +41,10 @@ struct environ *global_environ;
char *shell_cmd;
struct timeval start_time;
char socket_path[PATH_MAX];
const char *socket_path;
__dead void usage(void);
char *makesocketpath(const char *);
static char *make_label(const char *);
__dead void
usage(void)
@ -102,38 +102,48 @@ areshell(const char *shell)
return (0);
}
char *
makesocketpath(const char *label)
static char *
make_label(const char *label)
{
char base[PATH_MAX], realbase[PATH_MAX], *path, *s;
struct stat sb;
u_int uid;
char *base, resolved[PATH_MAX], *path, *s;
struct stat sb;
u_int uid;
int saved_errno;
if (label == NULL)
label = "default";
uid = getuid();
if ((s = getenv("TMUX_TMPDIR")) != NULL && *s != '\0')
xsnprintf(base, sizeof base, "%s/tmux-%u", s, uid);
xasprintf(&base, "%s/tmux-%u", s, uid);
else
xsnprintf(base, sizeof base, "%s/tmux-%u", _PATH_TMP, uid);
xasprintf(&base, "%s/tmux-%u", _PATH_TMP, uid);
if (mkdir(base, S_IRWXU) != 0 && errno != EEXIST)
return (NULL);
goto fail;
if (lstat(base, &sb) != 0)
return (NULL);
goto fail;
if (!S_ISDIR(sb.st_mode)) {
errno = ENOTDIR;
return (NULL);
goto fail;
}
if (sb.st_uid != uid || (sb.st_mode & S_IRWXO) != 0) {
errno = EACCES;
return (NULL);
goto fail;
}
if (realpath(base, realbase) == NULL)
strlcpy(realbase, base, sizeof realbase);
xasprintf(&path, "%s/%s", realbase, label);
if (realpath(base, resolved) == NULL)
strlcpy(resolved, base, sizeof resolved);
xasprintf(&path, "%s/%s", resolved, label);
return (path);
fail:
saved_errno = errno;
free(base);
errno = saved_errno;
return (NULL);
}
void
@ -289,41 +299,23 @@ main(int argc, char **argv)
}
/*
* Figure out the socket path. If specified on the command-line with -S
* or -L, use it, otherwise try $TMUX or assume -L default.
* If socket is specified on the command-line with -S or -L, it is
* used. Otherwise, $TMUX is checked and if that fails "default" is
* used.
*/
if (path == NULL) {
/* If no -L, use the environment. */
if (label == NULL) {
s = getenv("TMUX");
if (s != NULL) {
path = xstrdup(s);
path[strcspn (path, ",")] = '\0';
if (*path == '\0') {
free(path);
label = xstrdup("default");
}
} else
label = xstrdup("default");
}
/* -L or default set. */
if (label != NULL) {
if ((path = makesocketpath(label)) == NULL) {
fprintf(stderr, "can't create socket: %s\n",
strerror(errno));
exit(1);
}
if (path == NULL && label == NULL) {
s = getenv("TMUX");
if (s != NULL && *s != '\0' && *s != ',') {
path = xstrdup(s);
path[strcspn (path, ",")] = '\0';
}
}
free(label);
if (strlcpy(socket_path, path, sizeof socket_path) >=
sizeof socket_path) {
fprintf(stderr, "socket path too long: %s\n", path);
if (path == NULL && (path = make_label(label)) == NULL) {
fprintf(stderr, "can't create socket: %s\n", strerror(errno));
exit(1);
}
free(path);
socket_path = path;
free(label);
/* Pass control to the client. */
exit(client_main(event_init(), argc, argv, flags));

2
tmux.h
View File

@ -1433,7 +1433,7 @@ extern struct options *global_w_options;
extern struct environ *global_environ;
extern char *shell_cmd;
extern struct timeval start_time;
extern char socket_path[PATH_MAX];
extern const char *socket_path;
const char *getshell(void);
int checkshell(const char *);
int areshell(const char *);