diff options
author | Thomas Adam <thomas@xteddy.org> | 2017-12-19 16:01:20 +0000 |
---|---|---|
committer | Thomas Adam <thomas@xteddy.org> | 2017-12-19 16:01:20 +0000 |
commit | 74ecc866cf7613a3af10f400b4d59c12200d38c5 (patch) | |
tree | 35f7f43d8e254e60552aa8170d33d32f8f2adf40 /server.c | |
parent | 641a885af81c3dd16f72afc2122b8a4945d61e0f (diff) | |
parent | b20a00f93e00d73786a2bf00bd8cecb8c5392e89 (diff) | |
download | rtmux-74ecc866cf7613a3af10f400b4d59c12200d38c5.tar.gz rtmux-74ecc866cf7613a3af10f400b4d59c12200d38c5.tar.bz2 rtmux-74ecc866cf7613a3af10f400b4d59c12200d38c5.zip |
Merge branch 'obsd-master'
Diffstat (limited to 'server.c')
-rw-r--r-- | server.c | 56 |
1 files changed, 42 insertions, 14 deletions
@@ -49,7 +49,6 @@ static struct event server_ev_accept; struct cmd_find_state marked_pane; -static int server_create_socket(void); static int server_loop(void); static void server_send_exit(void); static void server_accept(int, short, void *); @@ -98,39 +97,62 @@ server_check_marked(void) /* Create server socket. */ static int -server_create_socket(void) +server_create_socket(char **cause) { struct sockaddr_un sa; size_t size; mode_t mask; - int fd; + int fd, saved_errno; memset(&sa, 0, sizeof sa); sa.sun_family = AF_UNIX; size = strlcpy(sa.sun_path, socket_path, sizeof sa.sun_path); if (size >= sizeof sa.sun_path) { errno = ENAMETOOLONG; - return (-1); + goto fail; } unlink(sa.sun_path); if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) - return (-1); + goto fail; mask = umask(S_IXUSR|S_IXGRP|S_IRWXO); - if (bind(fd, (struct sockaddr *) &sa, sizeof(sa)) == -1) { + if (bind(fd, (struct sockaddr *)&sa, sizeof sa) == -1) { + saved_errno = errno; close(fd); - return (-1); + errno = saved_errno; + goto fail; } umask(mask); if (listen(fd, 128) == -1) { + saved_errno = errno; close(fd); - return (-1); + errno = saved_errno; + goto fail; } setblocking(fd, 0); return (fd); + +fail: + if (cause != NULL) { + xasprintf(cause, "error creating %s (%s)", socket_path, + strerror(errno)); + } + return (-1); +} + +/* Server error callback. */ +static enum cmd_retval +server_start_error(struct cmdq_item *item, void *data) +{ + char *error = data; + + cmdq_error(item, "%s", error); + free(error); + + return (CMD_RETURN_NORMAL); } /* Fork new server. */ @@ -141,6 +163,8 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd, int pair[2]; struct job *job; sigset_t set, oldset; + struct client *c; + char *cause = NULL; if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0) fatal("socketpair failed"); @@ -182,11 +206,10 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd, gettimeofday(&start_time, NULL); - server_fd = server_create_socket(); - if (server_fd == -1) - fatal("couldn't create socket"); - server_update_socket(); - server_client_create(pair[1]); + server_fd = server_create_socket(&cause); + if (server_fd != -1) + server_update_socket(); + c = server_client_create(pair[1]); if (lockfd >= 0) { unlink(lockfile); @@ -194,6 +217,11 @@ server_start(struct tmuxproc *client, struct event_base *base, int lockfd, close(lockfd); } + if (cause != NULL) { + cmdq_append(c, cmdq_get_callback(server_start_error, cause)); + c->flags |= CLIENT_EXIT; + } + start_cfg(); server_add_accept(0); @@ -374,7 +402,7 @@ server_signal(int sig) break; case SIGUSR1: event_del(&server_ev_accept); - fd = server_create_socket(); + fd = server_create_socket(NULL); if (fd != -1) { close(server_fd); server_fd = fd; |