version 1.1, 2015/10/27 13:23:24 |
version 1.2, 2015/10/29 09:35:31 |
|
|
void *arg; |
void *arg; |
}; |
}; |
|
|
static void proc_update_event(struct tmuxpeer *); |
static int peer_check_version(struct tmuxpeer *, struct imsg *); |
|
static void proc_update_event(struct tmuxpeer *); |
|
|
static void |
static void |
proc_event_cb(unused int fd, short events, void *arg) |
proc_event_cb(unused int fd, short events, void *arg) |
|
|
struct tmuxpeer *peer = arg; |
struct tmuxpeer *peer = arg; |
ssize_t n; |
ssize_t n; |
struct imsg imsg; |
struct imsg imsg; |
int v; |
|
|
|
if (!(peer->flags & PEER_BAD) && (events & EV_READ)) { |
if (!(peer->flags & PEER_BAD) && (events & EV_READ)) { |
if ((n = imsg_read(&peer->ibuf)) == -1 || n == 0) { |
if ((n = imsg_read(&peer->ibuf)) == -1 || n == 0) { |
|
|
break; |
break; |
log_debug("peer %p message %d", peer, imsg.hdr.type); |
log_debug("peer %p message %d", peer, imsg.hdr.type); |
|
|
v = imsg.hdr.peerid; |
if (peer_check_version(peer, &imsg) != 0) { |
if (imsg.hdr.type != MSG_VERSION && |
|
v != PROTOCOL_VERSION) { |
|
log_debug("peer %p bad version %d", peer, v); |
|
|
|
proc_send(peer, MSG_VERSION, -1, NULL, 0); |
|
peer->flags |= PEER_BAD; |
|
|
|
if (imsg.fd != -1) |
if (imsg.fd != -1) |
close(imsg.fd); |
close(imsg.fd); |
imsg_free(&imsg); |
imsg_free(&imsg); |
|
|
struct tmuxproc *tp = arg; |
struct tmuxproc *tp = arg; |
|
|
tp->signalcb(signo); |
tp->signalcb(signo); |
|
} |
|
|
|
static int |
|
peer_check_version(struct tmuxpeer *peer, struct imsg *imsg) |
|
{ |
|
int version; |
|
|
|
version = imsg->hdr.peerid & 0xff; |
|
if (imsg->hdr.type != MSG_VERSION && version != PROTOCOL_VERSION) { |
|
log_debug("peer %p bad version %d", peer, version); |
|
|
|
proc_send(peer, MSG_VERSION, -1, NULL, 0); |
|
peer->flags |= PEER_BAD; |
|
|
|
return (-1); |
|
} |
|
imsg->hdr.peerid >>= 8; |
|
return (0); |
} |
} |
|
|
static void |
static void |