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

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? 2009-07-02 Paolo Bonzini <pbonzini@redhat.com> * bootstrap: Add getcwd module. * 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. Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> --- bootstrap | 1 + docs/virsh.pod | 12 ++++++++ src/virsh.c | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ virsh.1 | 12 ++++++++- 4 files changed, 101 insertions(+), 1 deletions(-) diff --git a/bootstrap b/bootstrap index baf52e7..b14d8cc 100755 --- a/bootstrap +++ b/bootstrap @@ -69,6 +69,7 @@ c-ctype close connect getaddrinfo +getcwd gethostname getpass gettext 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

On Thu, Jul 02, 2009 at 01:00:34PM +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?
Fine by me but I would wait after 0.6.5, so next week to push this. Note that path get absolutized when entering libvirt itself, and if you're using a remote connection the path is absolutized locally, and transmitted as absolute to the remote end. Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

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(-) 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

On Fri, Jul 10, 2009 at 06:22:41PM +0200, Paolo Bonzini wrote:
+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");
It is perhaps more reliable to use virGetUserDirectory() here, since that gets the home dir out of /etc/passwd using getpwuid, not relying on potentially missing environment variables.
+ 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; +} + +/*
Daniel -- |: 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 :|

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. --- Here it is. docs/virsh.pod | 12 ++++++++ src/virsh.c | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ virsh.1 | 12 ++++++++- 3 files changed, 102 insertions(+), 1 deletions(-) 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..94f2b51 100644 --- a/src/virsh.c +++ b/src/virsh.c @@ -6047,6 +6047,83 @@ 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) { + uid_t uid = geteuid(); + dir = virGetUserDirectory(NULL, uid); + } + 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 +6286,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 +6355,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

On Fri, Jul 10, 2009 at 09:25:37PM +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".
Okidoc, applied :-) thanks ! Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@veillard.com | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/

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@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 :|
participants (3)
-
Daniel P. Berrange
-
Daniel Veillard
-
Paolo Bonzini