From d193847d4086ce3d3a08d741cb0d93ded9353976 Mon Sep 17 00:00:00 2001 From: Andre Noll Date: Sat, 28 Jan 2017 19:33:26 +0100 Subject: [PATCH 1/1] i9e: Restore file status flags on exit. The i9e subsystem sets the stdin and stdout fds passed to i9e_open() to nonblocking mode but misses to restore the original flags in i9e_close(). This causes terminal applications like dialog to fail if they are started in the same terminal after e.g. para_play was executed. This commit modifies i9e_open() to fetch and save the file status flags before setting the O_NONBLOCK flag, and i9e_close() to restore the original value. STDERR is not affected. --- interactive.c | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/interactive.c b/interactive.c index b72148cc..c34a0f6e 100644 --- a/interactive.c +++ b/interactive.c @@ -38,6 +38,7 @@ struct i9e_private { bool caught_sigterm; Keymap standard_km; Keymap bare_km; + int fd_flags[2]; }; static struct i9e_private i9e_private, *i9ep = &i9e_private; @@ -254,6 +255,8 @@ void i9e_close(void) if (hf) write_history(hf); wipe_bottom_line(); + fcntl(i9ep->ici->fds[0], F_SETFL, i9ep->fd_flags[0]); + fcntl(i9ep->ici->fds[1], F_SETFL, i9ep->fd_flags[1]); } static void clear_bottom_line(void) @@ -476,6 +479,14 @@ int i9e_open(struct i9e_client_info *ici, struct sched *s) memset(i9ep, 0, sizeof(struct i9e_private)); if (!isatty(ici->fds[0])) return -E_I9E_SETUPTERM; + ret = fcntl(ici->fds[0], F_GETFL); + if (ret < 0) + return -E_I9E_SETUPTERM; + i9ep->fd_flags[0] = ret; + ret = fcntl(ici->fds[1], F_GETFL); + if (ret < 0) + return -E_I9E_SETUPTERM; + i9ep->fd_flags[1] = ret; ret = mark_fd_nonblocking(ici->fds[0]); if (ret < 0) return ret; -- 2.39.2