mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-01-30 16:35:24 +00:00
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.
This commit is contained in:
parent
40f1d18fea
commit
02eaf1821c
@ -38,6 +38,7 @@
|
|||||||
# include <c-ctype.h>
|
# include <c-ctype.h>
|
||||||
|
|
||||||
# include "internal.h"
|
# include "internal.h"
|
||||||
|
# include "virsh.h"
|
||||||
# include "virsh-console.h"
|
# include "virsh-console.h"
|
||||||
# include "virlog.h"
|
# include "virlog.h"
|
||||||
# include "virfile.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
|
static void
|
||||||
virConsoleShutdown(virConsolePtr con)
|
virConsoleShutdown(virConsolePtr con)
|
||||||
{
|
{
|
||||||
@ -320,40 +307,12 @@ vshGetEscapeChar(const char *s)
|
|||||||
|
|
||||||
|
|
||||||
int
|
int
|
||||||
vshMakeStdinRaw(struct termios *ttyattr, bool report_errors)
|
vshRunConsole(vshControl *ctl,
|
||||||
{
|
virDomainPtr dom,
|
||||||
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,
|
|
||||||
const char *dev_name,
|
const char *dev_name,
|
||||||
const char *escape_seq,
|
|
||||||
unsigned int flags)
|
unsigned int flags)
|
||||||
{
|
{
|
||||||
int ret = -1;
|
int ret = -1;
|
||||||
struct termios ttyattr;
|
|
||||||
void (*old_sigquit)(int);
|
void (*old_sigquit)(int);
|
||||||
void (*old_sigterm)(int);
|
void (*old_sigterm)(int);
|
||||||
void (*old_sigint)(int);
|
void (*old_sigint)(int);
|
||||||
@ -366,7 +325,7 @@ vshRunConsole(virDomainPtr dom,
|
|||||||
result in it being echoed back already), and
|
result in it being echoed back already), and
|
||||||
also ensure Ctrl-C, etc is blocked, and misc
|
also ensure Ctrl-C, etc is blocked, and misc
|
||||||
other bits */
|
other bits */
|
||||||
if (vshMakeStdinRaw(&ttyattr, true) < 0)
|
if (vshTTYMakeRaw(ctl, true) < 0)
|
||||||
goto resettty;
|
goto resettty;
|
||||||
|
|
||||||
/* Trap all common signals so that we can safely restore
|
/* Trap all common signals so that we can safely restore
|
||||||
@ -383,7 +342,7 @@ vshRunConsole(virDomainPtr dom,
|
|||||||
if (VIR_ALLOC(con) < 0)
|
if (VIR_ALLOC(con) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
con->escapeChar = vshGetEscapeChar(escape_seq);
|
con->escapeChar = vshGetEscapeChar(ctl->escapeChar);
|
||||||
con->st = virStreamNew(virDomainGetConnect(dom),
|
con->st = virStreamNew(virDomainGetConnect(dom),
|
||||||
VIR_STREAM_NONBLOCK);
|
VIR_STREAM_NONBLOCK);
|
||||||
if (!con->st)
|
if (!con->st)
|
||||||
@ -434,7 +393,7 @@ cleanup:
|
|||||||
resettty:
|
resettty:
|
||||||
/* Put STDIN back into the (sane?) state we found
|
/* Put STDIN back into the (sane?) state we found
|
||||||
it in before starting */
|
it in before starting */
|
||||||
tcsetattr(STDIN_FILENO, TCSAFLUSH, &ttyattr);
|
vshTTYRestore(ctl);
|
||||||
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
@ -26,15 +26,13 @@
|
|||||||
|
|
||||||
# ifndef WIN32
|
# ifndef WIN32
|
||||||
|
|
||||||
# include <termios.h>
|
# include <virsh.h>
|
||||||
|
|
||||||
int vshRunConsole(virDomainPtr dom,
|
int vshRunConsole(vshControl *ctl,
|
||||||
|
virDomainPtr dom,
|
||||||
const char *dev_name,
|
const char *dev_name,
|
||||||
const char *escape_seq,
|
|
||||||
unsigned int flags);
|
unsigned int flags);
|
||||||
|
|
||||||
int vshMakeStdinRaw(struct termios *ttyattr, bool report_errors);
|
|
||||||
|
|
||||||
# endif /* !WIN32 */
|
# endif /* !WIN32 */
|
||||||
|
|
||||||
#endif /* __VIR_CONSOLE_H__ */
|
#endif /* __VIR_CONSOLE_H__ */
|
||||||
|
@ -2263,7 +2263,7 @@ cmdRunConsole(vshControl *ctl, virDomainPtr dom,
|
|||||||
vshPrintExtra(ctl, _("Connected to domain %s\n"), virDomainGetName(dom));
|
vshPrintExtra(ctl, _("Connected to domain %s\n"), virDomainGetName(dom));
|
||||||
vshPrintExtra(ctl, _("Escape character is %s\n"), ctl->escapeChar);
|
vshPrintExtra(ctl, _("Escape character is %s\n"), ctl->escapeChar);
|
||||||
fflush(stdout);
|
fflush(stdout);
|
||||||
if (vshRunConsole(dom, name, ctl->escapeChar, flags) == 0)
|
if (vshRunConsole(ctl, dom, name, flags) == 0)
|
||||||
ret = true;
|
ret = true;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
@ -458,14 +458,13 @@ int
|
|||||||
vshAskReedit(vshControl *ctl, const char *msg)
|
vshAskReedit(vshControl *ctl, const char *msg)
|
||||||
{
|
{
|
||||||
int c = -1;
|
int c = -1;
|
||||||
struct termios ttyattr;
|
|
||||||
|
|
||||||
if (!isatty(STDIN_FILENO))
|
if (!isatty(STDIN_FILENO))
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
vshReportError(ctl);
|
vshReportError(ctl);
|
||||||
|
|
||||||
if (vshMakeStdinRaw(&ttyattr, false) < 0)
|
if (vshTTYMakeRaw(ctl, false) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
while (true) {
|
while (true) {
|
||||||
@ -488,7 +487,7 @@ vshAskReedit(vshControl *ctl, const char *msg)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
tcsetattr(STDIN_FILENO, TCSAFLUSH, &ttyattr);
|
vshTTYRestore(ctl);
|
||||||
|
|
||||||
vshPrint(ctl, "\r\n");
|
vshPrint(ctl, "\r\n");
|
||||||
return c;
|
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
|
void
|
||||||
vshError(vshControl *ctl, const char *format, ...)
|
vshError(vshControl *ctl, const char *format, ...)
|
||||||
{
|
{
|
||||||
|
@ -358,6 +358,7 @@ void vshSaveLibvirtError(void);
|
|||||||
bool vshTTYIsInterruptCharacter(vshControl *ctl, const char chr);
|
bool vshTTYIsInterruptCharacter(vshControl *ctl, const char chr);
|
||||||
int vshTTYDisableInterrupt(vshControl *ctl);
|
int vshTTYDisableInterrupt(vshControl *ctl);
|
||||||
int vshTTYRestore(vshControl *ctl);
|
int vshTTYRestore(vshControl *ctl);
|
||||||
|
int vshTTYMakeRaw(vshControl *ctl, bool report_errors);
|
||||||
|
|
||||||
/* allocation wrappers */
|
/* allocation wrappers */
|
||||||
void *_vshMalloc(vshControl *ctl, size_t sz, const char *filename, int line);
|
void *_vshMalloc(vshControl *ctl, size_t sz, const char *filename, int line);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user