version 1.177, 2017/10/12 11:32:27 |
version 1.178, 2017/12/19 15:00:39 |
|
|
|
|
struct cmd_find_state marked_pane; |
struct cmd_find_state marked_pane; |
|
|
static int server_create_socket(void); |
|
static int server_loop(void); |
static int server_loop(void); |
static void server_send_exit(void); |
static void server_send_exit(void); |
static void server_accept(int, short, void *); |
static void server_accept(int, short, void *); |
|
|
|
|
/* Create server socket. */ |
/* Create server socket. */ |
static int |
static int |
server_create_socket(void) |
server_create_socket(char **cause) |
{ |
{ |
struct sockaddr_un sa; |
struct sockaddr_un sa; |
size_t size; |
size_t size; |
mode_t mask; |
mode_t mask; |
int fd; |
int fd, saved_errno; |
|
|
memset(&sa, 0, sizeof sa); |
memset(&sa, 0, sizeof sa); |
sa.sun_family = AF_UNIX; |
sa.sun_family = AF_UNIX; |
size = strlcpy(sa.sun_path, socket_path, sizeof sa.sun_path); |
size = strlcpy(sa.sun_path, socket_path, sizeof sa.sun_path); |
if (size >= sizeof sa.sun_path) { |
if (size >= sizeof sa.sun_path) { |
errno = ENAMETOOLONG; |
errno = ENAMETOOLONG; |
return (-1); |
goto fail; |
} |
} |
unlink(sa.sun_path); |
unlink(sa.sun_path); |
|
|
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) |
if ((fd = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) |
return (-1); |
goto fail; |
|
|
mask = umask(S_IXUSR|S_IXGRP|S_IRWXO); |
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); |
close(fd); |
return (-1); |
errno = saved_errno; |
|
goto fail; |
} |
} |
umask(mask); |
umask(mask); |
|
|
if (listen(fd, 128) == -1) { |
if (listen(fd, 128) == -1) { |
|
saved_errno = errno; |
close(fd); |
close(fd); |
return (-1); |
errno = saved_errno; |
|
goto fail; |
} |
} |
setblocking(fd, 0); |
setblocking(fd, 0); |
|
|
return (fd); |
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. */ |
/* Fork new server. */ |
int |
int |
server_start(struct tmuxproc *client, struct event_base *base, int lockfd, |
server_start(struct tmuxproc *client, struct event_base *base, int lockfd, |
|
|
int pair[2]; |
int pair[2]; |
struct job *job; |
struct job *job; |
sigset_t set, oldset; |
sigset_t set, oldset; |
|
struct client *c; |
|
char *cause = NULL; |
|
|
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0) |
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0) |
fatal("socketpair failed"); |
fatal("socketpair failed"); |
|
|
|
|
gettimeofday(&start_time, NULL); |
gettimeofday(&start_time, NULL); |
|
|
server_fd = server_create_socket(); |
server_fd = server_create_socket(&cause); |
if (server_fd == -1) |
if (server_fd != -1) |
fatal("couldn't create socket"); |
server_update_socket(); |
server_update_socket(); |
c = server_client_create(pair[1]); |
server_client_create(pair[1]); |
|
|
|
if (lockfd >= 0) { |
if (lockfd >= 0) { |
unlink(lockfile); |
unlink(lockfile); |
|
|
close(lockfd); |
close(lockfd); |
} |
} |
|
|
|
if (cause != NULL) { |
|
cmdq_append(c, cmdq_get_callback(server_start_error, cause)); |
|
c->flags |= CLIENT_EXIT; |
|
} |
|
|
start_cfg(); |
start_cfg(); |
|
|
server_add_accept(0); |
server_add_accept(0); |
|
|
break; |
break; |
case SIGUSR1: |
case SIGUSR1: |
event_del(&server_ev_accept); |
event_del(&server_ev_accept); |
fd = server_create_socket(); |
fd = server_create_socket(NULL); |
if (fd != -1) { |
if (fd != -1) { |
close(server_fd); |
close(server_fd); |
server_fd = fd; |
server_fd = fd; |