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