From 4dae396f5a326e721fe95acccac9e6b1549b9946 Mon Sep 17 00:00:00 2001 From: Roman Bogorodskiy Date: Mon, 10 Mar 2014 16:32:51 +0400 Subject: [PATCH] Introduce virFDStreamOpenPTY Add virFDStreamOpenPTY() function which is a wrapper around virFDStreamOpenFileInternal() with putting the device it opens into a raw mode. Make virChrdevOpen() use virFDStreamOpenPTY() for VIR_DOMAIN_CHR_TYPE_PTY devices. This fixes mangled console output when libvirt runs on FreeBSD as it requires device it opens to be placed into a raw mode explicitly. --- src/conf/virchrdev.c | 2 +- src/fdstream.c | 53 ++++++++++++++++++++++++++++++++++++++++ src/fdstream.h | 5 ++++ src/libvirt_private.syms | 1 + 4 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/conf/virchrdev.c b/src/conf/virchrdev.c index d23254bf7c..4a886848e1 100644 --- a/src/conf/virchrdev.c +++ b/src/conf/virchrdev.c @@ -410,7 +410,7 @@ int virChrdevOpen(virChrdevsPtr devs, /* open the character device */ switch (source->type) { case VIR_DOMAIN_CHR_TYPE_PTY: - if (virFDStreamOpenFile(st, path, 0, 0, O_RDWR) < 0) + if (virFDStreamOpenPTY(st, path, 0, 0, O_RDWR) < 0) goto error; break; case VIR_DOMAIN_CHR_TYPE_UNIX: diff --git a/src/fdstream.c b/src/fdstream.c index 8813f6f260..d0435c72aa 100644 --- a/src/fdstream.c +++ b/src/fdstream.c @@ -31,6 +31,7 @@ # include #endif #include +#include #include "fdstream.h" #include "virerror.h" @@ -716,6 +717,58 @@ int virFDStreamCreateFile(virStreamPtr st, oflags | O_CREAT, mode); } +#ifdef HAVE_CFMAKERAW +int virFDStreamOpenPTY(virStreamPtr st, + const char *path, + unsigned long long offset, + unsigned long long length, + int oflags) +{ + struct virFDStreamData *fdst = NULL; + struct termios rawattr; + + if (virFDStreamOpenFileInternal(st, path, + offset, length, + oflags | O_CREAT, 0) < 0) + return -1; + + fdst = st->privateData; + + if (tcgetattr(fdst->fd, &rawattr) < 0) { + virReportSystemError(errno, + _("unable to get tty attributes: %s"), + path); + goto cleanup; + } + + cfmakeraw(&rawattr); + + if (tcsetattr(fdst->fd, TCSANOW, &rawattr) < 0) { + virReportSystemError(errno, + _("unable to set tty attributes: %s"), + path); + goto cleanup; + } + + return 0; + +cleanup: + virFDStreamClose(st); + return -1; +} +#else /* !HAVE_CFMAKERAW */ +int virFDStreamOpenPTY(virStreamPtr st, + const char *path, + unsigned long long offset, + unsigned long long length, + int oflags) +{ + return virFDStreamOpenFileInternal(st, path, + offset, length, + oflags | O_CREAT, 0); +} +#endif /* !HAVE_CFMAKERAW */ + int virFDStreamSetInternalCloseCb(virStreamPtr st, virFDStreamInternalCloseCb cb, void *opaque, diff --git a/src/fdstream.h b/src/fdstream.h index 3ca6256ca8..9c7295dfe7 100644 --- a/src/fdstream.h +++ b/src/fdstream.h @@ -54,6 +54,11 @@ int virFDStreamCreateFile(virStreamPtr st, unsigned long long length, int oflags, mode_t mode); +int virFDStreamOpenPTY(virStreamPtr st, + const char *path, + unsigned long long offset, + unsigned long long length, + int oflags); int virFDStreamSetInternalCloseCb(virStreamPtr st, virFDStreamInternalCloseCb cb, diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms index fe8461f7a0..5904036e98 100644 --- a/src/libvirt_private.syms +++ b/src/libvirt_private.syms @@ -800,6 +800,7 @@ virFDStreamConnectUNIX; virFDStreamCreateFile; virFDStreamOpen; virFDStreamOpenFile; +virFDStreamOpenPTY; virFDStreamSetIOHelper; -- GitLab