Commit 64b7b7334b92c1fdc1bb7d3d1afc342656c59539
1 parent
f2bf094e
Put Pseudo-TTY in rawmode for char devices
(Daniel P. Berrange) git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4338 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
62 additions
and
12 deletions
vl.c
... | ... | @@ -2269,28 +2269,78 @@ static CharDriverState *qemu_chr_open_stdio(void) |
2269 | 2269 | return chr; |
2270 | 2270 | } |
2271 | 2271 | |
2272 | +#ifdef __sun__ | |
2273 | +/* Once Solaris has openpty(), this is going to be removed. */ | |
2274 | +int openpty(int *amaster, int *aslave, char *name, | |
2275 | + struct termios *termp, struct winsize *winp) | |
2276 | +{ | |
2277 | + const char *slave; | |
2278 | + int mfd = -1, sfd = -1; | |
2279 | + | |
2280 | + *amaster = *aslave = -1; | |
2281 | + | |
2282 | + mfd = open("/dev/ptmx", O_RDWR | O_NOCTTY); | |
2283 | + if (mfd < 0) | |
2284 | + goto err; | |
2285 | + | |
2286 | + if (grantpt(mfd) == -1 || unlockpt(mfd) == -1) | |
2287 | + goto err; | |
2288 | + | |
2289 | + if ((slave = ptsname(mfd)) == NULL) | |
2290 | + goto err; | |
2291 | + | |
2292 | + if ((sfd = open(slave, O_RDONLY | O_NOCTTY)) == -1) | |
2293 | + goto err; | |
2294 | + | |
2295 | + if (ioctl(sfd, I_PUSH, "ptem") == -1 || | |
2296 | + (termp != NULL && tcgetattr(sfd, termp) < 0)) | |
2297 | + goto err; | |
2298 | + | |
2299 | + if (amaster) | |
2300 | + *amaster = mfd; | |
2301 | + if (aslave) | |
2302 | + *aslave = sfd; | |
2303 | + if (winp) | |
2304 | + ioctl(sfd, TIOCSWINSZ, winp); | |
2305 | + | |
2306 | + return 0; | |
2307 | + | |
2308 | +err: | |
2309 | + if (sfd != -1) | |
2310 | + close(sfd); | |
2311 | + close(mfd); | |
2312 | + return -1; | |
2313 | +} | |
2314 | + | |
2315 | +void cfmakeraw (struct termios *termios_p) | |
2316 | +{ | |
2317 | + termios_p->c_iflag &= | |
2318 | + ~(IGNBRK|BRKINT|PARMRK|ISTRIP|INLCR|IGNCR|ICRNL|IXON); | |
2319 | + termios_p->c_oflag &= ~OPOST; | |
2320 | + termios_p->c_lflag &= ~(ECHO|ECHONL|ICANON|ISIG|IEXTEN); | |
2321 | + termios_p->c_cflag &= ~(CSIZE|PARENB); | |
2322 | + termios_p->c_cflag |= CS8; | |
2323 | + | |
2324 | + termios_p->c_cc[VMIN] = 0; | |
2325 | + termios_p->c_cc[VTIME] = 0; | |
2326 | +} | |
2327 | +#endif | |
2328 | + | |
2272 | 2329 | #if defined(__linux__) || defined(__sun__) |
2273 | 2330 | static CharDriverState *qemu_chr_open_pty(void) |
2274 | 2331 | { |
2275 | 2332 | struct termios tty; |
2276 | - char slave_name[1024]; | |
2277 | 2333 | int master_fd, slave_fd; |
2278 | 2334 | |
2279 | -#if defined(__linux__) | |
2280 | - /* Not satisfying */ | |
2281 | - if (openpty(&master_fd, &slave_fd, slave_name, NULL, NULL) < 0) { | |
2335 | + if (openpty(&master_fd, &slave_fd, NULL, NULL, NULL) < 0) { | |
2282 | 2336 | return NULL; |
2283 | 2337 | } |
2284 | -#endif | |
2285 | 2338 | |
2286 | - /* Disabling local echo and line-buffered output */ | |
2287 | - tcgetattr (master_fd, &tty); | |
2288 | - tty.c_lflag &= ~(ECHO|ICANON|ISIG); | |
2289 | - tty.c_cc[VMIN] = 1; | |
2290 | - tty.c_cc[VTIME] = 0; | |
2291 | - tcsetattr (master_fd, TCSAFLUSH, &tty); | |
2339 | + /* Set raw attributes on the pty. */ | |
2340 | + cfmakeraw(&tty); | |
2341 | + tcsetattr(slave_fd, TCSAFLUSH, &tty); | |
2292 | 2342 | |
2293 | - fprintf(stderr, "char device redirected to %s\n", slave_name); | |
2343 | + fprintf(stderr, "char device redirected to %s\n", ptsname(master_fd)); | |
2294 | 2344 | return qemu_chr_open_fd(master_fd, master_fd); |
2295 | 2345 | } |
2296 | 2346 | ... | ... |