summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicholas Marriott <nicholas.marriott@gmail.com>2007-11-12 15:12:08 +0000
committerNicholas Marriott <nicholas.marriott@gmail.com>2007-11-12 15:12:08 +0000
commit4309d65475d2b5ad4e00a9c590a2e97c1c90ca16 (patch)
tree29f1cf14959e783e68373dae70ff1e0f9170530b
parente4a6cdefda66dbc7b4cab944975e5d9053e3f862 (diff)
realpath the socket path; also sprinkle some const.
-rw-r--r--client.c35
-rw-r--r--server.c8
-rw-r--r--tmux.c19
-rw-r--r--tmux.h6
4 files changed, 32 insertions, 36 deletions
diff --git a/client.c b/client.c
index b3bc3251..a9307f60 100644
--- a/client.c
+++ b/client.c
@@ -1,4 +1,4 @@
-/* $Id: client.c,v 1.20 2007-11-08 10:39:52 nicm Exp $ */
+/* $Id: client.c,v 1.21 2007-11-12 15:12:08 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -36,7 +36,7 @@ void client_handle_winch(struct client_ctx *);
int client_process_local(struct client_ctx *, char **);
int
-client_init(char *path, struct client_ctx *cctx, int start_server)
+client_init(const char *path, struct client_ctx *cctx, int start_server)
{
struct sockaddr_un sa;
struct stat sb;
@@ -46,28 +46,22 @@ client_init(char *path, struct client_ctx *cctx, int start_server)
int mode;
u_int retries;
- if (path == NULL) {
- xasprintf(&path,
- "%s/%s-%lu", _PATH_TMP, __progname, (u_long) getuid());
- } else
- path = xstrdup(path);
-
retries = 0;
retry:
if (stat(path, &sb) != 0) {
if (start_server && errno == ENOENT && retries < 10) {
if (server_start(path) != 0)
- goto error;
+ return (-1);
usleep(10000);
retries++;
goto retry;
}
log_warn("%s: stat", path);
- goto error;
+ return (-1);
}
if (!S_ISSOCK(sb.st_mode)) {
log_warnx("%s: %s", path, strerror(ENOTSOCK));
- goto error;
+ return (-1);
}
memset(&sa, 0, sizeof sa);
@@ -75,35 +69,35 @@ retry:
size = strlcpy(sa.sun_path, path, sizeof sa.sun_path);
if (size >= sizeof sa.sun_path) {
log_warnx("%s: %s", path, strerror(ENAMETOOLONG));
- goto error;
+ return (-1);
}
if ((cctx->srv_fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {
log_warn("%s: socket", path);
- goto error;
+ return (-1);
}
if (connect(
cctx->srv_fd, (struct sockaddr *) &sa, SUN_LEN(&sa)) == -1) {
if (start_server && errno == ECONNREFUSED && retries < 10) {
if (unlink(path) != 0) {
log_warn("%s: unlink", path);
- goto error;
+ return (-1);
}
usleep(10000);
retries++;
goto retry;
}
log_warn("%s: connect", path);
- goto error;
+ return (-1);
}
if ((mode = fcntl(cctx->srv_fd, F_GETFL)) == -1) {
log_warn("%s: fcntl", path);
- goto error;
+ return (-1);
}
if (fcntl(cctx->srv_fd, F_SETFL, mode|O_NONBLOCK) == -1) {
log_warn("%s: fcntl", path);
- goto error;
+ return (-1);
}
cctx->srv_in = buffer_create(BUFSIZ);
cctx->srv_out = buffer_create(BUFSIZ);
@@ -111,7 +105,7 @@ retry:
if (isatty(STDIN_FILENO) && isatty(STDOUT_FILENO)) {
if (ioctl(STDIN_FILENO, TIOCGWINSZ, &ws) == -1) {
log_warn("ioctl(TIOCGWINSZ)");
- goto error;
+ return (-1);
}
data.sx = ws.ws_col;
@@ -121,12 +115,7 @@ retry:
client_write_server(cctx, MSG_IDENTIFY, &data, sizeof data);
}
- xfree(path);
return (0);
-
-error:
- xfree(path);
- return (-1);
}
int
diff --git a/server.c b/server.c
index a0192a7c..6a5977fb 100644
--- a/server.c
+++ b/server.c
@@ -1,4 +1,4 @@
-/* $Id: server.c,v 1.37 2007-10-31 14:26:26 nicm Exp $ */
+/* $Id: server.c,v 1.38 2007-11-12 15:12:08 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -43,7 +43,7 @@
/* Client list. */
struct clients clients;
-int server_main(char *, int);
+int server_main(const char *, int);
void server_fill_windows(struct pollfd **);
void server_handle_windows(struct pollfd **);
void server_fill_clients(struct pollfd **);
@@ -55,7 +55,7 @@ void server_lost_window(struct window *);
/* Fork new server. */
int
-server_start(char *path)
+server_start(const char *path)
{
struct sockaddr_un sa;
size_t size;
@@ -122,7 +122,7 @@ server_start(char *path)
/* Main server loop. */
int
-server_main(char *srv_path, int srv_fd)
+server_main(const char *srv_path, int srv_fd)
{
struct pollfd *pfds, *pfd;
int nfds;
diff --git a/tmux.c b/tmux.c
index a8d69338..b6ba1533 100644
--- a/tmux.c
+++ b/tmux.c
@@ -1,4 +1,4 @@
-/* $Id: tmux.c,v 1.39 2007-11-09 11:03:35 nicm Exp $ */
+/* $Id: tmux.c,v 1.40 2007-11-12 15:12:08 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -19,7 +19,6 @@
#include <sys/types.h>
#include <sys/wait.h>
-#include <err.h>
#include <errno.h>
#include <paths.h>
#include <poll.h>
@@ -174,7 +173,7 @@ main(int argc, char **argv)
struct hdr hdr;
const char *shell;
struct passwd *pw;
- char *path, *cause, *name;
+ char *path, rpath[MAXPATHLEN], *cause, *name;
int n, opt;
path = name = NULL;
@@ -209,6 +208,16 @@ main(int argc, char **argv)
bell_action = BELL_ANY;
+ if (path == NULL) {
+ xasprintf(&path,
+ "%s/%s-%lu", _PATH_TMP, __progname, (u_long) getuid());
+ }
+ if (realpath(path, rpath) == NULL) {
+ log_warn("%s", path);
+ exit(1);
+ }
+ xfree(path);
+
shell = getenv("SHELL");
if (shell == NULL || *shell == '\0') {
pw = getpwuid(getuid());
@@ -231,7 +240,7 @@ main(int argc, char **argv)
if (!(cmd->entry->flags & CMD_NOSESSION) ||
(cmd->entry->flags & CMD_CANTNEST))
client_fill_session(&data);
- if (client_init(path, &cctx, cmd->entry->flags & CMD_STARTSERVER) != 0)
+ if (client_init(rpath, &cctx, cmd->entry->flags & CMD_STARTSERVER) != 0)
exit(1);
b = buffer_create(BUFSIZ);
cmd_send_string(b, name);
@@ -242,8 +251,6 @@ main(int argc, char **argv)
MSG_COMMAND, &data, sizeof data, BUFFER_OUT(b), BUFFER_USED(b));
buffer_destroy(b);
- if (path != NULL)
- xfree(path);
if (name != NULL)
xfree(name);
diff --git a/tmux.h b/tmux.h
index 1620c6fc..9934a4b6 100644
--- a/tmux.h
+++ b/tmux.h
@@ -1,4 +1,4 @@
-/* $Id: tmux.h,v 1.78 2007-11-12 14:21:41 nicm Exp $ */
+/* $Id: tmux.h,v 1.79 2007-11-12 15:12:08 nicm Exp $ */
/*
* Copyright (c) 2007 Nicholas Marriott <nicm@users.sourceforge.net>
@@ -595,7 +595,7 @@ extern const struct cmd_entry cmd_unlink_window_entry;
void cmd_select_window_default(void **, int);
/* client.c */
-int client_init(char *, struct client_ctx *, int);
+int client_init(const char *, struct client_ctx *, int);
int client_flush(struct client_ctx *);
int client_main(struct client_ctx *);
@@ -622,7 +622,7 @@ const char *key_string_lookup_key(int);
/* server.c */
extern struct clients clients;
-int server_start(char *);
+int server_start(const char *);
/* server-msg.c */
int server_msg_dispatch(struct client *);