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 | ... | ... |