summary |
shortlog |
log |
commit | commitdiff |
tree
raw |
patch |
inline | side by side (from parent 1:
bc78a94)
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.
bool caught_sigterm;
Keymap standard_km;
Keymap bare_km;
bool caught_sigterm;
Keymap standard_km;
Keymap bare_km;
};
static struct i9e_private i9e_private, *i9ep = &i9e_private;
};
static struct i9e_private i9e_private, *i9ep = &i9e_private;
if (hf)
write_history(hf);
wipe_bottom_line();
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)
}
static void clear_bottom_line(void)
memset(i9ep, 0, sizeof(struct i9e_private));
if (!isatty(ici->fds[0]))
return -E_I9E_SETUPTERM;
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;
ret = mark_fd_nonblocking(ici->fds[0]);
if (ret < 0)
return ret;