Support -c like sh(1) to execute a command, useful when tmux is a login

shell. Suggested by halex@.

This includes another protocol version increase (the last for now) so again
restart the tmux server before upgrading.
This commit is contained in:
Nicholas Marriott
2009-09-23 12:03:30 +00:00
parent 18ea820cb0
commit 9200a0be7a
6 changed files with 112 additions and 18 deletions

17
tty.c
View File

@ -44,7 +44,6 @@ void tty_cell(struct tty *,
void
tty_init(struct tty *tty, int fd, char *term)
{
int mode;
char *path;
memset(tty, 0, sizeof *tty);
@ -55,10 +54,6 @@ tty_init(struct tty *tty, int fd, char *term)
else
tty->termname = xstrdup(term);
if ((mode = fcntl(fd, F_GETFL)) == -1)
fatal("fcntl failed");
if (fcntl(fd, F_SETFL, mode|O_NONBLOCK) == -1)
fatal("fcntl failed");
if (fcntl(fd, F_SETFD, FD_CLOEXEC) == -1)
fatal("fcntl failed");
tty->fd = fd;
@ -129,11 +124,16 @@ void
tty_start_tty(struct tty *tty)
{
struct termios tio;
int what;
int what, mode;
if (tty->fd == -1)
return;
if ((mode = fcntl(tty->fd, F_GETFL)) == -1)
fatal("fcntl failed");
if (fcntl(tty->fd, F_SETFL, mode|O_NONBLOCK) == -1)
fatal("fcntl failed");
#if 0
tty_detect_utf8(tty);
#endif
@ -183,6 +183,7 @@ void
tty_stop_tty(struct tty *tty)
{
struct winsize ws;
int mode;
if (!(tty->flags & TTY_STARTED))
return;
@ -193,6 +194,10 @@ tty_stop_tty(struct tty *tty)
* because the fd is invalid. Things like ssh -t can easily leave us
* with a dead tty.
*/
if ((mode = fcntl(tty->fd, F_GETFL)) == -1)
return;
if (fcntl(tty->fd, F_SETFL, mode & ~O_NONBLOCK) == -1)
return;
if (ioctl(tty->fd, TIOCGWINSZ, &ws) == -1)
return;
if (tcsetattr(tty->fd, TCSANOW, &tty->tio) == -1)