From owner-freebsd-current@FreeBSD.ORG Mon Jan 3 18:12:46 2005 Return-Path: Delivered-To: freebsd-current@freebsd.org Received: from mx1.FreeBSD.org (mx1.freebsd.org [216.136.204.125]) by hub.freebsd.org (Postfix) with ESMTP id A6B3F16A4CE for ; Mon, 3 Jan 2005 18:12:46 +0000 (GMT) Received: from carver.gumbysoft.com (carver.gumbysoft.com [66.220.23.50]) by mx1.FreeBSD.org (Postfix) with ESMTP id 7A5D443D45 for ; Mon, 3 Jan 2005 18:12:46 +0000 (GMT) (envelope-from dwhite@gumbysoft.com) Received: by carver.gumbysoft.com (Postfix, from userid 1000) id 6C26172DD4; Mon, 3 Jan 2005 10:12:46 -0800 (PST) Received: from localhost (localhost [127.0.0.1]) by carver.gumbysoft.com (Postfix) with ESMTP id 6747A72DCB; Mon, 3 Jan 2005 10:12:46 -0800 (PST) Date: Mon, 3 Jan 2005 10:12:46 -0800 (PST) From: Doug White To: Slawa Olhovchenkov In-Reply-To: <20050102130625.GA22025@mail.acropolis.ru> Message-ID: <20050103101230.O6665@carver.gumbysoft.com> References: <20050102130625.GA22025@mail.acropolis.ru> MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII cc: Poul-Henning Kamp cc: FreeBSD-current@freebsd.org Subject: Re: Hard system hangs on tty code (6-current) X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.1 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Mon, 03 Jan 2005 18:12:46 -0000 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 > #include > #include > #include > #include > #include > #include > #include > #include > > #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@gumbysoft.com | www.FreeBSD.org