Merge branch 'obsd-master'

This commit is contained in:
Thomas Adam
2017-12-19 16:01:20 +00:00
4 changed files with 49 additions and 16 deletions

View File

@ -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;