[libvirt] [PATCH v2] add cd and pwd commands to virsh

Daniel P. Berrange berrange at redhat.com
Mon Jul 13 10:00:07 UTC 2009


On Fri, Jul 10, 2009 at 06:22:41PM +0200, Paolo Bonzini wrote:
> This patch adds cd and pwd commands to virsh.  These can be useful
> together with commands that refer to files in the local file systems,
> especially save and restore.
> 
> I explicitly decided not to provide any other command, e.g. mkdir,
> to avoid going down a slippery slope (now you want mkdir, tomorrow
> ls and rm and so on...).  If anything, it would be possible to add
> a generic shell command---but cd cannot be implemented that way,
> so pwd shall remain the sole "exception".
> 
> I did not implement "cd -".
> 
> Ok?
> 
> * docs/virsh.pod: Document cd and pwd commands.
> * src/virsh.c (info_cd, opts_cd, cmdCd, info_pwd, cmdPwd): New.
> (commands): Add cd and pwd commands.
> * virsh.1: Regenerate.
> ---
> 	Compared to v1, I didn't add the getcwd module from gnulib
> 	because it is unnecessary on modern OSes and brings in too
> 	many dependencies, some of them GPLed.  This was somehow
> 	masked before Jim's recent reorganization of gnulib.
> 
>  docs/virsh.pod |   12 ++++++++
>  src/virsh.c    |   77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  virsh.1        |   12 ++++++++-
>  3 files changed, 100 insertions(+), 1 deletions(-)

ACK

Daniel

