提交 02eaf182 编写于 作者: P Peter Krempa

virsh: Rename vshMakeStdinRaw to vshTTYMakeRaw and move it to virsh.c

Move the function to virsh.c to the rest of the TTY managing functions
and change the code so that it mirrors the rest.
上级 40f1d18f
......@@ -38,6 +38,7 @@
# include <c-ctype.h>
# include "internal.h"
# include "virsh.h"
# include "virsh-console.h"
# include "virlog.h"
# include "virfile.h"
......@@ -86,20 +87,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)
{
......@@ -320,40 +307,12 @@ 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);
......@@ -366,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
......@@ -383,7 +342,7 @@ vshRunConsole(virDomainPtr dom,
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)
......@@ -434,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;
}
......
......@@ -26,15 +26,13 @@
# 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__ */
......@@ -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, flags) == 0)
ret = true;
cleanup:
......
......@@ -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, ...)
{
......
......@@ -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);
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册