Index: vl.c =================================================================== --- vl.c.orig +++ vl.c @@ -2227,11 +2227,16 @@ static void fd_chr_close(struct CharDriv } /* open a character device to a unix fd */ -static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out) +static CharDriverState *qemu_chr_open_fd(int fd_in, int fd_out, int block) { CharDriverState *chr; FDCharDriver *s; + if (!block) { + socket_set_nonblock(fd_in); + socket_set_nonblock(fd_out); + } + chr = qemu_mallocz(sizeof(CharDriverState)); if (!chr) return NULL; @@ -2259,10 +2264,10 @@ static CharDriverState *qemu_chr_open_fi TFR(fd_out = open(file_out, O_WRONLY | O_TRUNC | O_CREAT | O_BINARY, 0666)); if (fd_out < 0) return NULL; - return qemu_chr_open_fd(-1, fd_out); + return qemu_chr_open_fd(-1, fd_out, 0); } -static CharDriverState *qemu_chr_open_pipe(const char *filename) +static CharDriverState *qemu_chr_open_pipe(const char *filename, int block) { int fd_in, fd_out; char filename_in[256], filename_out[256]; @@ -2280,7 +2285,7 @@ static CharDriverState *qemu_chr_open_pi if (fd_in < 0) return NULL; } - return qemu_chr_open_fd(fd_in, fd_out); + return qemu_chr_open_fd(fd_in, fd_out, block); } @@ -2376,13 +2381,13 @@ static void qemu_chr_close_stdio(struct fd_chr_close(chr); } -static CharDriverState *qemu_chr_open_stdio(void) +static CharDriverState *qemu_chr_open_stdio(int block) { CharDriverState *chr; if (stdio_nb_clients >= STDIO_MAX_CLIENTS) return NULL; - chr = qemu_chr_open_fd(0, 1); + chr = qemu_chr_open_fd(0, 1, block); chr->chr_close = qemu_chr_close_stdio; qemu_set_fd_handler2(0, stdio_read_poll, stdio_read, NULL, chr); stdio_nb_clients++; @@ -2449,7 +2454,7 @@ void cfmakeraw (struct termios *termios_ #endif #if defined(__linux__) || defined(__sun__) -static CharDriverState *qemu_chr_open_pty(void) +static CharDriverState *qemu_chr_open_pty(int block) { struct termios tty; int master_fd, slave_fd; @@ -2463,7 +2468,7 @@ static CharDriverState *qemu_chr_open_pt tcsetattr(slave_fd, TCSAFLUSH, &tty); fprintf(stderr, "char device redirected to %s\n", ptsname(master_fd)); - return qemu_chr_open_fd(master_fd, master_fd); + return qemu_chr_open_fd(master_fd, master_fd, block); } static void tty_serial_init(int fd, int speed, @@ -2578,7 +2583,7 @@ static CharDriverState *qemu_chr_open_tt TFR(fd = open(filename, O_RDWR | O_NONBLOCK)); tty_serial_init(fd, 115200, 'N', 8, 1); - chr = qemu_chr_open_fd(fd, fd); + chr = qemu_chr_open_fd(fd, fd, 0); if (!chr) { close(fd); return NULL; @@ -2588,7 +2593,7 @@ static CharDriverState *qemu_chr_open_tt return chr; } #else /* ! __linux__ && ! __sun__ */ -static CharDriverState *qemu_chr_open_pty(void) +static CharDriverState *qemu_chr_open_pty(int block) { return NULL; } @@ -3582,6 +3587,10 @@ static CharDriverState *qemu_chr_open_tc CharDriverState *qemu_chr_open(const char *filename) { const char *p; + int block = 1; + + if (strstart(filename, "nonblock:", &filename)) + block = 0; if (!strcmp(filename, "vc")) { return text_console_init(&display_state, 0); @@ -3615,11 +3624,11 @@ CharDriverState *qemu_chr_open(const cha } else if (strstart(filename, "file:", &p)) { return qemu_chr_open_file_out(p); } else if (strstart(filename, "pipe:", &p)) { - return qemu_chr_open_pipe(p); + return qemu_chr_open_pipe(p, block); } else if (!strcmp(filename, "pty")) { - return qemu_chr_open_pty(); + return qemu_chr_open_pty(block); } else if (!strcmp(filename, "stdio")) { - return qemu_chr_open_stdio(); + return qemu_chr_open_stdio(block); } else #if defined(__linux__) if (strstart(filename, "/dev/parport", NULL)) {