6c66f0ac3a26dd4619b555080308737ba3b241ef
[libguestfs.git] / fish / cmds.c
1 /* libguestfs generated file
2  * WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.
3  * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
4  *
5  * Copyright (C) 2009 Red Hat Inc.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <inttypes.h>
26
27 #include <guestfs.h>
28 #include "fish.h"
29
30 void list_commands (void)
31 {
32   printf ("    %-16s     %s\n", "Command", "Description");
33   list_builtin_commands ();
34   printf ("%-20s %s\n", "add-cdrom", "add a CD-ROM disk image to examine");
35   printf ("%-20s %s\n", "add-drive", "add an image to examine or modify");
36   printf ("%-20s %s\n", "aug-close", "close the current Augeas handle");
37   printf ("%-20s %s\n", "aug-defnode", "define an Augeas node");
38   printf ("%-20s %s\n", "aug-defvar", "define an Augeas variable");
39   printf ("%-20s %s\n", "aug-get", "look up the value of an Augeas path");
40   printf ("%-20s %s\n", "aug-init", "create a new Augeas handle");
41   printf ("%-20s %s\n", "aug-insert", "insert a sibling Augeas node");
42   printf ("%-20s %s\n", "aug-load", "load files into the tree");
43   printf ("%-20s %s\n", "aug-ls", "list Augeas nodes under a path");
44   printf ("%-20s %s\n", "aug-match", "return Augeas nodes which match path");
45   printf ("%-20s %s\n", "aug-mv", "move Augeas node");
46   printf ("%-20s %s\n", "aug-rm", "remove an Augeas path");
47   printf ("%-20s %s\n", "aug-save", "write all pending Augeas changes to disk");
48   printf ("%-20s %s\n", "aug-set", "set Augeas path to value");
49   printf ("%-20s %s\n", "blockdev-flushbufs", "flush device buffers");
50   printf ("%-20s %s\n", "blockdev-getbsz", "get blocksize of block device");
51   printf ("%-20s %s\n", "blockdev-getro", "is block device set to read-only");
52   printf ("%-20s %s\n", "blockdev-getsize64", "get total size of device in bytes");
53   printf ("%-20s %s\n", "blockdev-getss", "get sectorsize of block device");
54   printf ("%-20s %s\n", "blockdev-getsz", "get total size of device in 512-byte sectors");
55   printf ("%-20s %s\n", "blockdev-rereadpt", "reread partition table");
56   printf ("%-20s %s\n", "blockdev-setbsz", "set blocksize of block device");
57   printf ("%-20s %s\n", "blockdev-setro", "set block device to read-only");
58   printf ("%-20s %s\n", "blockdev-setrw", "set block device to read-write");
59   printf ("%-20s %s\n", "cat", "list the contents of a file");
60   printf ("%-20s %s\n", "checksum", "compute MD5, SHAx or CRC checksum of file");
61   printf ("%-20s %s\n", "chmod", "change file mode");
62   printf ("%-20s %s\n", "chown", "change file owner and group");
63   printf ("%-20s %s\n", "command", "run a command from the guest filesystem");
64   printf ("%-20s %s\n", "command-lines", "run a command, returning lines");
65   printf ("%-20s %s\n", "config", "add qemu parameters");
66   printf ("%-20s %s\n", "download", "download a file to the local machine");
67   printf ("%-20s %s\n", "exists", "test if file or directory exists");
68   printf ("%-20s %s\n", "file", "determine file type");
69   printf ("%-20s %s\n", "get-autosync", "get autosync mode");
70   printf ("%-20s %s\n", "get-path", "get the search path");
71   printf ("%-20s %s\n", "get-qemu", "get the qemu binary");
72   printf ("%-20s %s\n", "get-state", "get the current state");
73   printf ("%-20s %s\n", "get-verbose", "get verbose mode");
74   printf ("%-20s %s\n", "is-busy", "is busy processing a command");
75   printf ("%-20s %s\n", "is-config", "is in configuration state");
76   printf ("%-20s %s\n", "is-dir", "test if file exists");
77   printf ("%-20s %s\n", "is-file", "test if file exists");
78   printf ("%-20s %s\n", "is-launching", "is launching subprocess");
79   printf ("%-20s %s\n", "is-ready", "is ready to accept commands");
80   printf ("%-20s %s\n", "kill-subprocess", "kill the qemu subprocess");
81   printf ("%-20s %s\n", "launch", "launch the qemu subprocess");
82   printf ("%-20s %s\n", "list-devices", "list the block devices");
83   printf ("%-20s %s\n", "list-partitions", "list the partitions");
84   printf ("%-20s %s\n", "ll", "list the files in a directory (long format)");
85   printf ("%-20s %s\n", "ls", "list the files in a directory");
86   printf ("%-20s %s\n", "lstat", "get file information for a symbolic link");
87   printf ("%-20s %s\n", "lvcreate", "create an LVM volume group");
88   printf ("%-20s %s\n", "lvm-remove-all", "remove all LVM LVs, VGs and PVs");
89   printf ("%-20s %s\n", "lvs", "list the LVM logical volumes (LVs)");
90   printf ("%-20s %s\n", "lvs-full", "list the LVM logical volumes (LVs)");
91   printf ("%-20s %s\n", "mkdir", "create a directory");
92   printf ("%-20s %s\n", "mkdir-p", "create a directory and parents");
93   printf ("%-20s %s\n", "mkfs", "make a filesystem");
94   printf ("%-20s %s\n", "mount", "mount a guest disk at a position in the filesystem");
95   printf ("%-20s %s\n", "mounts", "show mounted filesystems");
96   printf ("%-20s %s\n", "pvcreate", "create an LVM physical volume");
97   printf ("%-20s %s\n", "pvs", "list the LVM physical volumes (PVs)");
98   printf ("%-20s %s\n", "pvs-full", "list the LVM physical volumes (PVs)");
99   printf ("%-20s %s\n", "read-lines", "read file as lines");
100   printf ("%-20s %s\n", "rm", "remove a file");
101   printf ("%-20s %s\n", "rm-rf", "remove a file or directory recursively");
102   printf ("%-20s %s\n", "rmdir", "remove a directory");
103   printf ("%-20s %s\n", "set-autosync", "set autosync mode");
104   printf ("%-20s %s\n", "set-path", "set the search path");
105   printf ("%-20s %s\n", "set-qemu", "set the qemu binary");
106   printf ("%-20s %s\n", "set-verbose", "set verbose mode");
107   printf ("%-20s %s\n", "sfdisk", "create partitions on a block device");
108   printf ("%-20s %s\n", "stat", "get file information");
109   printf ("%-20s %s\n", "statvfs", "get file system statistics");
110   printf ("%-20s %s\n", "sync", "sync disks, writes are flushed through to the disk image");
111   printf ("%-20s %s\n", "tar-in", "unpack tarfile to directory");
112   printf ("%-20s %s\n", "tar-out", "pack directory into tarfile");
113   printf ("%-20s %s\n", "tgz-in", "unpack compressed tarball to directory");
114   printf ("%-20s %s\n", "tgz-out", "pack directory into compressed tarball");
115   printf ("%-20s %s\n", "touch", "update file timestamps or create a new file");
116   printf ("%-20s %s\n", "tune2fs-l", "get ext2/ext3 superblock details");
117   printf ("%-20s %s\n", "umount", "unmount a filesystem");
118   printf ("%-20s %s\n", "umount-all", "unmount all filesystems");
119   printf ("%-20s %s\n", "upload", "upload a file from the local machine");
120   printf ("%-20s %s\n", "vgcreate", "create an LVM volume group");
121   printf ("%-20s %s\n", "vgs", "list the LVM volume groups (VGs)");
122   printf ("%-20s %s\n", "vgs-full", "list the LVM volume groups (VGs)");
123   printf ("%-20s %s\n", "write-file", "create a file");
124   printf ("    Use -h <cmd> / help <cmd> to show detailed help for a command.\n");
125 }
126
127 void display_command (const char *cmd)
128 {
129   if (strcasecmp (cmd, "launch") == 0 || strcasecmp (cmd, "run") == 0)
130     pod2text ("launch - launch the qemu subprocess", " launch\n\nInternally libguestfs is implemented by running a virtual machine\nusing L<qemu(1)>.\n\nYou should call this after configuring the handle\n(eg. adding drives) but before performing any actions.\n\nYou can use 'run' as an alias for this command.");
131   else
132   if (strcasecmp (cmd, "kill_subprocess") == 0 || strcasecmp (cmd, "kill-subprocess") == 0)
133     pod2text ("kill-subprocess - kill the qemu subprocess", " kill-subprocess\n\nThis kills the qemu subprocess.  You should never need to call this.");
134   else
135   if (strcasecmp (cmd, "add_drive") == 0 || strcasecmp (cmd, "add-drive") == 0 || strcasecmp (cmd, "add") == 0)
136     pod2text ("add-drive - add an image to examine or modify", " add-drive <filename>\n\nThis function adds a virtual machine disk image C<filename> to the\nguest.  The first time you call this function, the disk appears as IDE\ndisk 0 (C</dev/sda>) in the guest, the second time as C</dev/sdb>, and\nso on.\n\nYou don't necessarily need to be root when using libguestfs.  However\nyou obviously do need sufficient permissions to access the filename\nfor whatever operations you want to perform (ie. read access if you\njust want to read the image or write access if you want to modify the\nimage).\n\nThis is equivalent to the qemu parameter C<-drive file=filename>.\n\nYou can use 'add' as an alias for this command.");
137   else
138   if (strcasecmp (cmd, "add_cdrom") == 0 || strcasecmp (cmd, "add-cdrom") == 0 || strcasecmp (cmd, "cdrom") == 0)
139     pod2text ("add-cdrom - add a CD-ROM disk image to examine", " add-cdrom <filename>\n\nThis function adds a virtual CD-ROM disk image to the guest.\n\nThis is equivalent to the qemu parameter C<-cdrom filename>.\n\nYou can use 'cdrom' as an alias for this command.");
140   else
141   if (strcasecmp (cmd, "config") == 0)
142     pod2text ("config - add qemu parameters", " config <qemuparam> <qemuvalue>\n\nThis can be used to add arbitrary qemu command line parameters\nof the form C<-param value>.  Actually it's not quite arbitrary - we\nprevent you from setting some parameters which would interfere with\nparameters that we use.\n\nThe first character of C<param> string must be a C<-> (dash).\n\nC<value> can be NULL.");
143   else
144   if (strcasecmp (cmd, "set_qemu") == 0 || strcasecmp (cmd, "set-qemu") == 0 || strcasecmp (cmd, "qemu") == 0)
145     pod2text ("set-qemu - set the qemu binary", " set-qemu <qemu>\n\nSet the qemu binary that we will use.\n\nThe default is chosen when the library was compiled by the\nconfigure script.\n\nYou can also override this by setting the C<LIBGUESTFS_QEMU>\nenvironment variable.\n\nThe string C<qemu> is stashed in the libguestfs handle, so the caller\nmust make sure it remains valid for the lifetime of the handle.\n\nSetting C<qemu> to C<NULL> restores the default qemu binary.\n\nYou can use 'qemu' as an alias for this command.");
146   else
147   if (strcasecmp (cmd, "get_qemu") == 0 || strcasecmp (cmd, "get-qemu") == 0)
148     pod2text ("get-qemu - get the qemu binary", " get-qemu\n\nReturn the current qemu binary.\n\nThis is always non-NULL.  If it wasn't set already, then this will\nreturn the default qemu binary name.");
149   else
150   if (strcasecmp (cmd, "set_path") == 0 || strcasecmp (cmd, "set-path") == 0 || strcasecmp (cmd, "path") == 0)
151     pod2text ("set-path - set the search path", " set-path <path>\n\nSet the path that libguestfs searches for kernel and initrd.img.\n\nThe default is C<$libdir/guestfs> unless overridden by setting\nC<LIBGUESTFS_PATH> environment variable.\n\nThe string C<path> is stashed in the libguestfs handle, so the caller\nmust make sure it remains valid for the lifetime of the handle.\n\nSetting C<path> to C<NULL> restores the default path.\n\nYou can use 'path' as an alias for this command.");
152   else
153   if (strcasecmp (cmd, "get_path") == 0 || strcasecmp (cmd, "get-path") == 0)
154     pod2text ("get-path - get the search path", " get-path\n\nReturn the current search path.\n\nThis is always non-NULL.  If it wasn't set already, then this will\nreturn the default path.");
155   else
156   if (strcasecmp (cmd, "set_autosync") == 0 || strcasecmp (cmd, "set-autosync") == 0 || strcasecmp (cmd, "autosync") == 0)
157     pod2text ("set-autosync - set autosync mode", " set-autosync <autosync>\n\nIf C<autosync> is true, this enables autosync.  Libguestfs will make a\nbest effort attempt to run C<sync> when the handle is closed\n(also if the program exits without closing handles).\n\nYou can use 'autosync' as an alias for this command.");
158   else
159   if (strcasecmp (cmd, "get_autosync") == 0 || strcasecmp (cmd, "get-autosync") == 0)
160     pod2text ("get-autosync - get autosync mode", " get-autosync\n\nGet the autosync flag.");
161   else
162   if (strcasecmp (cmd, "set_verbose") == 0 || strcasecmp (cmd, "set-verbose") == 0 || strcasecmp (cmd, "verbose") == 0)
163     pod2text ("set-verbose - set verbose mode", " set-verbose <verbose>\n\nIf C<verbose> is true, this turns on verbose messages (to C<stderr>).\n\nVerbose messages are disabled unless the environment variable\nC<LIBGUESTFS_DEBUG> is defined and set to C<1>.\n\nYou can use 'verbose' as an alias for this command.");
164   else
165   if (strcasecmp (cmd, "get_verbose") == 0 || strcasecmp (cmd, "get-verbose") == 0)
166     pod2text ("get-verbose - get verbose mode", " get-verbose\n\nThis returns the verbose messages flag.");
167   else
168   if (strcasecmp (cmd, "is_ready") == 0 || strcasecmp (cmd, "is-ready") == 0)
169     pod2text ("is-ready - is ready to accept commands", " is-ready\n\nThis returns true iff this handle is ready to accept commands\n(in the C<READY> state).\n\nFor more information on states, see L<guestfs(3)>.");
170   else
171   if (strcasecmp (cmd, "is_config") == 0 || strcasecmp (cmd, "is-config") == 0)
172     pod2text ("is-config - is in configuration state", " is-config\n\nThis returns true iff this handle is being configured\n(in the C<CONFIG> state).\n\nFor more information on states, see L<guestfs(3)>.");
173   else
174   if (strcasecmp (cmd, "is_launching") == 0 || strcasecmp (cmd, "is-launching") == 0)
175     pod2text ("is-launching - is launching subprocess", " is-launching\n\nThis returns true iff this handle is launching the subprocess\n(in the C<LAUNCHING> state).\n\nFor more information on states, see L<guestfs(3)>.");
176   else
177   if (strcasecmp (cmd, "is_busy") == 0 || strcasecmp (cmd, "is-busy") == 0)
178     pod2text ("is-busy - is busy processing a command", " is-busy\n\nThis returns true iff this handle is busy processing a command\n(in the C<BUSY> state).\n\nFor more information on states, see L<guestfs(3)>.");
179   else
180   if (strcasecmp (cmd, "get_state") == 0 || strcasecmp (cmd, "get-state") == 0)
181     pod2text ("get-state - get the current state", " get-state\n\nThis returns the current state as an opaque integer.  This is\nonly useful for printing debug and internal error messages.\n\nFor more information on states, see L<guestfs(3)>.");
182   else
183   if (strcasecmp (cmd, "mount") == 0)
184     pod2text ("mount - mount a guest disk at a position in the filesystem", " mount <device> <mountpoint>\n\nMount a guest disk at a position in the filesystem.  Block devices\nare named C</dev/sda>, C</dev/sdb> and so on, as they were added to\nthe guest.  If those block devices contain partitions, they will have\nthe usual names (eg. C</dev/sda1>).  Also LVM C</dev/VG/LV>-style\nnames can be used.\n\nThe rules are the same as for L<mount(2)>:  A filesystem must\nfirst be mounted on C</> before others can be mounted.  Other\nfilesystems can only be mounted on directories which already\nexist.\n\nThe mounted filesystem is writable, if we have sufficient permissions\non the underlying device.\n\nThe filesystem options C<sync> and C<noatime> are set with this\ncall, in order to improve reliability.");
185   else
186   if (strcasecmp (cmd, "sync") == 0)
187     pod2text ("sync - sync disks, writes are flushed through to the disk image", " sync\n\nThis syncs the disk, so that any writes are flushed through to the\nunderlying disk image.\n\nYou should always call this if you have modified a disk image, before\nclosing the handle.");
188   else
189   if (strcasecmp (cmd, "touch") == 0)
190     pod2text ("touch - update file timestamps or create a new file", " touch <path>\n\nTouch acts like the L<touch(1)> command.  It can be used to\nupdate the timestamps on a file, or, if the file does not exist,\nto create a new zero-length file.");
191   else
192   if (strcasecmp (cmd, "cat") == 0)
193     pod2text ("cat - list the contents of a file", " cat <path>\n\nReturn the contents of the file named C<path>.\n\nNote that this function cannot correctly handle binary files\n(specifically, files containing C<\\0> character which is treated\nas end of string).  For those you need to use the C<download>\nfunction which has a more complex interface.\n\nBecause of the message protocol, there is a transfer limit \nof somewhere between 2MB and 4MB.  To transfer large files you should use\nFTP.");
194   else
195   if (strcasecmp (cmd, "ll") == 0)
196     pod2text ("ll - list the files in a directory (long format)", " ll <directory>\n\nList the files in C<directory> (relative to the root directory,\nthere is no cwd) in the format of 'ls -la'.\n\nThis command is mostly useful for interactive sessions.  It\nis I<not> intended that you try to parse the output string.");
197   else
198   if (strcasecmp (cmd, "ls") == 0)
199     pod2text ("ls - list the files in a directory", " ls <directory>\n\nList the files in C<directory> (relative to the root directory,\nthere is no cwd).  The '.' and '..' entries are not returned, but\nhidden files are shown.\n\nThis command is mostly useful for interactive sessions.  Programs\nshould probably use C<readdir> instead.");
200   else
201   if (strcasecmp (cmd, "list_devices") == 0 || strcasecmp (cmd, "list-devices") == 0)
202     pod2text ("list-devices - list the block devices", " list-devices\n\nList all the block devices.\n\nThe full block device names are returned, eg. C</dev/sda>");
203   else
204   if (strcasecmp (cmd, "list_partitions") == 0 || strcasecmp (cmd, "list-partitions") == 0)
205     pod2text ("list-partitions - list the partitions", " list-partitions\n\nList all the partitions detected on all block devices.\n\nThe full partition device names are returned, eg. C</dev/sda1>\n\nThis does not return logical volumes.  For that you will need to\ncall C<lvs>.");
206   else
207   if (strcasecmp (cmd, "pvs") == 0)
208     pod2text ("pvs - list the LVM physical volumes (PVs)", " pvs\n\nList all the physical volumes detected.  This is the equivalent\nof the L<pvs(8)> command.\n\nThis returns a list of just the device names that contain\nPVs (eg. C</dev/sda2>).\n\nSee also C<pvs_full>.");
209   else
210   if (strcasecmp (cmd, "vgs") == 0)
211     pod2text ("vgs - list the LVM volume groups (VGs)", " vgs\n\nList all the volumes groups detected.  This is the equivalent\nof the L<vgs(8)> command.\n\nThis returns a list of just the volume group names that were\ndetected (eg. C<VolGroup00>).\n\nSee also C<vgs_full>.");
212   else
213   if (strcasecmp (cmd, "lvs") == 0)
214     pod2text ("lvs - list the LVM logical volumes (LVs)", " lvs\n\nList all the logical volumes detected.  This is the equivalent\nof the L<lvs(8)> command.\n\nThis returns a list of the logical volume device names\n(eg. C</dev/VolGroup00/LogVol00>).\n\nSee also C<lvs_full>.");
215   else
216   if (strcasecmp (cmd, "pvs_full") == 0 || strcasecmp (cmd, "pvs-full") == 0)
217     pod2text ("pvs-full - list the LVM physical volumes (PVs)", " pvs-full\n\nList all the physical volumes detected.  This is the equivalent\nof the L<pvs(8)> command.  The \"full\" version includes all fields.");
218   else
219   if (strcasecmp (cmd, "vgs_full") == 0 || strcasecmp (cmd, "vgs-full") == 0)
220     pod2text ("vgs-full - list the LVM volume groups (VGs)", " vgs-full\n\nList all the volumes groups detected.  This is the equivalent\nof the L<vgs(8)> command.  The \"full\" version includes all fields.");
221   else
222   if (strcasecmp (cmd, "lvs_full") == 0 || strcasecmp (cmd, "lvs-full") == 0)
223     pod2text ("lvs-full - list the LVM logical volumes (LVs)", " lvs-full\n\nList all the logical volumes detected.  This is the equivalent\nof the L<lvs(8)> command.  The \"full\" version includes all fields.");
224   else
225   if (strcasecmp (cmd, "read_lines") == 0 || strcasecmp (cmd, "read-lines") == 0)
226     pod2text ("read-lines - read file as lines", " read-lines <path>\n\nReturn the contents of the file named C<path>.\n\nThe file contents are returned as a list of lines.  Trailing\nC<LF> and C<CRLF> character sequences are I<not> returned.\n\nNote that this function cannot correctly handle binary files\n(specifically, files containing C<\\0> character which is treated\nas end of line).  For those you need to use the C<read_file>\nfunction which has a more complex interface.");
227   else
228   if (strcasecmp (cmd, "aug_init") == 0 || strcasecmp (cmd, "aug-init") == 0)
229     pod2text ("aug-init - create a new Augeas handle", " aug-init <root> <flags>\n\nCreate a new Augeas handle for editing configuration files.\nIf there was any previous Augeas handle associated with this\nguestfs session, then it is closed.\n\nYou must call this before using any other C<aug_*>\ncommands.\n\nC<root> is the filesystem root.  C<root> must not be NULL,\nuse C</> instead.\n\nThe flags are the same as the flags defined in\nE<lt>augeas.hE<gt>, the logical I<or> of the following\nintegers:\n\n=over 4\n\n=item C<AUG_SAVE_BACKUP> = 1\n\nKeep the original file with a C<.augsave> extension.\n\n=item C<AUG_SAVE_NEWFILE> = 2\n\nSave changes into a file with extension C<.augnew>, and\ndo not overwrite original.  Overrides C<AUG_SAVE_BACKUP>.\n\n=item C<AUG_TYPE_CHECK> = 4\n\nTypecheck lenses (can be expensive).\n\n=item C<AUG_NO_STDINC> = 8\n\nDo not use standard load path for modules.\n\n=item C<AUG_SAVE_NOOP> = 16\n\nMake save a no-op, just record what would have been changed.\n\n=item C<AUG_NO_LOAD> = 32\n\nDo not load the tree in C<aug_init>.\n\n=back\n\nTo close the handle, you can call C<aug_close>.\n\nTo find out more about Augeas, see L<http://augeas.net/>.");
230   else
231   if (strcasecmp (cmd, "aug_close") == 0 || strcasecmp (cmd, "aug-close") == 0)
232     pod2text ("aug-close - close the current Augeas handle", " aug-close\n\nClose the current Augeas handle and free up any resources\nused by it.  After calling this, you have to call\nC<aug_init> again before you can use any other\nAugeas functions.");
233   else
234   if (strcasecmp (cmd, "aug_defvar") == 0 || strcasecmp (cmd, "aug-defvar") == 0)
235     pod2text ("aug-defvar - define an Augeas variable", " aug-defvar <name> <expr>\n\nDefines an Augeas variable C<name> whose value is the result\nof evaluating C<expr>.  If C<expr> is NULL, then C<name> is\nundefined.\n\nOn success this returns the number of nodes in C<expr>, or\nC<0> if C<expr> evaluates to something which is not a nodeset.");
236   else
237   if (strcasecmp (cmd, "aug_defnode") == 0 || strcasecmp (cmd, "aug-defnode") == 0)
238     pod2text ("aug-defnode - define an Augeas node", " aug-defnode <name> <expr> <val>\n\nDefines a variable C<name> whose value is the result of\nevaluating C<expr>.\n\nIf C<expr> evaluates to an empty nodeset, a node is created,\nequivalent to calling C<aug_set> C<expr>, C<value>.\nC<name> will be the nodeset containing that single node.\n\nOn success this returns a pair containing the\nnumber of nodes in the nodeset, and a boolean flag\nif a node was created.");
239   else
240   if (strcasecmp (cmd, "aug_get") == 0 || strcasecmp (cmd, "aug-get") == 0)
241     pod2text ("aug-get - look up the value of an Augeas path", " aug-get <path>\n\nLook up the value associated with C<path>.  If C<path>\nmatches exactly one node, the C<value> is returned.");
242   else
243   if (strcasecmp (cmd, "aug_set") == 0 || strcasecmp (cmd, "aug-set") == 0)
244     pod2text ("aug-set - set Augeas path to value", " aug-set <path> <val>\n\nSet the value associated with C<path> to C<value>.");
245   else
246   if (strcasecmp (cmd, "aug_insert") == 0 || strcasecmp (cmd, "aug-insert") == 0)
247     pod2text ("aug-insert - insert a sibling Augeas node", " aug-insert <path> <label> <before>\n\nCreate a new sibling C<label> for C<path>, inserting it into\nthe tree before or after C<path> (depending on the boolean\nflag C<before>).\n\nC<path> must match exactly one existing node in the tree, and\nC<label> must be a label, ie. not contain C</>, C<*> or end\nwith a bracketed index C<[N]>.");
248   else
249   if (strcasecmp (cmd, "aug_rm") == 0 || strcasecmp (cmd, "aug-rm") == 0)
250     pod2text ("aug-rm - remove an Augeas path", " aug-rm <path>\n\nRemove C<path> and all of its children.\n\nOn success this returns the number of entries which were removed.");
251   else
252   if (strcasecmp (cmd, "aug_mv") == 0 || strcasecmp (cmd, "aug-mv") == 0)
253     pod2text ("aug-mv - move Augeas node", " aug-mv <src> <dest>\n\nMove the node C<src> to C<dest>.  C<src> must match exactly\none node.  C<dest> is overwritten if it exists.");
254   else
255   if (strcasecmp (cmd, "aug_match") == 0 || strcasecmp (cmd, "aug-match") == 0)
256     pod2text ("aug-match - return Augeas nodes which match path", " aug-match <path>\n\nReturns a list of paths which match the path expression C<path>.\nThe returned paths are sufficiently qualified so that they match\nexactly one node in the current tree.");
257   else
258   if (strcasecmp (cmd, "aug_save") == 0 || strcasecmp (cmd, "aug-save") == 0)
259     pod2text ("aug-save - write all pending Augeas changes to disk", " aug-save\n\nThis writes all pending changes to disk.\n\nThe flags which were passed to C<aug_init> affect exactly\nhow files are saved.");
260   else
261   if (strcasecmp (cmd, "aug_load") == 0 || strcasecmp (cmd, "aug-load") == 0)
262     pod2text ("aug-load - load files into the tree", " aug-load\n\nLoad files into the tree.\n\nSee C<aug_load> in the Augeas documentation for the full gory\ndetails.");
263   else
264   if (strcasecmp (cmd, "aug_ls") == 0 || strcasecmp (cmd, "aug-ls") == 0)
265     pod2text ("aug-ls - list Augeas nodes under a path", " aug-ls <path>\n\nThis is just a shortcut for listing C<aug_match>\nC<path/*> and sorting the resulting nodes into alphabetical order.");
266   else
267   if (strcasecmp (cmd, "rm") == 0)
268     pod2text ("rm - remove a file", " rm <path>\n\nRemove the single file C<path>.");
269   else
270   if (strcasecmp (cmd, "rmdir") == 0)
271     pod2text ("rmdir - remove a directory", " rmdir <path>\n\nRemove the single directory C<path>.");
272   else
273   if (strcasecmp (cmd, "rm_rf") == 0 || strcasecmp (cmd, "rm-rf") == 0)
274     pod2text ("rm-rf - remove a file or directory recursively", " rm-rf <path>\n\nRemove the file or directory C<path>, recursively removing the\ncontents if its a directory.  This is like the C<rm -rf> shell\ncommand.");
275   else
276   if (strcasecmp (cmd, "mkdir") == 0)
277     pod2text ("mkdir - create a directory", " mkdir <path>\n\nCreate a directory named C<path>.");
278   else
279   if (strcasecmp (cmd, "mkdir_p") == 0 || strcasecmp (cmd, "mkdir-p") == 0)
280     pod2text ("mkdir-p - create a directory and parents", " mkdir-p <path>\n\nCreate a directory named C<path>, creating any parent directories\nas necessary.  This is like the C<mkdir -p> shell command.");
281   else
282   if (strcasecmp (cmd, "chmod") == 0)
283     pod2text ("chmod - change file mode", " chmod <mode> <path>\n\nChange the mode (permissions) of C<path> to C<mode>.  Only\nnumeric modes are supported.");
284   else
285   if (strcasecmp (cmd, "chown") == 0)
286     pod2text ("chown - change file owner and group", " chown <owner> <group> <path>\n\nChange the file owner to C<owner> and group to C<group>.\n\nOnly numeric uid and gid are supported.  If you want to use\nnames, you will need to locate and parse the password file\nyourself (Augeas support makes this relatively easy).");
287   else
288   if (strcasecmp (cmd, "exists") == 0)
289     pod2text ("exists - test if file or directory exists", " exists <path>\n\nThis returns C<true> if and only if there is a file, directory\n(or anything) with the given C<path> name.\n\nSee also C<is_file>, C<is_dir>, C<stat>.");
290   else
291   if (strcasecmp (cmd, "is_file") == 0 || strcasecmp (cmd, "is-file") == 0)
292     pod2text ("is-file - test if file exists", " is-file <path>\n\nThis returns C<true> if and only if there is a file\nwith the given C<path> name.  Note that it returns false for\nother objects like directories.\n\nSee also C<stat>.");
293   else
294   if (strcasecmp (cmd, "is_dir") == 0 || strcasecmp (cmd, "is-dir") == 0)
295     pod2text ("is-dir - test if file exists", " is-dir <path>\n\nThis returns C<true> if and only if there is a directory\nwith the given C<path> name.  Note that it returns false for\nother objects like files.\n\nSee also C<stat>.");
296   else
297   if (strcasecmp (cmd, "pvcreate") == 0)
298     pod2text ("pvcreate - create an LVM physical volume", " pvcreate <device>\n\nThis creates an LVM physical volume on the named C<device>,\nwhere C<device> should usually be a partition name such\nas C</dev/sda1>.");
299   else
300   if (strcasecmp (cmd, "vgcreate") == 0)
301     pod2text ("vgcreate - create an LVM volume group", " vgcreate <volgroup> <physvols>\n\nThis creates an LVM volume group called C<volgroup>\nfrom the non-empty list of physical volumes C<physvols>.");
302   else
303   if (strcasecmp (cmd, "lvcreate") == 0)
304     pod2text ("lvcreate - create an LVM volume group", " lvcreate <logvol> <volgroup> <mbytes>\n\nThis creates an LVM volume group called C<logvol>\non the volume group C<volgroup>, with C<size> megabytes.");
305   else
306   if (strcasecmp (cmd, "mkfs") == 0)
307     pod2text ("mkfs - make a filesystem", " mkfs <fstype> <device>\n\nThis creates a filesystem on C<device> (usually a partition\nof LVM logical volume).  The filesystem type is C<fstype>, for\nexample C<ext3>.");
308   else
309   if (strcasecmp (cmd, "sfdisk") == 0)
310     pod2text ("sfdisk - create partitions on a block device", " sfdisk <device> <cyls> <heads> <sectors> <lines>\n\nThis is a direct interface to the L<sfdisk(8)> program for creating\npartitions on block devices.\n\nC<device> should be a block device, for example C</dev/sda>.\n\nC<cyls>, C<heads> and C<sectors> are the number of cylinders, heads\nand sectors on the device, which are passed directly to sfdisk as\nthe I<-C>, I<-H> and I<-S> parameters.  If you pass C<0> for any\nof these, then the corresponding parameter is omitted.  Usually for\n'large' disks, you can just pass C<0> for these, but for small\n(floppy-sized) disks, sfdisk (or rather, the kernel) cannot work\nout the right geometry and you will need to tell it.\n\nC<lines> is a list of lines that we feed to C<sfdisk>.  For more\ninformation refer to the L<sfdisk(8)> manpage.\n\nTo create a single partition occupying the whole disk, you would\npass C<lines> as a single element list, when the single element being\nthe string C<,> (comma).\n\nB<This command is dangerous.  Without careful use you\ncan easily destroy all your data>.");
311   else
312   if (strcasecmp (cmd, "write_file") == 0 || strcasecmp (cmd, "write-file") == 0)
313     pod2text ("write-file - create a file", " write-file <path> <content> <size>\n\nThis call creates a file called C<path>.  The contents of the\nfile is the string C<content> (which can contain any 8 bit data),\nwith length C<size>.\n\nAs a special case, if C<size> is C<0>\nthen the length is calculated using C<strlen> (so in this case\nthe content cannot contain embedded ASCII NULs).\n\nBecause of the message protocol, there is a transfer limit \nof somewhere between 2MB and 4MB.  To transfer large files you should use\nFTP.");
314   else
315   if (strcasecmp (cmd, "umount") == 0 || strcasecmp (cmd, "unmount") == 0)
316     pod2text ("umount - unmount a filesystem", " umount <pathordevice>\n\nThis unmounts the given filesystem.  The filesystem may be\nspecified either by its mountpoint (path) or the device which\ncontains the filesystem.\n\nYou can use 'unmount' as an alias for this command.");
317   else
318   if (strcasecmp (cmd, "mounts") == 0)
319     pod2text ("mounts - show mounted filesystems", " mounts\n\nThis returns the list of currently mounted filesystems.  It returns\nthe list of devices (eg. C</dev/sda1>, C</dev/VG/LV>).\n\nSome internal mounts are not shown.");
320   else
321   if (strcasecmp (cmd, "umount_all") == 0 || strcasecmp (cmd, "umount-all") == 0 || strcasecmp (cmd, "unmount-all") == 0)
322     pod2text ("umount-all - unmount all filesystems", " umount-all\n\nThis unmounts all mounted filesystems.\n\nSome internal mounts are not unmounted by this call.\n\nYou can use 'unmount-all' as an alias for this command.");
323   else
324   if (strcasecmp (cmd, "lvm_remove_all") == 0 || strcasecmp (cmd, "lvm-remove-all") == 0)
325     pod2text ("lvm-remove-all - remove all LVM LVs, VGs and PVs", " lvm-remove-all\n\nThis command removes all LVM logical volumes, volume groups\nand physical volumes.\n\nB<This command is dangerous.  Without careful use you\ncan easily destroy all your data>.");
326   else
327   if (strcasecmp (cmd, "file") == 0)
328     pod2text ("file - determine file type", " file <path>\n\nThis call uses the standard L<file(1)> command to determine\nthe type or contents of the file.  This also works on devices,\nfor example to find out whether a partition contains a filesystem.\n\nThe exact command which runs is C<file -bsL path>.  Note in\nparticular that the filename is not prepended to the output\n(the C<-b> option).");
329   else
330   if (strcasecmp (cmd, "command") == 0)
331     pod2text ("command - run a command from the guest filesystem", " command <arguments>\n\nThis call runs a command from the guest filesystem.  The\nfilesystem must be mounted, and must contain a compatible\noperating system (ie. something Linux, with the same\nor compatible processor architecture).\n\nThe single parameter is an argv-style list of arguments.\nThe first element is the name of the program to run.\nSubsequent elements are parameters.  The list must be\nnon-empty (ie. must contain a program name).\n\nThe C<$PATH> environment variable will contain at least\nC</usr/bin> and C</bin>.  If you require a program from\nanother location, you should provide the full path in the\nfirst parameter.\n\nShared libraries and data files required by the program\nmust be available on filesystems which are mounted in the\ncorrect places.  It is the caller's responsibility to ensure\nall filesystems that are needed are mounted at the right\nlocations.");
332   else
333   if (strcasecmp (cmd, "command_lines") == 0 || strcasecmp (cmd, "command-lines") == 0)
334     pod2text ("command-lines - run a command, returning lines", " command-lines <arguments>\n\nThis is the same as C<command>, but splits the\nresult into a list of lines.");
335   else
336   if (strcasecmp (cmd, "stat") == 0)
337     pod2text ("stat - get file information", " stat <path>\n\nReturns file information for the given C<path>.\n\nThis is the same as the C<stat(2)> system call.");
338   else
339   if (strcasecmp (cmd, "lstat") == 0)
340     pod2text ("lstat - get file information for a symbolic link", " lstat <path>\n\nReturns file information for the given C<path>.\n\nThis is the same as C<stat> except that if C<path>\nis a symbolic link, then the link is stat-ed, not the file it\nrefers to.\n\nThis is the same as the C<lstat(2)> system call.");
341   else
342   if (strcasecmp (cmd, "statvfs") == 0)
343     pod2text ("statvfs - get file system statistics", " statvfs <path>\n\nReturns file system statistics for any mounted file system.\nC<path> should be a file or directory in the mounted file system\n(typically it is the mount point itself, but it doesn't need to be).\n\nThis is the same as the C<statvfs(2)> system call.");
344   else
345   if (strcasecmp (cmd, "tune2fs_l") == 0 || strcasecmp (cmd, "tune2fs-l") == 0)
346     pod2text ("tune2fs-l - get ext2/ext3 superblock details", " tune2fs-l <device>\n\nThis returns the contents of the ext2 or ext3 filesystem superblock\non C<device>.\n\nIt is the same as running C<tune2fs -l device>.  See L<tune2fs(8)>\nmanpage for more details.  The list of fields returned isn't\nclearly defined, and depends on both the version of C<tune2fs>\nthat libguestfs was built against, and the filesystem itself.");
347   else
348   if (strcasecmp (cmd, "blockdev_setro") == 0 || strcasecmp (cmd, "blockdev-setro") == 0)
349     pod2text ("blockdev-setro - set block device to read-only", " blockdev-setro <device>\n\nSets the block device named C<device> to read-only.\n\nThis uses the L<blockdev(8)> command.");
350   else
351   if (strcasecmp (cmd, "blockdev_setrw") == 0 || strcasecmp (cmd, "blockdev-setrw") == 0)
352     pod2text ("blockdev-setrw - set block device to read-write", " blockdev-setrw <device>\n\nSets the block device named C<device> to read-write.\n\nThis uses the L<blockdev(8)> command.");
353   else
354   if (strcasecmp (cmd, "blockdev_getro") == 0 || strcasecmp (cmd, "blockdev-getro") == 0)
355     pod2text ("blockdev-getro - is block device set to read-only", " blockdev-getro <device>\n\nReturns a boolean indicating if the block device is read-only\n(true if read-only, false if not).\n\nThis uses the L<blockdev(8)> command.");
356   else
357   if (strcasecmp (cmd, "blockdev_getss") == 0 || strcasecmp (cmd, "blockdev-getss") == 0)
358     pod2text ("blockdev-getss - get sectorsize of block device", " blockdev-getss <device>\n\nThis returns the size of sectors on a block device.\nUsually 512, but can be larger for modern devices.\n\n(Note, this is not the size in sectors, use C<blockdev_getsz>\nfor that).\n\nThis uses the L<blockdev(8)> command.");
359   else
360   if (strcasecmp (cmd, "blockdev_getbsz") == 0 || strcasecmp (cmd, "blockdev-getbsz") == 0)
361     pod2text ("blockdev-getbsz - get blocksize of block device", " blockdev-getbsz <device>\n\nThis returns the block size of a device.\n\n(Note this is different from both I<size in blocks> and\nI<filesystem block size>).\n\nThis uses the L<blockdev(8)> command.");
362   else
363   if (strcasecmp (cmd, "blockdev_setbsz") == 0 || strcasecmp (cmd, "blockdev-setbsz") == 0)
364     pod2text ("blockdev-setbsz - set blocksize of block device", " blockdev-setbsz <device> <blocksize>\n\nThis sets the block size of a device.\n\n(Note this is different from both I<size in blocks> and\nI<filesystem block size>).\n\nThis uses the L<blockdev(8)> command.");
365   else
366   if (strcasecmp (cmd, "blockdev_getsz") == 0 || strcasecmp (cmd, "blockdev-getsz") == 0)
367     pod2text ("blockdev-getsz - get total size of device in 512-byte sectors", " blockdev-getsz <device>\n\nThis returns the size of the device in units of 512-byte sectors\n(even if the sectorsize isn't 512 bytes ... weird).\n\nSee also C<blockdev_getss> for the real sector size of\nthe device, and C<blockdev_getsize64> for the more\nuseful I<size in bytes>.\n\nThis uses the L<blockdev(8)> command.");
368   else
369   if (strcasecmp (cmd, "blockdev_getsize64") == 0 || strcasecmp (cmd, "blockdev-getsize64") == 0)
370     pod2text ("blockdev-getsize64 - get total size of device in bytes", " blockdev-getsize64 <device>\n\nThis returns the size of the device in bytes.\n\nSee also C<blockdev_getsz>.\n\nThis uses the L<blockdev(8)> command.");
371   else
372   if (strcasecmp (cmd, "blockdev_flushbufs") == 0 || strcasecmp (cmd, "blockdev-flushbufs") == 0)
373     pod2text ("blockdev-flushbufs - flush device buffers", " blockdev-flushbufs <device>\n\nThis tells the kernel to flush internal buffers associated\nwith C<device>.\n\nThis uses the L<blockdev(8)> command.");
374   else
375   if (strcasecmp (cmd, "blockdev_rereadpt") == 0 || strcasecmp (cmd, "blockdev-rereadpt") == 0)
376     pod2text ("blockdev-rereadpt - reread partition table", " blockdev-rereadpt <device>\n\nReread the partition table on C<device>.\n\nThis uses the L<blockdev(8)> command.");
377   else
378   if (strcasecmp (cmd, "upload") == 0)
379     pod2text ("upload - upload a file from the local machine", " upload <filename> <remotefilename>\n\nUpload local file C<filename> to C<remotefilename> on the\nfilesystem.\n\nC<filename> can also be a named pipe.\n\nSee also C<download>.");
380   else
381   if (strcasecmp (cmd, "download") == 0)
382     pod2text ("download - download a file to the local machine", " download <remotefilename> <filename>\n\nDownload file C<remotefilename> and save it as C<filename>\non the local machine.\n\nC<filename> can also be a named pipe.\n\nSee also C<upload>, C<cat>.");
383   else
384   if (strcasecmp (cmd, "checksum") == 0)
385     pod2text ("checksum - compute MD5, SHAx or CRC checksum of file", " checksum <csumtype> <path>\n\nThis call computes the MD5, SHAx or CRC checksum of the\nfile named C<path>.\n\nThe type of checksum to compute is given by the C<csumtype>\nparameter which must have one of the following values:\n\n=over 4\n\n=item C<crc>\n\nCompute the cyclic redundancy check (CRC) specified by POSIX\nfor the C<cksum> command.\n\n=item C<md5>\n\nCompute the MD5 hash (using the C<md5sum> program).\n\n=item C<sha1>\n\nCompute the SHA1 hash (using the C<sha1sum> program).\n\n=item C<sha224>\n\nCompute the SHA224 hash (using the C<sha224sum> program).\n\n=item C<sha256>\n\nCompute the SHA256 hash (using the C<sha256sum> program).\n\n=item C<sha384>\n\nCompute the SHA384 hash (using the C<sha384sum> program).\n\n=item C<sha512>\n\nCompute the SHA512 hash (using the C<sha512sum> program).\n\n=back\n\nThe checksum is returned as a printable string.");
386   else
387   if (strcasecmp (cmd, "tar_in") == 0 || strcasecmp (cmd, "tar-in") == 0)
388     pod2text ("tar-in - unpack tarfile to directory", " tar-in <tarfile> <directory>\n\nThis command uploads and unpacks local file C<tarfile> (an\nI<uncompressed> tar file) into C<directory>.\n\nTo upload a compressed tarball, use C<tgz_in>.");
389   else
390   if (strcasecmp (cmd, "tar_out") == 0 || strcasecmp (cmd, "tar-out") == 0)
391     pod2text ("tar-out - pack directory into tarfile", " tar-out <directory> <tarfile>\n\nThis command packs the contents of C<directory> and downloads\nit to local file C<tarfile>.\n\nTo download a compressed tarball, use C<tgz_out>.");
392   else
393   if (strcasecmp (cmd, "tgz_in") == 0 || strcasecmp (cmd, "tgz-in") == 0)
394     pod2text ("tgz-in - unpack compressed tarball to directory", " tgz-in <tarball> <directory>\n\nThis command uploads and unpacks local file C<tarball> (a\nI<gzip compressed> tar file) into C<directory>.\n\nTo upload an uncompressed tarball, use C<tar_in>.");
395   else
396   if (strcasecmp (cmd, "tgz_out") == 0 || strcasecmp (cmd, "tgz-out") == 0)
397     pod2text ("tgz-out - pack directory into compressed tarball", " tgz-out <directory> <tarball>\n\nThis command packs the contents of C<directory> and downloads\nit to local file C<tarball>.\n\nTo download an uncompressed tarball, use C<tar_out>.");
398   else
399     display_builtin_command (cmd);
400 }
401
402 static void print_pv (struct guestfs_lvm_pv *pv)
403 {
404   int i;
405
406   printf ("pv_name: %s\n", pv->pv_name);
407   printf ("pv_uuid: ");
408   for (i = 0; i < 32; ++i)
409     printf ("%c", pv->pv_uuid[i]);
410   printf ("\n");
411   printf ("pv_fmt: %s\n", pv->pv_fmt);
412   printf ("pv_size: %" PRIu64 "\n", pv->pv_size);
413   printf ("dev_size: %" PRIu64 "\n", pv->dev_size);
414   printf ("pv_free: %" PRIu64 "\n", pv->pv_free);
415   printf ("pv_used: %" PRIu64 "\n", pv->pv_used);
416   printf ("pv_attr: %s\n", pv->pv_attr);
417   printf ("pv_pe_count: %" PRIi64 "\n", pv->pv_pe_count);
418   printf ("pv_pe_alloc_count: %" PRIi64 "\n", pv->pv_pe_alloc_count);
419   printf ("pv_tags: %s\n", pv->pv_tags);
420   printf ("pe_start: %" PRIu64 "\n", pv->pe_start);
421   printf ("pv_mda_count: %" PRIi64 "\n", pv->pv_mda_count);
422   printf ("pv_mda_free: %" PRIu64 "\n", pv->pv_mda_free);
423 }
424
425 static void print_pv_list (struct guestfs_lvm_pv_list *pvs)
426 {
427   int i;
428
429   for (i = 0; i < pvs->len; ++i)
430     print_pv (&pvs->val[i]);
431 }
432
433 static void print_vg (struct guestfs_lvm_vg *vg)
434 {
435   int i;
436
437   printf ("vg_name: %s\n", vg->vg_name);
438   printf ("vg_uuid: ");
439   for (i = 0; i < 32; ++i)
440     printf ("%c", vg->vg_uuid[i]);
441   printf ("\n");
442   printf ("vg_fmt: %s\n", vg->vg_fmt);
443   printf ("vg_attr: %s\n", vg->vg_attr);
444   printf ("vg_size: %" PRIu64 "\n", vg->vg_size);
445   printf ("vg_free: %" PRIu64 "\n", vg->vg_free);
446   printf ("vg_sysid: %s\n", vg->vg_sysid);
447   printf ("vg_extent_size: %" PRIu64 "\n", vg->vg_extent_size);
448   printf ("vg_extent_count: %" PRIi64 "\n", vg->vg_extent_count);
449   printf ("vg_free_count: %" PRIi64 "\n", vg->vg_free_count);
450   printf ("max_lv: %" PRIi64 "\n", vg->max_lv);
451   printf ("max_pv: %" PRIi64 "\n", vg->max_pv);
452   printf ("pv_count: %" PRIi64 "\n", vg->pv_count);
453   printf ("lv_count: %" PRIi64 "\n", vg->lv_count);
454   printf ("snap_count: %" PRIi64 "\n", vg->snap_count);
455   printf ("vg_seqno: %" PRIi64 "\n", vg->vg_seqno);
456   printf ("vg_tags: %s\n", vg->vg_tags);
457   printf ("vg_mda_count: %" PRIi64 "\n", vg->vg_mda_count);
458   printf ("vg_mda_free: %" PRIu64 "\n", vg->vg_mda_free);
459 }
460
461 static void print_vg_list (struct guestfs_lvm_vg_list *vgs)
462 {
463   int i;
464
465   for (i = 0; i < vgs->len; ++i)
466     print_vg (&vgs->val[i]);
467 }
468
469 static void print_lv (struct guestfs_lvm_lv *lv)
470 {
471   int i;
472
473   printf ("lv_name: %s\n", lv->lv_name);
474   printf ("lv_uuid: ");
475   for (i = 0; i < 32; ++i)
476     printf ("%c", lv->lv_uuid[i]);
477   printf ("\n");
478   printf ("lv_attr: %s\n", lv->lv_attr);
479   printf ("lv_major: %" PRIi64 "\n", lv->lv_major);
480   printf ("lv_minor: %" PRIi64 "\n", lv->lv_minor);
481   printf ("lv_kernel_major: %" PRIi64 "\n", lv->lv_kernel_major);
482   printf ("lv_kernel_minor: %" PRIi64 "\n", lv->lv_kernel_minor);
483   printf ("lv_size: %" PRIu64 "\n", lv->lv_size);
484   printf ("seg_count: %" PRIi64 "\n", lv->seg_count);
485   printf ("origin: %s\n", lv->origin);
486   if (lv->snap_percent >= 0) printf ("snap_percent: %g %%\n", lv->snap_percent);
487   else printf ("snap_percent: \n");
488   if (lv->copy_percent >= 0) printf ("copy_percent: %g %%\n", lv->copy_percent);
489   else printf ("copy_percent: \n");
490   printf ("move_pv: %s\n", lv->move_pv);
491   printf ("lv_tags: %s\n", lv->lv_tags);
492   printf ("mirror_log: %s\n", lv->mirror_log);
493   printf ("modules: %s\n", lv->modules);
494 }
495
496 static void print_lv_list (struct guestfs_lvm_lv_list *lvs)
497 {
498   int i;
499
500   for (i = 0; i < lvs->len; ++i)
501     print_lv (&lvs->val[i]);
502 }
503
504 static void print_stat (struct guestfs_stat *stat)
505 {
506   printf ("dev: %" PRIi64 "\n", stat->dev);
507   printf ("ino: %" PRIi64 "\n", stat->ino);
508   printf ("mode: %" PRIi64 "\n", stat->mode);
509   printf ("nlink: %" PRIi64 "\n", stat->nlink);
510   printf ("uid: %" PRIi64 "\n", stat->uid);
511   printf ("gid: %" PRIi64 "\n", stat->gid);
512   printf ("rdev: %" PRIi64 "\n", stat->rdev);
513   printf ("size: %" PRIi64 "\n", stat->size);
514   printf ("blksize: %" PRIi64 "\n", stat->blksize);
515   printf ("blocks: %" PRIi64 "\n", stat->blocks);
516   printf ("atime: %" PRIi64 "\n", stat->atime);
517   printf ("mtime: %" PRIi64 "\n", stat->mtime);
518   printf ("ctime: %" PRIi64 "\n", stat->ctime);
519 }
520
521 static void print_statvfs (struct guestfs_statvfs *statvfs)
522 {
523   printf ("bsize: %" PRIi64 "\n", statvfs->bsize);
524   printf ("frsize: %" PRIi64 "\n", statvfs->frsize);
525   printf ("blocks: %" PRIi64 "\n", statvfs->blocks);
526   printf ("bfree: %" PRIi64 "\n", statvfs->bfree);
527   printf ("bavail: %" PRIi64 "\n", statvfs->bavail);
528   printf ("files: %" PRIi64 "\n", statvfs->files);
529   printf ("ffree: %" PRIi64 "\n", statvfs->ffree);
530   printf ("favail: %" PRIi64 "\n", statvfs->favail);
531   printf ("fsid: %" PRIi64 "\n", statvfs->fsid);
532   printf ("flag: %" PRIi64 "\n", statvfs->flag);
533   printf ("namemax: %" PRIi64 "\n", statvfs->namemax);
534 }
535
536 static int run_launch (const char *cmd, int argc, char *argv[])
537 {
538   int r;
539   if (argc != 0) {
540     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
541     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
542     return -1;
543   }
544   r = launch (g);
545   return r;
546 }
547
548 static int run_kill_subprocess (const char *cmd, int argc, char *argv[])
549 {
550   int r;
551   if (argc != 0) {
552     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
553     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
554     return -1;
555   }
556   r = guestfs_kill_subprocess (g);
557   return r;
558 }
559
560 static int run_add_drive (const char *cmd, int argc, char *argv[])
561 {
562   int r;
563   const char *filename;
564   if (argc != 1) {
565     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
566     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
567     return -1;
568   }
569   filename = argv[0];
570   r = guestfs_add_drive (g, filename);
571   return r;
572 }
573
574 static int run_add_cdrom (const char *cmd, int argc, char *argv[])
575 {
576   int r;
577   const char *filename;
578   if (argc != 1) {
579     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
580     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
581     return -1;
582   }
583   filename = argv[0];
584   r = guestfs_add_cdrom (g, filename);
585   return r;
586 }
587
588 static int run_config (const char *cmd, int argc, char *argv[])
589 {
590   int r;
591   const char *qemuparam;
592   const char *qemuvalue;
593   if (argc != 2) {
594     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
595     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
596     return -1;
597   }
598   qemuparam = argv[0];
599   qemuvalue = strcmp (argv[1], "") != 0 ? argv[1] : NULL;
600   r = guestfs_config (g, qemuparam, qemuvalue);
601   return r;
602 }
603
604 static int run_set_qemu (const char *cmd, int argc, char *argv[])
605 {
606   int r;
607   const char *qemu;
608   if (argc != 1) {
609     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
610     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
611     return -1;
612   }
613   qemu = argv[0];
614   r = guestfs_set_qemu (g, qemu);
615   return r;
616 }
617
618 static int run_get_qemu (const char *cmd, int argc, char *argv[])
619 {
620   const char *r;
621   if (argc != 0) {
622     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
623     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
624     return -1;
625   }
626   r = guestfs_get_qemu (g);
627   if (r == NULL) return -1;
628   printf ("%s\n", r);
629   return 0;
630 }
631
632 static int run_set_path (const char *cmd, int argc, char *argv[])
633 {
634   int r;
635   const char *path;
636   if (argc != 1) {
637     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
638     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
639     return -1;
640   }
641   path = argv[0];
642   r = guestfs_set_path (g, path);
643   return r;
644 }
645
646 static int run_get_path (const char *cmd, int argc, char *argv[])
647 {
648   const char *r;
649   if (argc != 0) {
650     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
651     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
652     return -1;
653   }
654   r = guestfs_get_path (g);
655   if (r == NULL) return -1;
656   printf ("%s\n", r);
657   return 0;
658 }
659
660 static int run_set_autosync (const char *cmd, int argc, char *argv[])
661 {
662   int r;
663   int autosync;
664   if (argc != 1) {
665     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
666     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
667     return -1;
668   }
669   autosync = is_true (argv[0]) ? 1 : 0;
670   r = guestfs_set_autosync (g, autosync);
671   return r;
672 }
673
674 static int run_get_autosync (const char *cmd, int argc, char *argv[])
675 {
676   int r;
677   if (argc != 0) {
678     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
679     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
680     return -1;
681   }
682   r = guestfs_get_autosync (g);
683   if (r == -1) return -1;
684   if (r) printf ("true\n"); else printf ("false\n");
685   return 0;
686 }
687
688 static int run_set_verbose (const char *cmd, int argc, char *argv[])
689 {
690   int r;
691   int verbose;
692   if (argc != 1) {
693     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
694     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
695     return -1;
696   }
697   verbose = is_true (argv[0]) ? 1 : 0;
698   r = guestfs_set_verbose (g, verbose);
699   return r;
700 }
701
702 static int run_get_verbose (const char *cmd, int argc, char *argv[])
703 {
704   int r;
705   if (argc != 0) {
706     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
707     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
708     return -1;
709   }
710   r = guestfs_get_verbose (g);
711   if (r == -1) return -1;
712   if (r) printf ("true\n"); else printf ("false\n");
713   return 0;
714 }
715
716 static int run_is_ready (const char *cmd, int argc, char *argv[])
717 {
718   int r;
719   if (argc != 0) {
720     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
721     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
722     return -1;
723   }
724   r = guestfs_is_ready (g);
725   if (r == -1) return -1;
726   if (r) printf ("true\n"); else printf ("false\n");
727   return 0;
728 }
729
730 static int run_is_config (const char *cmd, int argc, char *argv[])
731 {
732   int r;
733   if (argc != 0) {
734     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
735     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
736     return -1;
737   }
738   r = guestfs_is_config (g);
739   if (r == -1) return -1;
740   if (r) printf ("true\n"); else printf ("false\n");
741   return 0;
742 }
743
744 static int run_is_launching (const char *cmd, int argc, char *argv[])
745 {
746   int r;
747   if (argc != 0) {
748     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
749     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
750     return -1;
751   }
752   r = guestfs_is_launching (g);
753   if (r == -1) return -1;
754   if (r) printf ("true\n"); else printf ("false\n");
755   return 0;
756 }
757
758 static int run_is_busy (const char *cmd, int argc, char *argv[])
759 {
760   int r;
761   if (argc != 0) {
762     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
763     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
764     return -1;
765   }
766   r = guestfs_is_busy (g);
767   if (r == -1) return -1;
768   if (r) printf ("true\n"); else printf ("false\n");
769   return 0;
770 }
771
772 static int run_get_state (const char *cmd, int argc, char *argv[])
773 {
774   int r;
775   if (argc != 0) {
776     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
777     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
778     return -1;
779   }
780   r = guestfs_get_state (g);
781   if (r == -1) return -1;
782   printf ("%d\n", r);
783   return 0;
784 }
785
786 static int run_mount (const char *cmd, int argc, char *argv[])
787 {
788   int r;
789   const char *device;
790   const char *mountpoint;
791   if (argc != 2) {
792     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
793     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
794     return -1;
795   }
796   device = argv[0];
797   mountpoint = argv[1];
798   r = guestfs_mount (g, device, mountpoint);
799   return r;
800 }
801
802 static int run_sync (const char *cmd, int argc, char *argv[])
803 {
804   int r;
805   if (argc != 0) {
806     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
807     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
808     return -1;
809   }
810   r = guestfs_sync (g);
811   return r;
812 }
813
814 static int run_touch (const char *cmd, int argc, char *argv[])
815 {
816   int r;
817   const char *path;
818   if (argc != 1) {
819     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
820     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
821     return -1;
822   }
823   path = argv[0];
824   r = guestfs_touch (g, path);
825   return r;
826 }
827
828 static int run_cat (const char *cmd, int argc, char *argv[])
829 {
830   char *r;
831   const char *path;
832   if (argc != 1) {
833     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
834     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
835     return -1;
836   }
837   path = argv[0];
838   r = guestfs_cat (g, path);
839   if (r == NULL) return -1;
840   printf ("%s\n", r);
841   free (r);
842   return 0;
843 }
844
845 static int run_ll (const char *cmd, int argc, char *argv[])
846 {
847   char *r;
848   const char *directory;
849   if (argc != 1) {
850     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
851     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
852     return -1;
853   }
854   directory = argv[0];
855   r = guestfs_ll (g, directory);
856   if (r == NULL) return -1;
857   printf ("%s\n", r);
858   free (r);
859   return 0;
860 }
861
862 static int run_ls (const char *cmd, int argc, char *argv[])
863 {
864   char **r;
865   const char *directory;
866   if (argc != 1) {
867     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
868     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
869     return -1;
870   }
871   directory = argv[0];
872   r = guestfs_ls (g, directory);
873   if (r == NULL) return -1;
874   print_strings (r);
875   free_strings (r);
876   return 0;
877 }
878
879 static int run_list_devices (const char *cmd, int argc, char *argv[])
880 {
881   char **r;
882   if (argc != 0) {
883     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
884     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
885     return -1;
886   }
887   r = guestfs_list_devices (g);
888   if (r == NULL) return -1;
889   print_strings (r);
890   free_strings (r);
891   return 0;
892 }
893
894 static int run_list_partitions (const char *cmd, int argc, char *argv[])
895 {
896   char **r;
897   if (argc != 0) {
898     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
899     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
900     return -1;
901   }
902   r = guestfs_list_partitions (g);
903   if (r == NULL) return -1;
904   print_strings (r);
905   free_strings (r);
906   return 0;
907 }
908
909 static int run_pvs (const char *cmd, int argc, char *argv[])
910 {
911   char **r;
912   if (argc != 0) {
913     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
914     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
915     return -1;
916   }
917   r = guestfs_pvs (g);
918   if (r == NULL) return -1;
919   print_strings (r);
920   free_strings (r);
921   return 0;
922 }
923
924 static int run_vgs (const char *cmd, int argc, char *argv[])
925 {
926   char **r;
927   if (argc != 0) {
928     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
929     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
930     return -1;
931   }
932   r = guestfs_vgs (g);
933   if (r == NULL) return -1;
934   print_strings (r);
935   free_strings (r);
936   return 0;
937 }
938
939 static int run_lvs (const char *cmd, int argc, char *argv[])
940 {
941   char **r;
942   if (argc != 0) {
943     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
944     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
945     return -1;
946   }
947   r = guestfs_lvs (g);
948   if (r == NULL) return -1;
949   print_strings (r);
950   free_strings (r);
951   return 0;
952 }
953
954 static int run_pvs_full (const char *cmd, int argc, char *argv[])
955 {
956   struct guestfs_lvm_pv_list *r;
957   if (argc != 0) {
958     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
959     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
960     return -1;
961   }
962   r = guestfs_pvs_full (g);
963   if (r == NULL) return -1;
964   print_pv_list (r);
965   guestfs_free_lvm_pv_list (r);
966   return 0;
967 }
968
969 static int run_vgs_full (const char *cmd, int argc, char *argv[])
970 {
971   struct guestfs_lvm_vg_list *r;
972   if (argc != 0) {
973     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
974     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
975     return -1;
976   }
977   r = guestfs_vgs_full (g);
978   if (r == NULL) return -1;
979   print_vg_list (r);
980   guestfs_free_lvm_vg_list (r);
981   return 0;
982 }
983
984 static int run_lvs_full (const char *cmd, int argc, char *argv[])
985 {
986   struct guestfs_lvm_lv_list *r;
987   if (argc != 0) {
988     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
989     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
990     return -1;
991   }
992   r = guestfs_lvs_full (g);
993   if (r == NULL) return -1;
994   print_lv_list (r);
995   guestfs_free_lvm_lv_list (r);
996   return 0;
997 }
998
999 static int run_read_lines (const char *cmd, int argc, char *argv[])
1000 {
1001   char **r;
1002   const char *path;
1003   if (argc != 1) {
1004     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1005     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1006     return -1;
1007   }
1008   path = argv[0];
1009   r = guestfs_read_lines (g, path);
1010   if (r == NULL) return -1;
1011   print_strings (r);
1012   free_strings (r);
1013   return 0;
1014 }
1015
1016 static int run_aug_init (const char *cmd, int argc, char *argv[])
1017 {
1018   int r;
1019   const char *root;
1020   int flags;
1021   if (argc != 2) {
1022     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1023     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1024     return -1;
1025   }
1026   root = argv[0];
1027   flags = atoi (argv[1]);
1028   r = guestfs_aug_init (g, root, flags);
1029   return r;
1030 }
1031
1032 static int run_aug_close (const char *cmd, int argc, char *argv[])
1033 {
1034   int r;
1035   if (argc != 0) {
1036     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1037     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1038     return -1;
1039   }
1040   r = guestfs_aug_close (g);
1041   return r;
1042 }
1043
1044 static int run_aug_defvar (const char *cmd, int argc, char *argv[])
1045 {
1046   int r;
1047   const char *name;
1048   const char *expr;
1049   if (argc != 2) {
1050     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1051     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1052     return -1;
1053   }
1054   name = argv[0];
1055   expr = strcmp (argv[1], "") != 0 ? argv[1] : NULL;
1056   r = guestfs_aug_defvar (g, name, expr);
1057   if (r == -1) return -1;
1058   printf ("%d\n", r);
1059   return 0;
1060 }
1061
1062 static int run_aug_defnode (const char *cmd, int argc, char *argv[])
1063 {
1064   struct guestfs_int_bool *r;
1065   const char *name;
1066   const char *expr;
1067   const char *val;
1068   if (argc != 3) {
1069     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1070     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1071     return -1;
1072   }
1073   name = argv[0];
1074   expr = argv[1];
1075   val = argv[2];
1076   r = guestfs_aug_defnode (g, name, expr, val);
1077   if (r == NULL) return -1;
1078   printf ("%d, %s\n", r->i,
1079     r->b ? "true" : "false");
1080   guestfs_free_int_bool (r);
1081   return 0;
1082 }
1083
1084 static int run_aug_get (const char *cmd, int argc, char *argv[])
1085 {
1086   char *r;
1087   const char *path;
1088   if (argc != 1) {
1089     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1090     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1091     return -1;
1092   }
1093   path = argv[0];
1094   r = guestfs_aug_get (g, path);
1095   if (r == NULL) return -1;
1096   printf ("%s\n", r);
1097   free (r);
1098   return 0;
1099 }
1100
1101 static int run_aug_set (const char *cmd, int argc, char *argv[])
1102 {
1103   int r;
1104   const char *path;
1105   const char *val;
1106   if (argc != 2) {
1107     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1108     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1109     return -1;
1110   }
1111   path = argv[0];
1112   val = argv[1];
1113   r = guestfs_aug_set (g, path, val);
1114   return r;
1115 }
1116
1117 static int run_aug_insert (const char *cmd, int argc, char *argv[])
1118 {
1119   int r;
1120   const char *path;
1121   const char *label;
1122   int before;
1123   if (argc != 3) {
1124     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1125     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1126     return -1;
1127   }
1128   path = argv[0];
1129   label = argv[1];
1130   before = is_true (argv[2]) ? 1 : 0;
1131   r = guestfs_aug_insert (g, path, label, before);
1132   return r;
1133 }
1134
1135 static int run_aug_rm (const char *cmd, int argc, char *argv[])
1136 {
1137   int r;
1138   const char *path;
1139   if (argc != 1) {
1140     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1141     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1142     return -1;
1143   }
1144   path = argv[0];
1145   r = guestfs_aug_rm (g, path);
1146   if (r == -1) return -1;
1147   printf ("%d\n", r);
1148   return 0;
1149 }
1150
1151 static int run_aug_mv (const char *cmd, int argc, char *argv[])
1152 {
1153   int r;
1154   const char *src;
1155   const char *dest;
1156   if (argc != 2) {
1157     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1158     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1159     return -1;
1160   }
1161   src = argv[0];
1162   dest = argv[1];
1163   r = guestfs_aug_mv (g, src, dest);
1164   return r;
1165 }
1166
1167 static int run_aug_match (const char *cmd, int argc, char *argv[])
1168 {
1169   char **r;
1170   const char *path;
1171   if (argc != 1) {
1172     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1173     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1174     return -1;
1175   }
1176   path = argv[0];
1177   r = guestfs_aug_match (g, path);
1178   if (r == NULL) return -1;
1179   print_strings (r);
1180   free_strings (r);
1181   return 0;
1182 }
1183
1184 static int run_aug_save (const char *cmd, int argc, char *argv[])
1185 {
1186   int r;
1187   if (argc != 0) {
1188     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1189     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1190     return -1;
1191   }
1192   r = guestfs_aug_save (g);
1193   return r;
1194 }
1195
1196 static int run_aug_load (const char *cmd, int argc, char *argv[])
1197 {
1198   int r;
1199   if (argc != 0) {
1200     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1201     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1202     return -1;
1203   }
1204   r = guestfs_aug_load (g);
1205   return r;
1206 }
1207
1208 static int run_aug_ls (const char *cmd, int argc, char *argv[])
1209 {
1210   char **r;
1211   const char *path;
1212   if (argc != 1) {
1213     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1214     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1215     return -1;
1216   }
1217   path = argv[0];
1218   r = guestfs_aug_ls (g, path);
1219   if (r == NULL) return -1;
1220   print_strings (r);
1221   free_strings (r);
1222   return 0;
1223 }
1224
1225 static int run_rm (const char *cmd, int argc, char *argv[])
1226 {
1227   int r;
1228   const char *path;
1229   if (argc != 1) {
1230     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1231     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1232     return -1;
1233   }
1234   path = argv[0];
1235   r = guestfs_rm (g, path);
1236   return r;
1237 }
1238
1239 static int run_rmdir (const char *cmd, int argc, char *argv[])
1240 {
1241   int r;
1242   const char *path;
1243   if (argc != 1) {
1244     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1245     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1246     return -1;
1247   }
1248   path = argv[0];
1249   r = guestfs_rmdir (g, path);
1250   return r;
1251 }
1252
1253 static int run_rm_rf (const char *cmd, int argc, char *argv[])
1254 {
1255   int r;
1256   const char *path;
1257   if (argc != 1) {
1258     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1259     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1260     return -1;
1261   }
1262   path = argv[0];
1263   r = guestfs_rm_rf (g, path);
1264   return r;
1265 }
1266
1267 static int run_mkdir (const char *cmd, int argc, char *argv[])
1268 {
1269   int r;
1270   const char *path;
1271   if (argc != 1) {
1272     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1273     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1274     return -1;
1275   }
1276   path = argv[0];
1277   r = guestfs_mkdir (g, path);
1278   return r;
1279 }
1280
1281 static int run_mkdir_p (const char *cmd, int argc, char *argv[])
1282 {
1283   int r;
1284   const char *path;
1285   if (argc != 1) {
1286     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1287     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1288     return -1;
1289   }
1290   path = argv[0];
1291   r = guestfs_mkdir_p (g, path);
1292   return r;
1293 }
1294
1295 static int run_chmod (const char *cmd, int argc, char *argv[])
1296 {
1297   int r;
1298   int mode;
1299   const char *path;
1300   if (argc != 2) {
1301     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1302     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1303     return -1;
1304   }
1305   mode = atoi (argv[0]);
1306   path = argv[1];
1307   r = guestfs_chmod (g, mode, path);
1308   return r;
1309 }
1310
1311 static int run_chown (const char *cmd, int argc, char *argv[])
1312 {
1313   int r;
1314   int owner;
1315   int group;
1316   const char *path;
1317   if (argc != 3) {
1318     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1319     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1320     return -1;
1321   }
1322   owner = atoi (argv[0]);
1323   group = atoi (argv[1]);
1324   path = argv[2];
1325   r = guestfs_chown (g, owner, group, path);
1326   return r;
1327 }
1328
1329 static int run_exists (const char *cmd, int argc, char *argv[])
1330 {
1331   int r;
1332   const char *path;
1333   if (argc != 1) {
1334     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1335     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1336     return -1;
1337   }
1338   path = argv[0];
1339   r = guestfs_exists (g, path);
1340   if (r == -1) return -1;
1341   if (r) printf ("true\n"); else printf ("false\n");
1342   return 0;
1343 }
1344
1345 static int run_is_file (const char *cmd, int argc, char *argv[])
1346 {
1347   int r;
1348   const char *path;
1349   if (argc != 1) {
1350     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1351     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1352     return -1;
1353   }
1354   path = argv[0];
1355   r = guestfs_is_file (g, path);
1356   if (r == -1) return -1;
1357   if (r) printf ("true\n"); else printf ("false\n");
1358   return 0;
1359 }
1360
1361 static int run_is_dir (const char *cmd, int argc, char *argv[])
1362 {
1363   int r;
1364   const char *path;
1365   if (argc != 1) {
1366     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1367     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1368     return -1;
1369   }
1370   path = argv[0];
1371   r = guestfs_is_dir (g, path);
1372   if (r == -1) return -1;
1373   if (r) printf ("true\n"); else printf ("false\n");
1374   return 0;
1375 }
1376
1377 static int run_pvcreate (const char *cmd, int argc, char *argv[])
1378 {
1379   int r;
1380   const char *device;
1381   if (argc != 1) {
1382     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1383     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1384     return -1;
1385   }
1386   device = argv[0];
1387   r = guestfs_pvcreate (g, device);
1388   return r;
1389 }
1390
1391 static int run_vgcreate (const char *cmd, int argc, char *argv[])
1392 {
1393   int r;
1394   const char *volgroup;
1395   char **physvols;
1396   if (argc != 2) {
1397     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1398     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1399     return -1;
1400   }
1401   volgroup = argv[0];
1402   physvols = parse_string_list (argv[1]);
1403   r = guestfs_vgcreate (g, volgroup, physvols);
1404   return r;
1405 }
1406
1407 static int run_lvcreate (const char *cmd, int argc, char *argv[])
1408 {
1409   int r;
1410   const char *logvol;
1411   const char *volgroup;
1412   int mbytes;
1413   if (argc != 3) {
1414     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1415     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1416     return -1;
1417   }
1418   logvol = argv[0];
1419   volgroup = argv[1];
1420   mbytes = atoi (argv[2]);
1421   r = guestfs_lvcreate (g, logvol, volgroup, mbytes);
1422   return r;
1423 }
1424
1425 static int run_mkfs (const char *cmd, int argc, char *argv[])
1426 {
1427   int r;
1428   const char *fstype;
1429   const char *device;
1430   if (argc != 2) {
1431     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1432     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1433     return -1;
1434   }
1435   fstype = argv[0];
1436   device = argv[1];
1437   r = guestfs_mkfs (g, fstype, device);
1438   return r;
1439 }
1440
1441 static int run_sfdisk (const char *cmd, int argc, char *argv[])
1442 {
1443   int r;
1444   const char *device;
1445   int cyls;
1446   int heads;
1447   int sectors;
1448   char **lines;
1449   if (argc != 5) {
1450     fprintf (stderr, "%s should have 5 parameter(s)\n", cmd);
1451     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1452     return -1;
1453   }
1454   device = argv[0];
1455   cyls = atoi (argv[1]);
1456   heads = atoi (argv[2]);
1457   sectors = atoi (argv[3]);
1458   lines = parse_string_list (argv[4]);
1459   r = guestfs_sfdisk (g, device, cyls, heads, sectors, lines);
1460   return r;
1461 }
1462
1463 static int run_write_file (const char *cmd, int argc, char *argv[])
1464 {
1465   int r;
1466   const char *path;
1467   const char *content;
1468   int size;
1469   if (argc != 3) {
1470     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1471     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1472     return -1;
1473   }
1474   path = argv[0];
1475   content = argv[1];
1476   size = atoi (argv[2]);
1477   r = guestfs_write_file (g, path, content, size);
1478   return r;
1479 }
1480
1481 static int run_umount (const char *cmd, int argc, char *argv[])
1482 {
1483   int r;
1484   const char *pathordevice;
1485   if (argc != 1) {
1486     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1487     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1488     return -1;
1489   }
1490   pathordevice = argv[0];
1491   r = guestfs_umount (g, pathordevice);
1492   return r;
1493 }
1494
1495 static int run_mounts (const char *cmd, int argc, char *argv[])
1496 {
1497   char **r;
1498   if (argc != 0) {
1499     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1500     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1501     return -1;
1502   }
1503   r = guestfs_mounts (g);
1504   if (r == NULL) return -1;
1505   print_strings (r);
1506   free_strings (r);
1507   return 0;
1508 }
1509
1510 static int run_umount_all (const char *cmd, int argc, char *argv[])
1511 {
1512   int r;
1513   if (argc != 0) {
1514     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1515     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1516     return -1;
1517   }
1518   r = guestfs_umount_all (g);
1519   return r;
1520 }
1521
1522 static int run_lvm_remove_all (const char *cmd, int argc, char *argv[])
1523 {
1524   int r;
1525   if (argc != 0) {
1526     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1527     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1528     return -1;
1529   }
1530   r = guestfs_lvm_remove_all (g);
1531   return r;
1532 }
1533
1534 static int run_file (const char *cmd, int argc, char *argv[])
1535 {
1536   char *r;
1537   const char *path;
1538   if (argc != 1) {
1539     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1540     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1541     return -1;
1542   }
1543   path = argv[0];
1544   r = guestfs_file (g, path);
1545   if (r == NULL) return -1;
1546   printf ("%s\n", r);
1547   free (r);
1548   return 0;
1549 }
1550
1551 static int run_command (const char *cmd, int argc, char *argv[])
1552 {
1553   char *r;
1554   char **arguments;
1555   if (argc != 1) {
1556     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1557     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1558     return -1;
1559   }
1560   arguments = parse_string_list (argv[0]);
1561   r = guestfs_command (g, arguments);
1562   if (r == NULL) return -1;
1563   printf ("%s\n", r);
1564   free (r);
1565   return 0;
1566 }
1567
1568 static int run_command_lines (const char *cmd, int argc, char *argv[])
1569 {
1570   char **r;
1571   char **arguments;
1572   if (argc != 1) {
1573     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1574     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1575     return -1;
1576   }
1577   arguments = parse_string_list (argv[0]);
1578   r = guestfs_command_lines (g, arguments);
1579   if (r == NULL) return -1;
1580   print_strings (r);
1581   free_strings (r);
1582   return 0;
1583 }
1584
1585 static int run_stat (const char *cmd, int argc, char *argv[])
1586 {
1587   struct guestfs_stat *r;
1588   const char *path;
1589   if (argc != 1) {
1590     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1591     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1592     return -1;
1593   }
1594   path = argv[0];
1595   r = guestfs_stat (g, path);
1596   if (r == NULL) return -1;
1597   print_stat (r);
1598   free (r);
1599   return 0;
1600 }
1601
1602 static int run_lstat (const char *cmd, int argc, char *argv[])
1603 {
1604   struct guestfs_stat *r;
1605   const char *path;
1606   if (argc != 1) {
1607     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1608     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1609     return -1;
1610   }
1611   path = argv[0];
1612   r = guestfs_lstat (g, path);
1613   if (r == NULL) return -1;
1614   print_stat (r);
1615   free (r);
1616   return 0;
1617 }
1618
1619 static int run_statvfs (const char *cmd, int argc, char *argv[])
1620 {
1621   struct guestfs_statvfs *r;
1622   const char *path;
1623   if (argc != 1) {
1624     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1625     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1626     return -1;
1627   }
1628   path = argv[0];
1629   r = guestfs_statvfs (g, path);
1630   if (r == NULL) return -1;
1631   print_statvfs (r);
1632   free (r);
1633   return 0;
1634 }
1635
1636 static int run_tune2fs_l (const char *cmd, int argc, char *argv[])
1637 {
1638   char **r;
1639   const char *device;
1640   if (argc != 1) {
1641     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1642     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1643     return -1;
1644   }
1645   device = argv[0];
1646   r = guestfs_tune2fs_l (g, device);
1647   if (r == NULL) return -1;
1648   print_table (r);
1649   free_strings (r);
1650   return 0;
1651 }
1652
1653 static int run_blockdev_setro (const char *cmd, int argc, char *argv[])
1654 {
1655   int r;
1656   const char *device;
1657   if (argc != 1) {
1658     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1659     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1660     return -1;
1661   }
1662   device = argv[0];
1663   r = guestfs_blockdev_setro (g, device);
1664   return r;
1665 }
1666
1667 static int run_blockdev_setrw (const char *cmd, int argc, char *argv[])
1668 {
1669   int r;
1670   const char *device;
1671   if (argc != 1) {
1672     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1673     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1674     return -1;
1675   }
1676   device = argv[0];
1677   r = guestfs_blockdev_setrw (g, device);
1678   return r;
1679 }
1680
1681 static int run_blockdev_getro (const char *cmd, int argc, char *argv[])
1682 {
1683   int r;
1684   const char *device;
1685   if (argc != 1) {
1686     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1687     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1688     return -1;
1689   }
1690   device = argv[0];
1691   r = guestfs_blockdev_getro (g, device);
1692   if (r == -1) return -1;
1693   if (r) printf ("true\n"); else printf ("false\n");
1694   return 0;
1695 }
1696
1697 static int run_blockdev_getss (const char *cmd, int argc, char *argv[])
1698 {
1699   int r;
1700   const char *device;
1701   if (argc != 1) {
1702     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1703     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1704     return -1;
1705   }
1706   device = argv[0];
1707   r = guestfs_blockdev_getss (g, device);
1708   if (r == -1) return -1;
1709   printf ("%d\n", r);
1710   return 0;
1711 }
1712
1713 static int run_blockdev_getbsz (const char *cmd, int argc, char *argv[])
1714 {
1715   int r;
1716   const char *device;
1717   if (argc != 1) {
1718     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1719     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1720     return -1;
1721   }
1722   device = argv[0];
1723   r = guestfs_blockdev_getbsz (g, device);
1724   if (r == -1) return -1;
1725   printf ("%d\n", r);
1726   return 0;
1727 }
1728
1729 static int run_blockdev_setbsz (const char *cmd, int argc, char *argv[])
1730 {
1731   int r;
1732   const char *device;
1733   int blocksize;
1734   if (argc != 2) {
1735     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1736     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1737     return -1;
1738   }
1739   device = argv[0];
1740   blocksize = atoi (argv[1]);
1741   r = guestfs_blockdev_setbsz (g, device, blocksize);
1742   return r;
1743 }
1744
1745 static int run_blockdev_getsz (const char *cmd, int argc, char *argv[])
1746 {
1747   int64_t r;
1748   const char *device;
1749   if (argc != 1) {
1750     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1751     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1752     return -1;
1753   }
1754   device = argv[0];
1755   r = guestfs_blockdev_getsz (g, device);
1756   if (r == -1) return -1;
1757   printf ("%" PRIi64 "\n", r);
1758   return 0;
1759 }
1760
1761 static int run_blockdev_getsize64 (const char *cmd, int argc, char *argv[])
1762 {
1763   int64_t r;
1764   const char *device;
1765   if (argc != 1) {
1766     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1767     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1768     return -1;
1769   }
1770   device = argv[0];
1771   r = guestfs_blockdev_getsize64 (g, device);
1772   if (r == -1) return -1;
1773   printf ("%" PRIi64 "\n", r);
1774   return 0;
1775 }
1776
1777 static int run_blockdev_flushbufs (const char *cmd, int argc, char *argv[])
1778 {
1779   int r;
1780   const char *device;
1781   if (argc != 1) {
1782     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1783     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1784     return -1;
1785   }
1786   device = argv[0];
1787   r = guestfs_blockdev_flushbufs (g, device);
1788   return r;
1789 }
1790
1791 static int run_blockdev_rereadpt (const char *cmd, int argc, char *argv[])
1792 {
1793   int r;
1794   const char *device;
1795   if (argc != 1) {
1796     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1797     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1798     return -1;
1799   }
1800   device = argv[0];
1801   r = guestfs_blockdev_rereadpt (g, device);
1802   return r;
1803 }
1804
1805 static int run_upload (const char *cmd, int argc, char *argv[])
1806 {
1807   int r;
1808   const char *filename;
1809   const char *remotefilename;
1810   if (argc != 2) {
1811     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1812     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1813     return -1;
1814   }
1815   filename = strcmp (argv[0], "-") != 0 ? argv[0] : "/dev/stdin";
1816   remotefilename = argv[1];
1817   r = guestfs_upload (g, filename, remotefilename);
1818   return r;
1819 }
1820
1821 static int run_download (const char *cmd, int argc, char *argv[])
1822 {
1823   int r;
1824   const char *remotefilename;
1825   const char *filename;
1826   if (argc != 2) {
1827     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1828     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1829     return -1;
1830   }
1831   remotefilename = argv[0];
1832   filename = strcmp (argv[1], "-") != 0 ? argv[1] : "/dev/stdout";
1833   r = guestfs_download (g, remotefilename, filename);
1834   return r;
1835 }
1836
1837 static int run_checksum (const char *cmd, int argc, char *argv[])
1838 {
1839   char *r;
1840   const char *csumtype;
1841   const char *path;
1842   if (argc != 2) {
1843     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1844     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1845     return -1;
1846   }
1847   csumtype = argv[0];
1848   path = argv[1];
1849   r = guestfs_checksum (g, csumtype, path);
1850   if (r == NULL) return -1;
1851   printf ("%s\n", r);
1852   free (r);
1853   return 0;
1854 }
1855
1856 static int run_tar_in (const char *cmd, int argc, char *argv[])
1857 {
1858   int r;
1859   const char *tarfile;
1860   const char *directory;
1861   if (argc != 2) {
1862     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1863     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1864     return -1;
1865   }
1866   tarfile = strcmp (argv[0], "-") != 0 ? argv[0] : "/dev/stdin";
1867   directory = argv[1];
1868   r = guestfs_tar_in (g, tarfile, directory);
1869   return r;
1870 }
1871
1872 static int run_tar_out (const char *cmd, int argc, char *argv[])
1873 {
1874   int r;
1875   const char *directory;
1876   const char *tarfile;
1877   if (argc != 2) {
1878     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1879     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1880     return -1;
1881   }
1882   directory = argv[0];
1883   tarfile = strcmp (argv[1], "-") != 0 ? argv[1] : "/dev/stdout";
1884   r = guestfs_tar_out (g, directory, tarfile);
1885   return r;
1886 }
1887
1888 static int run_tgz_in (const char *cmd, int argc, char *argv[])
1889 {
1890   int r;
1891   const char *tarball;
1892   const char *directory;
1893   if (argc != 2) {
1894     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1895     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1896     return -1;
1897   }
1898   tarball = strcmp (argv[0], "-") != 0 ? argv[0] : "/dev/stdin";
1899   directory = argv[1];
1900   r = guestfs_tgz_in (g, tarball, directory);
1901   return r;
1902 }
1903
1904 static int run_tgz_out (const char *cmd, int argc, char *argv[])
1905 {
1906   int r;
1907   const char *directory;
1908   const char *tarball;
1909   if (argc != 2) {
1910     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1911     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1912     return -1;
1913   }
1914   directory = argv[0];
1915   tarball = strcmp (argv[1], "-") != 0 ? argv[1] : "/dev/stdout";
1916   r = guestfs_tgz_out (g, directory, tarball);
1917   return r;
1918 }
1919
1920 int run_action (const char *cmd, int argc, char *argv[])
1921 {
1922   if (strcasecmp (cmd, "launch") == 0 || strcasecmp (cmd, "run") == 0)
1923     return run_launch (cmd, argc, argv);
1924   else
1925   if (strcasecmp (cmd, "kill_subprocess") == 0 || strcasecmp (cmd, "kill-subprocess") == 0)
1926     return run_kill_subprocess (cmd, argc, argv);
1927   else
1928   if (strcasecmp (cmd, "add_drive") == 0 || strcasecmp (cmd, "add-drive") == 0 || strcasecmp (cmd, "add") == 0)
1929     return run_add_drive (cmd, argc, argv);
1930   else
1931   if (strcasecmp (cmd, "add_cdrom") == 0 || strcasecmp (cmd, "add-cdrom") == 0 || strcasecmp (cmd, "cdrom") == 0)
1932     return run_add_cdrom (cmd, argc, argv);
1933   else
1934   if (strcasecmp (cmd, "config") == 0)
1935     return run_config (cmd, argc, argv);
1936   else
1937   if (strcasecmp (cmd, "set_qemu") == 0 || strcasecmp (cmd, "set-qemu") == 0 || strcasecmp (cmd, "qemu") == 0)
1938     return run_set_qemu (cmd, argc, argv);
1939   else
1940   if (strcasecmp (cmd, "get_qemu") == 0 || strcasecmp (cmd, "get-qemu") == 0)
1941     return run_get_qemu (cmd, argc, argv);
1942   else
1943   if (strcasecmp (cmd, "set_path") == 0 || strcasecmp (cmd, "set-path") == 0 || strcasecmp (cmd, "path") == 0)
1944     return run_set_path (cmd, argc, argv);
1945   else
1946   if (strcasecmp (cmd, "get_path") == 0 || strcasecmp (cmd, "get-path") == 0)
1947     return run_get_path (cmd, argc, argv);
1948   else
1949   if (strcasecmp (cmd, "set_autosync") == 0 || strcasecmp (cmd, "set-autosync") == 0 || strcasecmp (cmd, "autosync") == 0)
1950     return run_set_autosync (cmd, argc, argv);
1951   else
1952   if (strcasecmp (cmd, "get_autosync") == 0 || strcasecmp (cmd, "get-autosync") == 0)
1953     return run_get_autosync (cmd, argc, argv);
1954   else
1955   if (strcasecmp (cmd, "set_verbose") == 0 || strcasecmp (cmd, "set-verbose") == 0 || strcasecmp (cmd, "verbose") == 0)
1956     return run_set_verbose (cmd, argc, argv);
1957   else
1958   if (strcasecmp (cmd, "get_verbose") == 0 || strcasecmp (cmd, "get-verbose") == 0)
1959     return run_get_verbose (cmd, argc, argv);
1960   else
1961   if (strcasecmp (cmd, "is_ready") == 0 || strcasecmp (cmd, "is-ready") == 0)
1962     return run_is_ready (cmd, argc, argv);
1963   else
1964   if (strcasecmp (cmd, "is_config") == 0 || strcasecmp (cmd, "is-config") == 0)
1965     return run_is_config (cmd, argc, argv);
1966   else
1967   if (strcasecmp (cmd, "is_launching") == 0 || strcasecmp (cmd, "is-launching") == 0)
1968     return run_is_launching (cmd, argc, argv);
1969   else
1970   if (strcasecmp (cmd, "is_busy") == 0 || strcasecmp (cmd, "is-busy") == 0)
1971     return run_is_busy (cmd, argc, argv);
1972   else
1973   if (strcasecmp (cmd, "get_state") == 0 || strcasecmp (cmd, "get-state") == 0)
1974     return run_get_state (cmd, argc, argv);
1975   else
1976   if (strcasecmp (cmd, "mount") == 0)
1977     return run_mount (cmd, argc, argv);
1978   else
1979   if (strcasecmp (cmd, "sync") == 0)
1980     return run_sync (cmd, argc, argv);
1981   else
1982   if (strcasecmp (cmd, "touch") == 0)
1983     return run_touch (cmd, argc, argv);
1984   else
1985   if (strcasecmp (cmd, "cat") == 0)
1986     return run_cat (cmd, argc, argv);
1987   else
1988   if (strcasecmp (cmd, "ll") == 0)
1989     return run_ll (cmd, argc, argv);
1990   else
1991   if (strcasecmp (cmd, "ls") == 0)
1992     return run_ls (cmd, argc, argv);
1993   else
1994   if (strcasecmp (cmd, "list_devices") == 0 || strcasecmp (cmd, "list-devices") == 0)
1995     return run_list_devices (cmd, argc, argv);
1996   else
1997   if (strcasecmp (cmd, "list_partitions") == 0 || strcasecmp (cmd, "list-partitions") == 0)
1998     return run_list_partitions (cmd, argc, argv);
1999   else
2000   if (strcasecmp (cmd, "pvs") == 0)
2001     return run_pvs (cmd, argc, argv);
2002   else
2003   if (strcasecmp (cmd, "vgs") == 0)
2004     return run_vgs (cmd, argc, argv);
2005   else
2006   if (strcasecmp (cmd, "lvs") == 0)
2007     return run_lvs (cmd, argc, argv);
2008   else
2009   if (strcasecmp (cmd, "pvs_full") == 0 || strcasecmp (cmd, "pvs-full") == 0)
2010     return run_pvs_full (cmd, argc, argv);
2011   else
2012   if (strcasecmp (cmd, "vgs_full") == 0 || strcasecmp (cmd, "vgs-full") == 0)
2013     return run_vgs_full (cmd, argc, argv);
2014   else
2015   if (strcasecmp (cmd, "lvs_full") == 0 || strcasecmp (cmd, "lvs-full") == 0)
2016     return run_lvs_full (cmd, argc, argv);
2017   else
2018   if (strcasecmp (cmd, "read_lines") == 0 || strcasecmp (cmd, "read-lines") == 0)
2019     return run_read_lines (cmd, argc, argv);
2020   else
2021   if (strcasecmp (cmd, "aug_init") == 0 || strcasecmp (cmd, "aug-init") == 0)
2022     return run_aug_init (cmd, argc, argv);
2023   else
2024   if (strcasecmp (cmd, "aug_close") == 0 || strcasecmp (cmd, "aug-close") == 0)
2025     return run_aug_close (cmd, argc, argv);
2026   else
2027   if (strcasecmp (cmd, "aug_defvar") == 0 || strcasecmp (cmd, "aug-defvar") == 0)
2028     return run_aug_defvar (cmd, argc, argv);
2029   else
2030   if (strcasecmp (cmd, "aug_defnode") == 0 || strcasecmp (cmd, "aug-defnode") == 0)
2031     return run_aug_defnode (cmd, argc, argv);
2032   else
2033   if (strcasecmp (cmd, "aug_get") == 0 || strcasecmp (cmd, "aug-get") == 0)
2034     return run_aug_get (cmd, argc, argv);
2035   else
2036   if (strcasecmp (cmd, "aug_set") == 0 || strcasecmp (cmd, "aug-set") == 0)
2037     return run_aug_set (cmd, argc, argv);
2038   else
2039   if (strcasecmp (cmd, "aug_insert") == 0 || strcasecmp (cmd, "aug-insert") == 0)
2040     return run_aug_insert (cmd, argc, argv);
2041   else
2042   if (strcasecmp (cmd, "aug_rm") == 0 || strcasecmp (cmd, "aug-rm") == 0)
2043     return run_aug_rm (cmd, argc, argv);
2044   else
2045   if (strcasecmp (cmd, "aug_mv") == 0 || strcasecmp (cmd, "aug-mv") == 0)
2046     return run_aug_mv (cmd, argc, argv);
2047   else
2048   if (strcasecmp (cmd, "aug_match") == 0 || strcasecmp (cmd, "aug-match") == 0)
2049     return run_aug_match (cmd, argc, argv);
2050   else
2051   if (strcasecmp (cmd, "aug_save") == 0 || strcasecmp (cmd, "aug-save") == 0)
2052     return run_aug_save (cmd, argc, argv);
2053   else
2054   if (strcasecmp (cmd, "aug_load") == 0 || strcasecmp (cmd, "aug-load") == 0)
2055     return run_aug_load (cmd, argc, argv);
2056   else
2057   if (strcasecmp (cmd, "aug_ls") == 0 || strcasecmp (cmd, "aug-ls") == 0)
2058     return run_aug_ls (cmd, argc, argv);
2059   else
2060   if (strcasecmp (cmd, "rm") == 0)
2061     return run_rm (cmd, argc, argv);
2062   else
2063   if (strcasecmp (cmd, "rmdir") == 0)
2064     return run_rmdir (cmd, argc, argv);
2065   else
2066   if (strcasecmp (cmd, "rm_rf") == 0 || strcasecmp (cmd, "rm-rf") == 0)
2067     return run_rm_rf (cmd, argc, argv);
2068   else
2069   if (strcasecmp (cmd, "mkdir") == 0)
2070     return run_mkdir (cmd, argc, argv);
2071   else
2072   if (strcasecmp (cmd, "mkdir_p") == 0 || strcasecmp (cmd, "mkdir-p") == 0)
2073     return run_mkdir_p (cmd, argc, argv);
2074   else
2075   if (strcasecmp (cmd, "chmod") == 0)
2076     return run_chmod (cmd, argc, argv);
2077   else
2078   if (strcasecmp (cmd, "chown") == 0)
2079     return run_chown (cmd, argc, argv);
2080   else
2081   if (strcasecmp (cmd, "exists") == 0)
2082     return run_exists (cmd, argc, argv);
2083   else
2084   if (strcasecmp (cmd, "is_file") == 0 || strcasecmp (cmd, "is-file") == 0)
2085     return run_is_file (cmd, argc, argv);
2086   else
2087   if (strcasecmp (cmd, "is_dir") == 0 || strcasecmp (cmd, "is-dir") == 0)
2088     return run_is_dir (cmd, argc, argv);
2089   else
2090   if (strcasecmp (cmd, "pvcreate") == 0)
2091     return run_pvcreate (cmd, argc, argv);
2092   else
2093   if (strcasecmp (cmd, "vgcreate") == 0)
2094     return run_vgcreate (cmd, argc, argv);
2095   else
2096   if (strcasecmp (cmd, "lvcreate") == 0)
2097     return run_lvcreate (cmd, argc, argv);
2098   else
2099   if (strcasecmp (cmd, "mkfs") == 0)
2100     return run_mkfs (cmd, argc, argv);
2101   else
2102   if (strcasecmp (cmd, "sfdisk") == 0)
2103     return run_sfdisk (cmd, argc, argv);
2104   else
2105   if (strcasecmp (cmd, "write_file") == 0 || strcasecmp (cmd, "write-file") == 0)
2106     return run_write_file (cmd, argc, argv);
2107   else
2108   if (strcasecmp (cmd, "umount") == 0 || strcasecmp (cmd, "unmount") == 0)
2109     return run_umount (cmd, argc, argv);
2110   else
2111   if (strcasecmp (cmd, "mounts") == 0)
2112     return run_mounts (cmd, argc, argv);
2113   else
2114   if (strcasecmp (cmd, "umount_all") == 0 || strcasecmp (cmd, "umount-all") == 0 || strcasecmp (cmd, "unmount-all") == 0)
2115     return run_umount_all (cmd, argc, argv);
2116   else
2117   if (strcasecmp (cmd, "lvm_remove_all") == 0 || strcasecmp (cmd, "lvm-remove-all") == 0)
2118     return run_lvm_remove_all (cmd, argc, argv);
2119   else
2120   if (strcasecmp (cmd, "file") == 0)
2121     return run_file (cmd, argc, argv);
2122   else
2123   if (strcasecmp (cmd, "command") == 0)
2124     return run_command (cmd, argc, argv);
2125   else
2126   if (strcasecmp (cmd, "command_lines") == 0 || strcasecmp (cmd, "command-lines") == 0)
2127     return run_command_lines (cmd, argc, argv);
2128   else
2129   if (strcasecmp (cmd, "stat") == 0)
2130     return run_stat (cmd, argc, argv);
2131   else
2132   if (strcasecmp (cmd, "lstat") == 0)
2133     return run_lstat (cmd, argc, argv);
2134   else
2135   if (strcasecmp (cmd, "statvfs") == 0)
2136     return run_statvfs (cmd, argc, argv);
2137   else
2138   if (strcasecmp (cmd, "tune2fs_l") == 0 || strcasecmp (cmd, "tune2fs-l") == 0)
2139     return run_tune2fs_l (cmd, argc, argv);
2140   else
2141   if (strcasecmp (cmd, "blockdev_setro") == 0 || strcasecmp (cmd, "blockdev-setro") == 0)
2142     return run_blockdev_setro (cmd, argc, argv);
2143   else
2144   if (strcasecmp (cmd, "blockdev_setrw") == 0 || strcasecmp (cmd, "blockdev-setrw") == 0)
2145     return run_blockdev_setrw (cmd, argc, argv);
2146   else
2147   if (strcasecmp (cmd, "blockdev_getro") == 0 || strcasecmp (cmd, "blockdev-getro") == 0)
2148     return run_blockdev_getro (cmd, argc, argv);
2149   else
2150   if (strcasecmp (cmd, "blockdev_getss") == 0 || strcasecmp (cmd, "blockdev-getss") == 0)
2151     return run_blockdev_getss (cmd, argc, argv);
2152   else
2153   if (strcasecmp (cmd, "blockdev_getbsz") == 0 || strcasecmp (cmd, "blockdev-getbsz") == 0)
2154     return run_blockdev_getbsz (cmd, argc, argv);
2155   else
2156   if (strcasecmp (cmd, "blockdev_setbsz") == 0 || strcasecmp (cmd, "blockdev-setbsz") == 0)
2157     return run_blockdev_setbsz (cmd, argc, argv);
2158   else
2159   if (strcasecmp (cmd, "blockdev_getsz") == 0 || strcasecmp (cmd, "blockdev-getsz") == 0)
2160     return run_blockdev_getsz (cmd, argc, argv);
2161   else
2162   if (strcasecmp (cmd, "blockdev_getsize64") == 0 || strcasecmp (cmd, "blockdev-getsize64") == 0)
2163     return run_blockdev_getsize64 (cmd, argc, argv);
2164   else
2165   if (strcasecmp (cmd, "blockdev_flushbufs") == 0 || strcasecmp (cmd, "blockdev-flushbufs") == 0)
2166     return run_blockdev_flushbufs (cmd, argc, argv);
2167   else
2168   if (strcasecmp (cmd, "blockdev_rereadpt") == 0 || strcasecmp (cmd, "blockdev-rereadpt") == 0)
2169     return run_blockdev_rereadpt (cmd, argc, argv);
2170   else
2171   if (strcasecmp (cmd, "upload") == 0)
2172     return run_upload (cmd, argc, argv);
2173   else
2174   if (strcasecmp (cmd, "download") == 0)
2175     return run_download (cmd, argc, argv);
2176   else
2177   if (strcasecmp (cmd, "checksum") == 0)
2178     return run_checksum (cmd, argc, argv);
2179   else
2180   if (strcasecmp (cmd, "tar_in") == 0 || strcasecmp (cmd, "tar-in") == 0)
2181     return run_tar_in (cmd, argc, argv);
2182   else
2183   if (strcasecmp (cmd, "tar_out") == 0 || strcasecmp (cmd, "tar-out") == 0)
2184     return run_tar_out (cmd, argc, argv);
2185   else
2186   if (strcasecmp (cmd, "tgz_in") == 0 || strcasecmp (cmd, "tgz-in") == 0)
2187     return run_tgz_in (cmd, argc, argv);
2188   else
2189   if (strcasecmp (cmd, "tgz_out") == 0 || strcasecmp (cmd, "tgz-out") == 0)
2190     return run_tgz_out (cmd, argc, argv);
2191   else
2192     {
2193       fprintf (stderr, "%s: unknown command\n", cmd);
2194       return -1;
2195     }
2196   return 0;
2197 }
2198