> 
> diff --git a/docs/virsh.pod b/docs/virsh.pod
> index 6434d78..9530ba6 100644
> --- a/docs/virsh.pod
> +++ b/docs/virsh.pod
> @@ -82,6 +82,18 @@ Running hypervisor: Xen 3.0.0
>  
>  =back
>  
> +=item B<cd> I<directory> optional
> +
> +Will change current directory to I<directory>.  The default directory
> +for the B<cd> command is the home directory or, if there is no I<HOME>
> +variable in the environment, the root directory.
> +
> +This command is only available in interactive mode.
> +
> +=item B<pwd>
> +
> +Will print the current directory.
> +
>  =item B<connect> I<URI> optional I<--readonly>
>  
>  (Re)-Connect to the hypervisor. This is a build-in command after shell
> diff --git a/src/virsh.c b/src/virsh.c
> index 5623499..856e5a0 100644
> --- a/src/virsh.c
> +++ b/src/virsh.c
> @@ -6047,6 +6047,81 @@ editReadBackFile (vshControl *ctl, const char *filename)
>  }
>  
>  /*
> + * "cd" command
> + */
> +static const vshCmdInfo info_cd[] = {
> +    {"help", gettext_noop("change the current directory")},
> +    {"desc", gettext_noop("Change the current directory.")},
> +    {NULL, NULL}
> +};
> +
> +static const vshCmdOptDef opts_cd[] = {
> +    {"dir", VSH_OT_DATA, 0, gettext_noop("directory to switch to (default: home or else root)")},
> +    {NULL, 0, 0, NULL}
> +};
> +
> +static int
> +cmdCd(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
> +{
> +    const char *dir;
> +    int found;
> +
> +    if (!ctl->imode) {
> +        vshError(ctl, FALSE, _("cd: command valid only in interactive mode"));
> +        return -1;
> +    }
> +
> +    dir = vshCommandOptString(cmd, "dir", &found);
> +    if (!found)
> +        dir = getenv ("HOME");
> +    if (!dir)
> +        dir = "/";
> +
> +    if (chdir (dir) == -1) {
> +        vshError(ctl, FALSE, _("cd: %s: %s"), strerror (errno), dir);
> +        return -1;
> +    }
> +
> +    return 0;
> +}
> +
> +/*
> + * "pwd" command
> + */
> +static const vshCmdInfo info_pwd[] = {
> +    {"help", gettext_noop("print the current directory")},
> +    {"desc", gettext_noop("Print the current directory.")},
> +    {NULL, NULL}
> +};
> +
> +static int
> +cmdPwd(vshControl *ctl, const vshCmd *cmd ATTRIBUTE_UNUSED)
> +{
> +    char *cwd;
> +    size_t path_max;
> +    int err = TRUE;
> +
> +    path_max = (size_t) PATH_MAX + 2;
> +    cwd = vshMalloc (ctl, path_max);
> +    while (cwd) {
> +        err = getcwd (cwd, path_max) == NULL;
> +        if (!err || errno != ERANGE)
> +            break;
> +
> +        path_max *= 2;
> +        cwd = vshRealloc (ctl, cwd, path_max);
> +    }
> +
> +    if (err)
> +        vshError(ctl, FALSE, _("pwd: cannot get current directory: %s"), strerror (errno));
> +    else
> +        vshPrint (ctl, _("%s\n"), cwd);
> +
> +    free (cwd);
> +    return !err;
> +}
> +
> +/*
>   * "edit" command
>   */
>  static const vshCmdInfo info_edit[] = {
> @@ -6209,6 +6284,7 @@ static const vshCmdDef commands[] = {
>      {"attach-interface", cmdAttachInterface, opts_attach_interface, info_attach_interface},
>      {"autostart", cmdAutostart, opts_autostart, info_autostart},
>      {"capabilities", cmdCapabilities, NULL, info_capabilities},
> +    {"cd", cmdCd, opts_cd, info_cd},
>      {"connect", cmdConnect, opts_connect, info_connect},
>      {"console", cmdConsole, opts_console, info_console},
>      {"create", cmdCreate, opts_create, info_create},
> @@ -6277,6 +6353,7 @@ static const vshCmdDef commands[] = {
>      {"pool-undefine", cmdPoolUndefine, opts_pool_undefine, info_pool_undefine},
>      {"pool-uuid", cmdPoolUuid, opts_pool_uuid, info_pool_uuid},
>  
> +    {"pwd", cmdPwd, NULL, info_pwd},
>      {"quit", cmdQuit, NULL, info_quit},
>      {"reboot", cmdReboot, opts_reboot, info_reboot},
>      {"restore", cmdRestore, opts_restore, info_restore},
> diff --git a/virsh.1 b/virsh.1
> index 45ea614..ca03cc1 100644
> --- a/virsh.1
> +++ b/virsh.1
> @@ -132,7 +132,7 @@
>  .\" ========================================================================
>  .\"
>  .IX Title "VIRSH 1"
> -.TH VIRSH 1 "2009-04-16" "libvirt-0.6.2" "Virtualization Support"
> +.TH VIRSH 1 "2009-07-02" "libvirt-0.6.4" "Virtualization Support"
>  .\" For nroff, turn off justification.  Always turn off hyphenation; it makes
>  .\" way too many mistakes in technical documents.
>  .if n .ad l
> @@ -214,6 +214,16 @@ Running hypervisor: Xen 3.0.0
>  .RE
>  .RS 4
>  .RE
> +.IP "\fBcd\fR \fIdirectory\fR optional" 4
> +.IX Item "cd directory optional"
> +Will change current directory to \fIdirectory\fR.  The default directory
> +for the \fBcd\fR command is the home directory or, if there is no \fI\s-1HOME\s0\fR
> +variable in the environment, the root directory.
> +.Sp
> +This command is only available in interactive mode.
> +.IP "\fBpwd\fR" 4
> +.IX Item "pwd"
> +Will print the current directory.
>  .IP "\fBconnect\fR \fI\s-1URI\s0\fR optional \fI\-\-readonly\fR" 4
>  .IX Item "connect URI optional --readonly"
>  (Re)\-Connect to the hypervisor. This is a build-in command after shell
> -- 
> 1.6.2.5
> 
> --
> Libvir-list mailing list
> Libvir-list at redhat.com
> https://www.redhat.com/mailman/listinfo/libvir-list

-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list