diff --git a/tools/console/daemon/io.c b/tools/console/daemon/io.c index 19e23f2372..de712affe3 100644 --- a/tools/console/daemon/io.c +++ b/tools/console/daemon/io.c @@ -402,9 +402,7 @@ static int domain_create_tty(struct domain *dom) assert(dom->slave_fd == -1); assert(dom->master_fd == -1); - cfmakeraw(&term); - - if (openpty(&dom->master_fd, &dom->slave_fd, NULL, &term, NULL) < 0) { + if (openpty(&dom->master_fd, &dom->slave_fd, NULL, NULL, NULL) < 0) { err = errno; dolog(LOG_ERR, "Failed to create tty for domain-%d " "(errno = %i, %s)", @@ -412,6 +410,22 @@ static int domain_create_tty(struct domain *dom) return 0; } + if (tcgetattr(dom->slave_fd, &term) < 0) { + err = errno; + dolog(LOG_ERR, "Failed to get tty attributes for domain-%d " + "(errno = %i, %s)", + dom->domid, err, strerror(err)); + goto out; + } + cfmakeraw(&term); + if (tcsetattr(dom->slave_fd, TCSANOW, &term) < 0) { + err = errno; + dolog(LOG_ERR, "Failed to set tty attributes for domain-%d " + "(errno = %i, %s)", + dom->domid, err, strerror(err)); + goto out; + } + if ((slave = ptsname(dom->master_fd)) == NULL) { err = errno; dolog(LOG_ERR, "Failed to get slave name for domain-%d " @@ -420,14 +434,6 @@ static int domain_create_tty(struct domain *dom) goto out; } - /* Close the slave fd or the guest console output disappears, - * otherwise. - */ - if (dom->slave_fd != -1) { - close(dom->slave_fd); - dom->slave_fd = -1; - } - if (dom->use_consolepath) { success = asprintf(&path, "%s/limit", dom->conspath) != -1;