[libvirt] [PATCH 2/3] virsh: Rename vshMakeStdinRaw to vshTTYMakeRaw and move it to virsh.c

Peter Krempa pkrempa at redhat.com
Thu Aug 29 16:36:20 UTC 2013


Move the function to virsh.c to the rest of the TTY managing functions
and change the code so that it mirrors the rest.
---
 tools/virsh-console.c | 50 +++++---------------------------------------------
 tools/virsh-console.h |  7 +++----
 tools/virsh-domain.c  |  2 +-
 tools/virsh.c         | 48 +++++++++++++++++++++++++++++++++++++++++++++---
 tools/virsh.h         |  1 +
 5 files changed, 55 insertions(+), 53 deletions(-)

diff --git a/tools/virsh-console.c b/tools/virsh-console.c
index debf12c..cc9cc6a 100644
--- a/tools/virsh-console.c
+++ b/tools/virsh-console.c
@@ -37,6 +37,7 @@
 # include <c-ctype.h>

 # include "internal.h"
+# include "virsh.h"
 # include "virsh-console.h"
 # include "virlog.h"
 # include "virfile.h"
@@ -85,20 +86,6 @@ virConsoleHandleSignal(int sig ATTRIBUTE_UNUSED)
 }


-# ifndef HAVE_CFMAKERAW
-static void
-cfmakeraw(struct termios *attr)
-{
-    attr->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
-                         | INLCR | IGNCR | ICRNL | IXON);
-    attr->c_oflag &= ~OPOST;
-    attr->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
-    attr->c_cflag &= ~(CSIZE | PARENB);
-    attr->c_cflag |= CS8;
-}
-# endif /* !HAVE_CFMAKERAW */
-
-
 static void
 virConsoleShutdown(virConsolePtr con)
 {
@@ -319,40 +306,13 @@ vshGetEscapeChar(const char *s)


 int
-vshMakeStdinRaw(struct termios *ttyattr, bool report_errors)
-{
-    struct termios rawattr;
-    char ebuf[1024];
-
-    if (tcgetattr(STDIN_FILENO, ttyattr) < 0) {
-        if (report_errors)
-            VIR_ERROR(_("unable to get tty attributes: %s"),
-                      virStrerror(errno, ebuf, sizeof(ebuf)));
-        return -1;
-    }
-
-    rawattr = *ttyattr;
-    cfmakeraw(&rawattr);
-
-    if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &rawattr) < 0) {
-        if (report_errors)
-            VIR_ERROR(_("unable to set tty attributes: %s"),
-                      virStrerror(errno, ebuf, sizeof(ebuf)));
-        return -1;
-    }
-
-    return 0;
-}
-
-
-int
-vshRunConsole(virDomainPtr dom,
+vshRunConsole(vshControl *ctl,
+              virDomainPtr dom,
               const char *dev_name,
               const char *escape_seq,
               unsigned int flags)
 {
     int ret = -1;
-    struct termios ttyattr;
     void (*old_sigquit)(int);
     void (*old_sigterm)(int);
     void (*old_sigint)(int);
@@ -365,7 +325,7 @@ vshRunConsole(virDomainPtr dom,
        result in it being echoed back already), and
        also ensure Ctrl-C, etc is blocked, and misc
        other bits */
-    if (vshMakeStdinRaw(&ttyattr, true) < 0)
+    if (vshTTYMakeRaw(ctl, true) < 0)
         goto resettty;

     /* Trap all common signals so that we can safely restore
@@ -433,7 +393,7 @@ cleanup:
 resettty:
     /* Put STDIN back into the (sane?) state we found
        it in before starting */
-    tcsetattr(STDIN_FILENO, TCSAFLUSH, &ttyattr);
+    vshTTYRestore(ctl);

     return ret;
 }
diff --git a/tools/virsh-console.h b/tools/virsh-console.h
index 96ef235..d6dbedd 100644
--- a/tools/virsh-console.h
+++ b/tools/virsh-console.h
@@ -25,15 +25,14 @@

 # ifndef WIN32

-#  include <termios.h>
+#  include <virsh.h>

-int vshRunConsole(virDomainPtr dom,
+int vshRunConsole(vshControl *ctl,
+                  virDomainPtr dom,
                   const char *dev_name,
                   const char *escape_seq,
                   unsigned int flags);

-int vshMakeStdinRaw(struct termios *ttyattr, bool report_errors);
-
 # endif /* !WIN32 */

 #endif /* __VIR_CONSOLE_H__ */
diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
index 60eed51..7a60e48 100644
--- a/tools/virsh-domain.c
+++ b/tools/virsh-domain.c
@@ -2263,7 +2263,7 @@ cmdRunConsole(vshControl *ctl, virDomainPtr dom,
     vshPrintExtra(ctl, _("Connected to domain %s\n"), virDomainGetName(dom));
     vshPrintExtra(ctl, _("Escape character is %s\n"), ctl->escapeChar);
     fflush(stdout);
-    if (vshRunConsole(dom, name, ctl->escapeChar, flags) == 0)
+    if (vshRunConsole(ctl, dom, name, ctl->escapeChar, flags) == 0)
         ret = true;

  cleanup:
diff --git a/tools/virsh.c b/tools/virsh.c
index 0cc9bdd..37e9716 100644
--- a/tools/virsh.c
+++ b/tools/virsh.c
@@ -458,14 +458,13 @@ int
 vshAskReedit(vshControl *ctl, const char *msg)
 {
     int c = -1;
-    struct termios ttyattr;

     if (!isatty(STDIN_FILENO))
         return -1;

     vshReportError(ctl);

-    if (vshMakeStdinRaw(&ttyattr, false) < 0)
+    if (vshTTYMakeRaw(ctl, false) < 0)
         return -1;

     while (true) {
@@ -488,7 +487,7 @@ vshAskReedit(vshControl *ctl, const char *msg)
         }
     }

-    tcsetattr(STDIN_FILENO, TCSAFLUSH, &ttyattr);
+    vshTTYRestore(ctl);

     vshPrint(ctl, "\r\n");
     return c;
@@ -2260,6 +2259,49 @@ vshTTYRestore(vshControl *ctl)
 }


+#ifndef HAVE_CFMAKERAW
+/* provide fallback in case cfmakeraw isn't available */
+static void
+cfmakeraw(struct termios *attr)
+{
+    attr->c_iflag &= ~(IGNBRK | BRKINT | PARMRK | ISTRIP
+                         | INLCR | IGNCR | ICRNL | IXON);
+    attr->c_oflag &= ~OPOST;
+    attr->c_lflag &= ~(ECHO | ECHONL | ICANON | ISIG | IEXTEN);
+    attr->c_cflag &= ~(CSIZE | PARENB);
+    attr->c_cflag |= CS8;
+}
+#endif /* !HAVE_CFMAKERAW */
+
+
+int
+vshTTYMakeRaw(vshControl *ctl, bool report_errors)
+{
+    struct termios rawattr = ctl->termattr;
+    char ebuf[1024];
+
+    if (!ctl->istty) {
+        if (report_errors) {
+            vshError(ctl, "%s",
+                     _("unable to make terminal raw: console isn't a tty"));
+        }
+
+        return -1;
+    }
+
+    cfmakeraw(&rawattr);
+
+    if (tcsetattr(STDIN_FILENO, TCSAFLUSH, &rawattr) < 0) {
+        if (report_errors)
+            vshError(ctl, _("unable to set tty attributes: %s"),
+                     virStrerror(errno, ebuf, sizeof(ebuf)));
+        return -1;
+    }
+
+    return 0;
+}
+
+
 void
 vshError(vshControl *ctl, const char *format, ...)
 {
diff --git a/tools/virsh.h b/tools/virsh.h
index db5934f..8afe13f 100644
--- a/tools/virsh.h
+++ b/tools/virsh.h
@@ -358,6 +358,7 @@ void vshSaveLibvirtError(void);
 bool vshTTYIsInterruptCharacter(vshControl *ctl, const char chr);
 int vshTTYDisableInterrupt(vshControl *ctl);
 int vshTTYRestore(vshControl *ctl);
+int vshTTYMakeRaw(vshControl *ctl, bool report_errors);

 /* allocation wrappers */
 void *_vshMalloc(vshControl *ctl, size_t sz, const char *filename, int line);
-- 
1.8.3.2




More information about the libvir-list mailing list