[libvirt] [PATCH] virsh: Allow other escape characters for console
Eric Blake
eblake at redhat.com
Tue Nov 22 17:03:42 UTC 2011
On 11/22/2011 09:18 AM, Michal Privoznik wrote:
> Currently virsh supports only ^] as escape character for console.
> However, some users might want to use something else. This patch
> creates such ability by specifying '-e' switch on virsh command
> line.
> ---
> Okay, this patch is meant as RFC mainly but if it got enough ACKs
> I will not hesitate to push it. My biggest concern is the way
> of telling virsh customized sequence. I am not big fan of new switch,
> however we lack virsh.conf in $conf_dir. Maybe it is the right time
> for creating it.
> Another approach is to pass the sequence as parameter directly to
> 'console' command.
I'm leaning 60-40 towards 'virsh -e', since both 'virsh console' and
'virsh start --console' would benefit from shared code, rather than
having to make both of those functions parse in an alternate escape
character.
I agree that a virsh.conf would make it nice to set preferences without
having to always spell it out on the command line, in which case having
virsh.conf serve as an alternate to 'virsh -e ... console' makes more
sense than having it serve as an alternate to 'virsh console -e ...'
(that is, it seems like having virsh.conf override defaults for global
settings makes more sense than having it override defaults of
per-command settings), so that would sway my opinion to 70-30 in favor
of a global -e.
> -
> -/* ie Ctrl-] as per telnet */
> -# define CTRL_CLOSE_BRACKET '\35'
> +/*
> + * Convert given character to control character.
> + * Basically, we take lower 5 bits unless given
> + * character is DEL (represented by '?'). Then
> + * we return 127
> + */
> +# define CONTROL(c) ((c) == '?' ? ((c) | 0x40) : ((c) & 0x1f))
I've usually seen this written:
CONTROL(c) ((c) ^ 0x40)
This is ASCII-specific, but do we care about EBCDIC?
>
> -int vshRunConsole(virDomainPtr dom, const char *dev_name)
> +static char
> +vshGetEscapeChar(const char *s)
> +{
> + if (*s == '^')
> + return CONTROL(s[1]);
> +
> + return *s;
> +}
Should we sanity check that the string s is exactly 1 or 2 bytes, that
it is not a 1-byte ^, and that if it is 2 bytes, it starts with ^?
>
> +/* Default escape char Ctrl-] as per telnet */
> +#define CTRL_CLOSE_BRACKET "^]"
> +
> /**
> * The log configuration
> */
> @@ -249,6 +252,7 @@ typedef struct __vshControl {
> virDomainGetState is not supported */
> bool useSnapshotOld; /* cannot use virDomainSnapshotGetParent or
> virDomainSnapshotNumChildren */
> + const char *escapeChar; /* Escape character for domain console */
> } __vshControl;
>
> typedef struct vshCmdGrp {
> @@ -796,8 +800,8 @@ cmdRunConsole(vshControl *ctl, virDomainPtr dom, const char *name)
> }
>
> vshPrintExtra(ctl, _("Connected to domain %s\n"), virDomainGetName(dom));
> - vshPrintExtra(ctl, "%s", _("Escape character is ^]\n"));
> - if (vshRunConsole(dom, name) == 0)
> + vshPrintExtra(ctl, _("Escape character is %s\n"), ctl->escapeChar);
This won't work. You want to undo the CONTROL() conversion, and output
a literal ^ followed by the counterpart character, as in:
vshPrintExtra(ctl, _("Escape character is ^%c\n"), CONTROL(ctl->escapeChar))
assuming that the control character is non-printable, and the
counterpart is printable. Maybe you need a c_isprint() call in there?
> @@ -16848,7 +16853,8 @@ vshUsage(void)
> " -t | --timing print timing information\n"
> " -l | --log <file> output logging to file\n"
> " -v | --version[=short] program version\n"
> - " -V | --version=long version and full options\n\n"
> + " -V | --version=long version and full options\n"
> + " -e | --escape <char> set escape sequence for console\n\n"
Well, we aren't very consistent in that formatting. I'd almost prefer
we change to a single format:
-l | --log=FILE log to FILE
-v short version
-V long version
--version[=TYPE] version, TYPE is short or long (default short)
-e | --escape=CHAR set console escape sequence to CHAR
--
Eric Blake eblake at redhat.com +1-919-301-3266
Libvirt virtualization library http://libvirt.org
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 620 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20111122/3dcecb00/attachment-0001.sig>
More information about the libvir-list
mailing list