thanks, I see the idea but cfmakeraw has some other effects... newlines output by the program are not translated, etc.
My main program now is the VMIN/VTIME stuff. The way irit tries to use is, is basically to be able to do async stdin reading, but this does not work. Whenever I try those settings, no input is ever read by the program. It fgetc() constantly returns -1. Any idea why ? bruno On Thu, 11 Jul 2002, Cyrille Lefevre wrote: > On Wed, Jul 10, 2002 at 09:13:18PM -0700, bruno schwander wrote: > > I making a port (not much really) of Irit > > (http://www.cs.technion.ac.il/~irit/) a modelling environment. > > > > I am having some problems with terminal handling, so all termios guru out > > there, please help ! :-) > > > > At stratup, irit does the following > > > > Termio.c_cc[VEOF] = 0; /* MIN = 0, no minimal length to wait for. */ > > Termio.c_cc[VEOL] = 1; /* TIME - 1 tenth of a second as time o > > > > which seems wrong, I think it should be > > > > Termio.c_cc[VMIN] = 0; /* MIN = 0, no minimal length to wait for. */ > > Termio.c_cc[VTIME] = 1; /* TIME - 1 tenth of a second as time o > > VMIN == VEOF and VTIME == VEOL. > > > then later: > > > > Termio.c_lflag &= ~ICANON; > > take a look at cfmakeraw(3) which is BSD specific, but that's > not important since it's a port *to* BSD :) > > more +/cfmakeraw /usr/src/lib/libc/gen/termios.c > > cfmakeraw(t) > struct termios *t; > { > > t->c_iflag &= >~(IMAXBEL|IXOFF|INPCK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON|IGNPAR); > t->c_iflag |= IGNBRK; > t->c_oflag &= ~OPOST; > t->c_lflag &= >~(ECHO|ECHOE|ECHOK|ECHONL|ICANON|ISIG|IEXTEN|NOFLSH|TOSTOP|PENDIN); > t->c_cflag &= ~(CSIZE|PARENB); > t->c_cflag |= CS8|CREAD; > t->c_cc[VMIN] = 1; > t->c_cc[VTIME] = 0; > } > > so, a short answer could be, as Bernd Walter suggested : > > int > settty(raw) > int raw; > { > static int init; > static struct termios old; > struct termios buf, *new; > > if (!init) { > if (tcgetattr(STDIN_FILENO, &old) < 0) { > printf("tcgetattr failed: %s\n", strerror(errno)); > return(1); > } > init++; > } > if (raw) { > if (init < 2) { > cfmakeraw(&buf); > init++; > } > new = buf; > } else > new = old; > if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &new) < 0) { > printf("tcsetattr failed: %s\n", strerror(errno)); > return(1); > } > return(0); > } > > Cyrille. > -- > Cyrille Lefevre mailto:[EMAIL PROTECTED] > To Unsubscribe: send mail to [EMAIL PROTECTED] with "unsubscribe freebsd-hackers" in the body of the message