]> xenbits.xensource.com Git - people/liuw/libxenctrl-split/libvirt.git/commitdiff
Introduce virFDStreamOpenPTY
authorRoman Bogorodskiy <bogorodskiy@gmail.com>
Mon, 10 Mar 2014 12:32:51 +0000 (16:32 +0400)
committerRoman Bogorodskiy <bogorodskiy@gmail.com>
Fri, 21 Mar 2014 15:09:36 +0000 (19:09 +0400)
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
src/fdstream.c
src/fdstream.h
src/libvirt_private.syms

index d23254bf7cc9f88e5752ad13a60c56f22588f322..4a886848e133269df18c44ae3a2d264daa2a94a3 100644 (file)
@@ -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:
index 8813f6f260e18005ab424578bcd42f06fdbdaf75..d0435c72aaee15fc646f2dd2b60f15fafbfd5e54 100644 (file)
@@ -31,6 +31,7 @@
 # include <sys/un.h>
 #endif
 #include <netinet/in.h>
+#include <termios.h>
 
 #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,
index 3ca6256ca8eb8dd8fdfc574179fbc129373b51f9..9c7295dfe782bea995722b6fa79fefa882829d79 100644 (file)
@@ -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,
index fe8461f7a0c568d4aa4f0e7b31bba6b672cf63a9..5904036e98ba92ae6102613c3cfb144b7dde86e5 100644 (file)
@@ -800,6 +800,7 @@ virFDStreamConnectUNIX;
 virFDStreamCreateFile;
 virFDStreamOpen;
 virFDStreamOpenFile;
+virFDStreamOpenPTY;
 virFDStreamSetIOHelper;