--- zsh-4.0.4/Src/builtin.c.open Tue Oct 16 02:49:17 2001 +++ zsh-4.0.4/Src/builtin.c Wed May 15 11:55:32 2002 @@ -3489,7 +3489,7 @@ bin_read(char *name, char **args, char * if (!zleactive) { if (SHTTY == -1) { /* need to open /dev/tty specially */ - if ((SHTTY = open("/dev/tty", O_RDWR|O_NOCTTY)) != -1) { + if ((SHTTY = block_open("/dev/tty", O_RDWR|O_NOCTTY)) != -1) { haso = 1; oshout = shout; init_shout(); --- zsh-4.0.4/Src/init.c.open Wed Oct 24 04:16:32 2001 +++ zsh-4.0.4/Src/init.c Wed May 15 12:00:07 2002 @@ -397,7 +397,7 @@ init_io(void) if (isatty(0)) { zsfree(ttystrname); if ((ttystrname = ztrdup(ttyname(0)))) { - SHTTY = movefd(open(ttystrname, O_RDWR | O_NOCTTY)); + SHTTY = movefd(block_open(ttystrname, O_RDWR | O_NOCTTY)); #ifdef TIOCNXCL /* * See if the terminal claims to be busy. If so, and fd 0 @@ -438,7 +438,7 @@ init_io(void) ttystrname = ztrdup(ttyname(1)); } if (SHTTY == -1 && - (SHTTY = movefd(open("/dev/tty", O_RDWR | O_NOCTTY))) != -1) { + (SHTTY = movefd(block_open("/dev/tty", O_RDWR | O_NOCTTY))) != -1) { zsfree(ttystrname); ttystrname = ztrdup(ttyname(SHTTY)); } @@ -1235,3 +1235,33 @@ zsh_main(int argc, char **argv) : "use 'logout' to logout.", NULL, 0); } } + +/**/ +int +block_open (const char *tty, int flags) +{ + int saved_errno; + int fd; + + if ((flags & O_NONBLOCK) == 0) { + fd = open (tty, flags | O_NONBLOCK); + if (fd == -1) + return fd; + flags = fcntl(fd, F_GETFL); + if (flags == -1) + goto bad; + flags &= ~O_NONBLOCK; + if (fcntl(fd, F_SETFL, flags) == -1) + goto bad; + } + else + fd = open (tty, flags); + + return fd; + +bad: + saved_errno = errno; + close (fd); + errno = saved_errno; + return -1; +}