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 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list