=================================================================== RCS file: /cvsrepo/anoncvs/cvs/src/usr.bin/tmux/window.c,v retrieving revision 1.245 retrieving revision 1.246 diff -u -r1.245 -r1.246 --- src/usr.bin/tmux/window.c 2019/11/28 09:45:16 1.245 +++ src/usr.bin/tmux/window.c 2019/12/12 11:39:56 1.246 @@ -1,4 +1,4 @@ -/* $OpenBSD: window.c,v 1.245 2019/11/28 09:45:16 nicm Exp $ */ +/* $OpenBSD: window.c,v 1.246 2019/12/12 11:39:56 nicm Exp $ */ /* * Copyright (c) 2007 Nicholas Marriott @@ -1598,31 +1598,28 @@ } static void -window_pane_input_callback(struct client *c, int closed, void *data) +window_pane_input_callback(struct client *c, __unused const char *path, + int error, int closed, struct evbuffer *buffer, void *data) { struct window_pane_input_data *cdata = data; struct window_pane *wp; - struct evbuffer *evb = c->stdin_data; - u_char *buf = EVBUFFER_DATA(evb); - size_t len = EVBUFFER_LENGTH(evb); + u_char *buf = EVBUFFER_DATA(buffer); + size_t len = EVBUFFER_LENGTH(buffer); wp = window_pane_find_by_id(cdata->wp); - if (wp == NULL || closed || c->flags & CLIENT_DEAD) { + if (wp == NULL || closed || error != 0 || c->flags & CLIENT_DEAD) { if (wp == NULL) c->flags |= CLIENT_EXIT; - evbuffer_drain(evb, len); - c->stdin_callback = NULL; - server_client_unref(c); - + evbuffer_drain(buffer, len); cmdq_continue(cdata->item); - free(cdata); + server_client_unref(c); + free(cdata); return; } - input_parse_buffer(wp, buf, len); - evbuffer_drain(evb, len); + evbuffer_drain(buffer, len); } int @@ -1641,6 +1638,8 @@ cdata->item = item; cdata->wp = wp->id; - return (server_set_stdin_callback(c, window_pane_input_callback, cdata, - cause)); + c->references++; + file_read(c, "-", window_pane_input_callback, cdata); + + return (0); }