summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authornicm <nicm>2015-11-24 22:27:22 +0000
committernicm <nicm>2015-11-24 22:27:22 +0000
commitc913fb99b6f0f7d08b77d8d021df7d7fa27f82d0 (patch)
treed9b0d5ab77c55306a63e785bb3be533cd5baa072
parent8976dac9e0c2e55b240ad55f4f7fa0a3b887c0e2 (diff)
Tidy the code that works out the socket path, and just use the full path
in the global socket_path rather than copying it.
-rw-r--r--client.c4
-rw-r--r--tmux.c86
-rw-r--r--tmux.h2
3 files changed, 42 insertions, 50 deletions
diff --git a/client.c b/client.c
index fcb704fb..595aff9b 100644
--- a/client.c
+++ b/client.c
@@ -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;
diff --git a/tmux.c b/tmux.c
index c515ebb2..f2143755 100644
--- a/tmux.c
+++ b/tmux.c
@@ -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));
diff --git a/tmux.h b/tmux.h
index 97908d98..50d7fb03 100644
--- a/tmux.h
+++ b/tmux.h
@@ -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 *);