Hard system hangs on tty code (6-current)
Doug White
dwhite at gumbysoft.com
Mon Jan 3 10:12:46 PST 2005
Could you file a PR on this? Thanks!
On Sun, 2 Jan 2005, Slawa Olhovchenkov wrote:
> 6-current totally hangs by this program, from user, not root.
> No responds on keys pressed, Control-Alt-ESC, switching console and etc.
>
> System run in infinite loop in sys/kern/tty.c:ttread()
>
> ===
> read:
> splx(s);
> /*
> * Input present, check for input mapping and processing.
> */
> first = 1;
> if (ISSET(lflag, ICANON | ISIG))
> goto slowcase;
> for (;;) {
> char ibuf[IBUFSIZ];
> int icc;
>
> icc = imin(uio->uio_resid, IBUFSIZ);
> /* XXX uio_resid==0 => icc=0 */
> icc = q_to_b(qp, ibuf, icc);
> /* icc == 0 */
> if (icc <= 0) {
> if (first)
> goto loop;
>
> ===
>
> #include <stdio.h>
> #include <stdlib.h>
> #include <unistd.h>
> #include <errno.h>
> #include <termios.h>
> #include <sys/types.h>
> #include <sys/stat.h>
> #include <fcntl.h>
> #include <string.h>
>
> #define cfmakeraw(ptr) (ptr)->c_iflag &= ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR\
> |IGNCR|ICRNL|IXON);\
> (ptr)->c_oflag &= ~OPOST;\
> (ptr)->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN);\
> (ptr)->c_cflag &= ~(CSIZE|PARENB);\
> (ptr)->c_cflag |= CS8
>
>
> int
> main(int argc, char *argv[])
> {
> int fd,
> i;
> char *buf[1024];
>
> struct termios tcn;
> if ((fd = open("/dev/tty", O_RDWR | O_NONBLOCK)) == -1) {
> return -1; /* errno already set */
> }
>
> /* Set the tty to raw and to the correct speed */
> tcgetattr(fd, &tcn);
>
> tcn.c_oflag = 0;
> tcn.c_iflag = IGNBRK | IGNPAR;
> tcn.c_cflag = CREAD | CLOCAL | CS8;
>
> tcn.c_lflag = NOFLSH;
>
> cfmakeraw(&tcn);
>
> for (i = 0; i < 16; i++)
> tcn.c_cc[i] = 0;
>
> tcn.c_cc[VMIN] = 1;
> tcn.c_cc[VTIME] = 0;
>
> tcsetattr(fd, TCSANOW, &tcn);
>
> if ((i = fcntl(fd, F_GETFL, 0)) != -1) {
> i &= ~O_NONBLOCK;
> fcntl(fd, F_SETFL, i);
> }
> read(fd, buf, 0);
>
> }
>
>
>
>
--
Doug White | FreeBSD: The Power to Serve
dwhite at gumbysoft.com | www.FreeBSD.org
More information about the freebsd-current
mailing list