version 1.19, 2020/10/26 19:00:37 |
version 1.20, 2021/02/11 09:39:29 |
|
|
|
|
#include <sys/types.h> |
#include <sys/types.h> |
#include <sys/queue.h> |
#include <sys/queue.h> |
|
#include <sys/socket.h> |
#include <sys/uio.h> |
#include <sys/uio.h> |
#include <sys/utsname.h> |
#include <sys/utsname.h> |
|
|
|
|
struct event ev_sigusr1; |
struct event ev_sigusr1; |
struct event ev_sigusr2; |
struct event ev_sigusr2; |
struct event ev_sigwinch; |
struct event ev_sigwinch; |
|
|
|
TAILQ_HEAD(, tmuxpeer) peers; |
}; |
}; |
|
|
struct tmuxpeer { |
struct tmuxpeer { |
|
|
|
|
void (*dispatchcb)(struct imsg *, void *); |
void (*dispatchcb)(struct imsg *, void *); |
void *arg; |
void *arg; |
|
|
|
TAILQ_ENTRY(tmuxpeer) entry; |
}; |
}; |
|
|
static int peer_check_version(struct tmuxpeer *, struct imsg *); |
static int peer_check_version(struct tmuxpeer *, struct imsg *); |
|
|
|
|
tp = xcalloc(1, sizeof *tp); |
tp = xcalloc(1, sizeof *tp); |
tp->name = xstrdup(name); |
tp->name = xstrdup(name); |
|
TAILQ_INIT(&tp->peers); |
|
|
return (tp); |
return (tp); |
} |
} |
|
|
void |
void |
proc_exit(struct tmuxproc *tp) |
proc_exit(struct tmuxproc *tp) |
{ |
{ |
|
struct tmuxpeer *peer; |
|
|
|
TAILQ_FOREACH(peer, &tp->peers, entry) |
|
imsg_flush(&peer->ibuf); |
tp->exit = 1; |
tp->exit = 1; |
} |
} |
|
|
|
|
event_set(&peer->event, fd, EV_READ, proc_event_cb, peer); |
event_set(&peer->event, fd, EV_READ, proc_event_cb, peer); |
|
|
log_debug("add peer %p: %d (%p)", peer, fd, arg); |
log_debug("add peer %p: %d (%p)", peer, fd, arg); |
|
TAILQ_INSERT_TAIL(&tp->peers, peer, entry); |
|
|
proc_update_event(peer); |
proc_update_event(peer); |
return (peer); |
return (peer); |
|
|
void |
void |
proc_remove_peer(struct tmuxpeer *peer) |
proc_remove_peer(struct tmuxpeer *peer) |
{ |
{ |
|
TAILQ_REMOVE(&peer->parent->peers, peer, entry); |
log_debug("remove peer %p", peer); |
log_debug("remove peer %p", peer); |
|
|
event_del(&peer->event); |
event_del(&peer->event); |
|
|
proc_toggle_log(struct tmuxproc *tp) |
proc_toggle_log(struct tmuxproc *tp) |
{ |
{ |
log_toggle(tp->name); |
log_toggle(tp->name); |
|
} |
|
|
|
pid_t |
|
proc_fork_and_daemon(int *fd) |
|
{ |
|
pid_t pid; |
|
int pair[2]; |
|
|
|
if (socketpair(AF_UNIX, SOCK_STREAM, PF_UNSPEC, pair) != 0) |
|
fatal("socketpair failed"); |
|
switch (pid = fork()) { |
|
case -1: |
|
fatal("fork failed"); |
|
case 0: |
|
close(pair[0]); |
|
*fd = pair[1]; |
|
if (daemon(1, 0) != 0) |
|
fatal("daemon failed"); |
|
return (0); |
|
default: |
|
close(pair[1]); |
|
*fd = pair[0]; |
|
return (pid); |
|
} |
} |
} |