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 *); __dead void client_exec(const char *);
int client_get_lock(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_send_identify(const char *, const char *);
void client_stdin_callback(int, short, void *); void client_stdin_callback(int, short, void *);
void client_write(int, const char *, size_t); void client_write(int, const char *, size_t);
@ -96,7 +96,7 @@ client_get_lock(char *lockfile)
/* Connect client to server. */ /* Connect client to server. */
int 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; struct sockaddr_un sa;
size_t size; size_t size;

86
tmux.c
View File

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