mirror of
https://github.com/tmux/tmux.git
synced 2024-12-04 19:58:48 +00:00
imsg no longer associates file descriptors with the imsg they were sent with,
work around this for the moment (it is not clear if this is intentional).
This commit is contained in:
parent
1365f1ce52
commit
0f308bd18f
27
proc.c
27
proc.c
@ -55,6 +55,7 @@ struct tmuxpeer {
|
|||||||
struct tmuxproc *parent;
|
struct tmuxproc *parent;
|
||||||
|
|
||||||
struct imsgbuf ibuf;
|
struct imsgbuf ibuf;
|
||||||
|
int lastfd;
|
||||||
struct event event;
|
struct event event;
|
||||||
uid_t uid;
|
uid_t uid;
|
||||||
|
|
||||||
@ -71,7 +72,7 @@ static int peer_check_version(struct tmuxpeer *, struct imsg *);
|
|||||||
static void proc_update_event(struct tmuxpeer *);
|
static void proc_update_event(struct tmuxpeer *);
|
||||||
|
|
||||||
static void
|
static void
|
||||||
proc_event_cb(__unused int fd, short events, void *arg)
|
proc_event_cb(int fd, short events, void *arg)
|
||||||
{
|
{
|
||||||
struct tmuxpeer *peer = arg;
|
struct tmuxpeer *peer = arg;
|
||||||
ssize_t n;
|
ssize_t n;
|
||||||
@ -89,12 +90,16 @@ proc_event_cb(__unused int fd, short events, void *arg)
|
|||||||
}
|
}
|
||||||
if (n == 0)
|
if (n == 0)
|
||||||
break;
|
break;
|
||||||
log_debug("peer %p message %d", peer, imsg.hdr.type);
|
fd = imsg_get_fd(&imsg);
|
||||||
|
log_debug("peer %p message %d fd %d", peer,
|
||||||
|
imsg.hdr.type, fd);
|
||||||
|
if (fd != -1) {
|
||||||
|
if (peer->lastfd != -1)
|
||||||
|
close(peer->lastfd);
|
||||||
|
peer->lastfd = fd;
|
||||||
|
}
|
||||||
|
|
||||||
if (peer_check_version(peer, &imsg) != 0) {
|
if (peer_check_version(peer, &imsg) != 0) {
|
||||||
fd = imsg_get_fd(&imsg);
|
|
||||||
if (fd != -1)
|
|
||||||
close(fd);
|
|
||||||
imsg_free(&imsg);
|
imsg_free(&imsg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -308,6 +313,7 @@ proc_add_peer(struct tmuxproc *tp, int fd,
|
|||||||
|
|
||||||
peer = xcalloc(1, sizeof *peer);
|
peer = xcalloc(1, sizeof *peer);
|
||||||
peer->parent = tp;
|
peer->parent = tp;
|
||||||
|
peer->lastfd = -1;
|
||||||
|
|
||||||
peer->dispatchcb = dispatchcb;
|
peer->dispatchcb = dispatchcb;
|
||||||
peer->arg = arg;
|
peer->arg = arg;
|
||||||
@ -336,6 +342,8 @@ proc_remove_peer(struct tmuxpeer *peer)
|
|||||||
event_del(&peer->event);
|
event_del(&peer->event);
|
||||||
imsgbuf_clear(&peer->ibuf);
|
imsgbuf_clear(&peer->ibuf);
|
||||||
|
|
||||||
|
if (peer->lastfd != -1)
|
||||||
|
close(peer->lastfd);
|
||||||
close(peer->ibuf.fd);
|
close(peer->ibuf.fd);
|
||||||
free(peer);
|
free(peer);
|
||||||
}
|
}
|
||||||
@ -387,3 +395,12 @@ proc_get_peer_uid(struct tmuxpeer *peer)
|
|||||||
{
|
{
|
||||||
return (peer->uid);
|
return (peer->uid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
proc_get_last_fd(struct tmuxpeer *peer)
|
||||||
|
{
|
||||||
|
int fd = peer->lastfd;
|
||||||
|
|
||||||
|
peer->lastfd = -1;
|
||||||
|
return (fd);
|
||||||
|
}
|
||||||
|
@ -3559,13 +3559,13 @@ server_client_dispatch_identify(struct client *c, struct imsg *imsg)
|
|||||||
case MSG_IDENTIFY_STDIN:
|
case MSG_IDENTIFY_STDIN:
|
||||||
if (datalen != 0)
|
if (datalen != 0)
|
||||||
fatalx("bad MSG_IDENTIFY_STDIN size");
|
fatalx("bad MSG_IDENTIFY_STDIN size");
|
||||||
c->fd = imsg_get_fd(imsg);
|
c->fd = proc_get_last_fd(c->peer);
|
||||||
log_debug("client %p IDENTIFY_STDIN %d", c, c->fd);
|
log_debug("client %p IDENTIFY_STDIN %d", c, c->fd);
|
||||||
break;
|
break;
|
||||||
case MSG_IDENTIFY_STDOUT:
|
case MSG_IDENTIFY_STDOUT:
|
||||||
if (datalen != 0)
|
if (datalen != 0)
|
||||||
fatalx("bad MSG_IDENTIFY_STDOUT size");
|
fatalx("bad MSG_IDENTIFY_STDOUT size");
|
||||||
c->out_fd = imsg_get_fd(imsg);
|
c->out_fd = proc_get_last_fd(c->peer);
|
||||||
log_debug("client %p IDENTIFY_STDOUT %d", c, c->out_fd);
|
log_debug("client %p IDENTIFY_STDOUT %d", c, c->out_fd);
|
||||||
break;
|
break;
|
||||||
case MSG_IDENTIFY_ENVIRON:
|
case MSG_IDENTIFY_ENVIRON:
|
||||||
|
1
tmux.h
1
tmux.h
@ -2225,6 +2225,7 @@ void proc_flush_peer(struct tmuxpeer *);
|
|||||||
void proc_toggle_log(struct tmuxproc *);
|
void proc_toggle_log(struct tmuxproc *);
|
||||||
pid_t proc_fork_and_daemon(int *);
|
pid_t proc_fork_and_daemon(int *);
|
||||||
uid_t proc_get_peer_uid(struct tmuxpeer *);
|
uid_t proc_get_peer_uid(struct tmuxpeer *);
|
||||||
|
int proc_get_last_fd(struct tmuxpeer *);
|
||||||
|
|
||||||
/* cfg.c */
|
/* cfg.c */
|
||||||
extern int cfg_finished;
|
extern int cfg_finished;
|
||||||
|
Loading…
Reference in New Issue
Block a user