# include <c-ctype.h>
# include "internal.h"
+# include "virsh.h"
# include "virsh-console.h"
# include "virlog.h"
# include "virfile.h"
}
-# 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)
{
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);
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
if (VIR_ALLOC(con) < 0)
goto cleanup;
- con->escapeChar = vshGetEscapeChar(escape_seq);
+ con->escapeChar = vshGetEscapeChar(ctl->escapeChar);
con->st = virStreamNew(virDomainGetConnect(dom),
VIR_STREAM_NONBLOCK);
if (!con->st)
resettty:
/* Put STDIN back into the (sane?) state we found
it in before starting */
- tcsetattr(STDIN_FILENO, TCSAFLUSH, &ttyattr);
+ vshTTYRestore(ctl);
return ret;
}
# 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__ */
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, flags) == 0)
ret = true;
cleanup:
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) {
}
}
- tcsetattr(STDIN_FILENO, TCSAFLUSH, &ttyattr);
+ vshTTYRestore(ctl);
vshPrint(ctl, "\r\n");
return c;
}
+#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, ...)
{
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);