--- src/cmd/builtin/pty.c +++ src/cmd/builtin/pty.c 2014-02-18 14:37:47.047276323 +0000 @@ -113,6 +113,13 @@ USAGE_LICENSE #include #include "FEATURE/pty" +#ifdef __linux__ +# if !_lib_openpty +# undef _lib_openpty +# define _lib_openpty 1 +# endif +#endif + #define MODE_666 (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) #define MAXNAME 64 @@ -216,27 +223,59 @@ mkpty(int* master, int* slave) #if !_lib_openpty char* sname; #endif +#ifdef __linux__ + sigset_t blckttou, oldset; + (void)sigemptyset(&blckttou); + (void)sigaddset(&blckttou, SIGTTOU); + sigprocmask(SIG_BLOCK, &blckttou, &oldset); +#endif /* * some systems hang hard during the handshake * if you know why then please let us know */ - alarm(4); - if (tcgetattr(sffileno(sfstderr), &tty) >= 0) - ttyp = &tty; - else + alarm(6); + if (tcgetattr(sffileno(sfstderr), &tty) < 0) { + if (errno != ENOTTY) + error(-1, "unable to get standard error terminal attributes"); + cfmakeraw(&tty); ttyp = 0; - error(-1, "unable to get standard error terminal attributes"); } + tty.c_lflag |= ICANON | IEXTEN | ISIG | ECHO|ECHOE|ECHOK|ECHOKE; + tty.c_oflag |= (ONLCR | OPOST); + tty.c_oflag &= ~(OCRNL | ONLRET); + tty.c_iflag |= BRKINT; + tty.c_iflag &= ~IGNBRK; + tty.c_lflag |= ISIG; + tty.c_cc[VTIME] = 0; + tty.c_cc[VMIN] = CMIN; +#ifdef B115200 + cfsetispeed(&tty, B115200); + cfsetospeed(&tty, B115200); +#elif defined(B57600) + cfsetispeed(&tty, B57600); + cfsetospeed(&tty, B57600); +#elif defined(B38400) + cfsetispeed(&tty, B38400); + cfsetospeed(&tty, B38400); +#endif + ttyp = &tty; + #ifdef TIOCGWINSZ - if (ioctl(sffileno(sfstderr), TIOCGWINSZ, &win) >= 0) - winp = &win; - else + if (ioctl(sffileno(sfstderr), TIOCGWINSZ, &win) < 0) { + if (errno != ENOTTY) + error(-1, "unable to get standard error window size"); + win.ws_row = 0; + win.ws_col = 0; winp = 0; - error(-1, "unable to get standard error window size"); } + if (win.ws_row < 24) + win.ws_row = 24; + if (win.ws_col < 80) + win.ws_col = 80; + winp = &win; #endif #if _lib_openpty if (openpty(master, slave, NULL, ttyp, winp) < 0) @@ -279,6 +318,9 @@ mkpty(int* master, int* slave) #if !O_cloexec fcntl(*slave, F_SETFD, FD_CLOEXEC); #endif +#ifdef __linux__ + sigprocmask(SIG_SETMASK, &oldset, NULL); +#endif alarm(0); return 0; } --- src/cmd/builtin/what.c +++ src/cmd/builtin/what.c 2014-02-18 14:29:07.979144811 +0000 @@ -68,7 +68,7 @@ static struct int match; int single; size_t skip[UCHAR_MAX+1]; - unsigned char prev[3]; + unsigned char prev[4]; } state; static void @@ -99,7 +99,7 @@ what(const char* file, Sfio_t* ip, Sfio_ { next: s = state.prev; - s[0] = s[1] = s[2] = 0; + s[0] = s[1] = s[2] = s[3] = 0; switch (mid) { default: