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

Paolo Bonzini pbonzini at redhat.com
Thu Jul 2 11:00:34 UTC 2009


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 at 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 at 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




More information about the libvir-list mailing list