Use a squashfs attached as /dev/sdd during the C API tests.
[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", "cp", "copy a file");
67   printf ("%-20s %s\n", "cp-a", "copy a file or directory recursively");
68   printf ("%-20s %s\n", "debug", "debugging and internals");
69   printf ("%-20s %s\n", "dmesg", "return kernel messages");
70   printf ("%-20s %s\n", "download", "download a file to the local machine");
71   printf ("%-20s %s\n", "drop-caches", "drop kernel page cache, dentries and inodes");
72   printf ("%-20s %s\n", "e2fsck-f", "check an ext2/ext3 filesystem");
73   printf ("%-20s %s\n", "equal", "test if two files have equal contents");
74   printf ("%-20s %s\n", "exists", "test if file or directory exists");
75   printf ("%-20s %s\n", "file", "determine file type");
76   printf ("%-20s %s\n", "find", "find all files and directories");
77   printf ("%-20s %s\n", "fsck", "run the filesystem checker");
78   printf ("%-20s %s\n", "get-append", "get the additional kernel options");
79   printf ("%-20s %s\n", "get-autosync", "get autosync mode");
80   printf ("%-20s %s\n", "get-e2label", "get the ext2/3/4 filesystem label");
81   printf ("%-20s %s\n", "get-e2uuid", "get the ext2/3/4 filesystem UUID");
82   printf ("%-20s %s\n", "get-path", "get the search path");
83   printf ("%-20s %s\n", "get-qemu", "get the qemu binary");
84   printf ("%-20s %s\n", "get-state", "get the current state");
85   printf ("%-20s %s\n", "get-verbose", "get verbose mode");
86   printf ("%-20s %s\n", "grub-install", "install GRUB");
87   printf ("%-20s %s\n", "hexdump", "dump a file in hexadecimal");
88   printf ("%-20s %s\n", "is-busy", "is busy processing a command");
89   printf ("%-20s %s\n", "is-config", "is in configuration state");
90   printf ("%-20s %s\n", "is-dir", "test if file exists");
91   printf ("%-20s %s\n", "is-file", "test if file exists");
92   printf ("%-20s %s\n", "is-launching", "is launching subprocess");
93   printf ("%-20s %s\n", "is-ready", "is ready to accept commands");
94   printf ("%-20s %s\n", "kill-subprocess", "kill the qemu subprocess");
95   printf ("%-20s %s\n", "launch", "launch the qemu subprocess");
96   printf ("%-20s %s\n", "list-devices", "list the block devices");
97   printf ("%-20s %s\n", "list-partitions", "list the partitions");
98   printf ("%-20s %s\n", "ll", "list the files in a directory (long format)");
99   printf ("%-20s %s\n", "ls", "list the files in a directory");
100   printf ("%-20s %s\n", "lstat", "get file information for a symbolic link");
101   printf ("%-20s %s\n", "lvcreate", "create an LVM volume group");
102   printf ("%-20s %s\n", "lvm-remove-all", "remove all LVM LVs, VGs and PVs");
103   printf ("%-20s %s\n", "lvremove", "remove an LVM logical volume");
104   printf ("%-20s %s\n", "lvresize", "resize an LVM logical volume");
105   printf ("%-20s %s\n", "lvs", "list the LVM logical volumes (LVs)");
106   printf ("%-20s %s\n", "lvs-full", "list the LVM logical volumes (LVs)");
107   printf ("%-20s %s\n", "mkdir", "create a directory");
108   printf ("%-20s %s\n", "mkdir-p", "create a directory and parents");
109   printf ("%-20s %s\n", "mkfs", "make a filesystem");
110   printf ("%-20s %s\n", "mount", "mount a guest disk at a position in the filesystem");
111   printf ("%-20s %s\n", "mount-options", "mount a guest disk with mount options");
112   printf ("%-20s %s\n", "mount-ro", "mount a guest disk, read-only");
113   printf ("%-20s %s\n", "mount-vfs", "mount a guest disk with mount options and vfstype");
114   printf ("%-20s %s\n", "mounts", "show mounted filesystems");
115   printf ("%-20s %s\n", "mv", "move a file");
116   printf ("%-20s %s\n", "ping-daemon", "ping the guest daemon");
117   printf ("%-20s %s\n", "pvcreate", "create an LVM physical volume");
118   printf ("%-20s %s\n", "pvremove", "remove an LVM physical volume");
119   printf ("%-20s %s\n", "pvresize", "resize an LVM physical volume");
120   printf ("%-20s %s\n", "pvs", "list the LVM physical volumes (PVs)");
121   printf ("%-20s %s\n", "pvs-full", "list the LVM physical volumes (PVs)");
122   printf ("%-20s %s\n", "read-lines", "read file as lines");
123   printf ("%-20s %s\n", "resize2fs", "resize an ext2/ext3 filesystem");
124   printf ("%-20s %s\n", "rm", "remove a file");
125   printf ("%-20s %s\n", "rm-rf", "remove a file or directory recursively");
126   printf ("%-20s %s\n", "rmdir", "remove a directory");
127   printf ("%-20s %s\n", "set-append", "add options to kernel command line");
128   printf ("%-20s %s\n", "set-autosync", "set autosync mode");
129   printf ("%-20s %s\n", "set-e2label", "set the ext2/3/4 filesystem label");
130   printf ("%-20s %s\n", "set-e2uuid", "set the ext2/3/4 filesystem UUID");
131   printf ("%-20s %s\n", "set-path", "set the search path");
132   printf ("%-20s %s\n", "set-qemu", "set the qemu binary");
133   printf ("%-20s %s\n", "set-verbose", "set verbose mode");
134   printf ("%-20s %s\n", "sfdisk", "create partitions on a block device");
135   printf ("%-20s %s\n", "sfdisk-N", "modify a single partition on a block device");
136   printf ("%-20s %s\n", "sfdisk-disk-geometry", "display the disk geometry from the partition table");
137   printf ("%-20s %s\n", "sfdisk-kernel-geometry", "display the kernel geometry");
138   printf ("%-20s %s\n", "sfdisk-l", "display the partition table");
139   printf ("%-20s %s\n", "stat", "get file information");
140   printf ("%-20s %s\n", "statvfs", "get file system statistics");
141   printf ("%-20s %s\n", "strings", "print the printable strings in a file");
142   printf ("%-20s %s\n", "strings-e", "print the printable strings in a file");
143   printf ("%-20s %s\n", "sync", "sync disks, writes are flushed through to the disk image");
144   printf ("%-20s %s\n", "tar-in", "unpack tarfile to directory");
145   printf ("%-20s %s\n", "tar-out", "pack directory into tarfile");
146   printf ("%-20s %s\n", "tgz-in", "unpack compressed tarball to directory");
147   printf ("%-20s %s\n", "tgz-out", "pack directory into compressed tarball");
148   printf ("%-20s %s\n", "touch", "update file timestamps or create a new file");
149   printf ("%-20s %s\n", "tune2fs-l", "get ext2/ext3/ext4 superblock details");
150   printf ("%-20s %s\n", "umount", "unmount a filesystem");
151   printf ("%-20s %s\n", "umount-all", "unmount all filesystems");
152   printf ("%-20s %s\n", "upload", "upload a file from the local machine");
153   printf ("%-20s %s\n", "vg-activate", "activate or deactivate some volume groups");
154   printf ("%-20s %s\n", "vg-activate-all", "activate or deactivate all volume groups");
155   printf ("%-20s %s\n", "vgcreate", "create an LVM volume group");
156   printf ("%-20s %s\n", "vgremove", "remove an LVM volume group");
157   printf ("%-20s %s\n", "vgs", "list the LVM volume groups (VGs)");
158   printf ("%-20s %s\n", "vgs-full", "list the LVM volume groups (VGs)");
159   printf ("%-20s %s\n", "write-file", "create a file");
160   printf ("%-20s %s\n", "zero", "write zeroes to the device");
161   printf ("%-20s %s\n", "zerofree", "zero unused inodes and disk blocks on ext2/3 filesystem");
162   printf ("    Use -h <cmd> / help <cmd> to show detailed help for a command.\n");
163 }
164
165 void display_command (const char *cmd)
166 {
167   if (strcasecmp (cmd, "launch") == 0 || strcasecmp (cmd, "run") == 0)
168     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.");
169   else
170   if (strcasecmp (cmd, "kill_subprocess") == 0 || strcasecmp (cmd, "kill-subprocess") == 0)
171     pod2text ("kill-subprocess - kill the qemu subprocess", " kill-subprocess\n\nThis kills the qemu subprocess.  You should never need to call this.");
172   else
173   if (strcasecmp (cmd, "add_drive") == 0 || strcasecmp (cmd, "add-drive") == 0 || strcasecmp (cmd, "add") == 0)
174     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.");
175   else
176   if (strcasecmp (cmd, "add_cdrom") == 0 || strcasecmp (cmd, "add-cdrom") == 0 || strcasecmp (cmd, "cdrom") == 0)
177     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.");
178   else
179   if (strcasecmp (cmd, "config") == 0)
180     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.");
181   else
182   if (strcasecmp (cmd, "set_qemu") == 0 || strcasecmp (cmd, "set-qemu") == 0 || strcasecmp (cmd, "qemu") == 0)
183     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\nSetting C<qemu> to C<NULL> restores the default qemu binary.\n\nYou can use 'qemu' as an alias for this command.");
184   else
185   if (strcasecmp (cmd, "get_qemu") == 0 || strcasecmp (cmd, "get-qemu") == 0)
186     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.");
187   else
188   if (strcasecmp (cmd, "set_path") == 0 || strcasecmp (cmd, "set-path") == 0 || strcasecmp (cmd, "path") == 0)
189     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\nSetting C<path> to C<NULL> restores the default path.\n\nYou can use 'path' as an alias for this command.");
190   else
191   if (strcasecmp (cmd, "get_path") == 0 || strcasecmp (cmd, "get-path") == 0)
192     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.");
193   else
194   if (strcasecmp (cmd, "set_append") == 0 || strcasecmp (cmd, "set-append") == 0 || strcasecmp (cmd, "append") == 0)
195     pod2text ("set-append - add options to kernel command line", " set-append <append>\n\nThis function is used to add additional options to the\nguest kernel command line.\n\nThe default is C<NULL> unless overridden by setting\nC<LIBGUESTFS_APPEND> environment variable.\n\nSetting C<append> to C<NULL> means I<no> additional options\nare passed (libguestfs always adds a few of its own).\n\nYou can use 'append' as an alias for this command.");
196   else
197   if (strcasecmp (cmd, "get_append") == 0 || strcasecmp (cmd, "get-append") == 0)
198     pod2text ("get-append - get the additional kernel options", " get-append\n\nReturn the additional kernel options which are added to the\nguest kernel command line.\n\nIf C<NULL> then no options are added.");
199   else
200   if (strcasecmp (cmd, "set_autosync") == 0 || strcasecmp (cmd, "set-autosync") == 0 || strcasecmp (cmd, "autosync") == 0)
201     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<umount_all> followed by\nC<sync> when the handle is closed\n(also if the program exits without closing handles).\n\nThis is disabled by default (except in guestfish where it is\nenabled by default).\n\nYou can use 'autosync' as an alias for this command.");
202   else
203   if (strcasecmp (cmd, "get_autosync") == 0 || strcasecmp (cmd, "get-autosync") == 0)
204     pod2text ("get-autosync - get autosync mode", " get-autosync\n\nGet the autosync flag.");
205   else
206   if (strcasecmp (cmd, "set_verbose") == 0 || strcasecmp (cmd, "set-verbose") == 0 || strcasecmp (cmd, "verbose") == 0)
207     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.");
208   else
209   if (strcasecmp (cmd, "get_verbose") == 0 || strcasecmp (cmd, "get-verbose") == 0)
210     pod2text ("get-verbose - get verbose mode", " get-verbose\n\nThis returns the verbose messages flag.");
211   else
212   if (strcasecmp (cmd, "is_ready") == 0 || strcasecmp (cmd, "is-ready") == 0)
213     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)>.");
214   else
215   if (strcasecmp (cmd, "is_config") == 0 || strcasecmp (cmd, "is-config") == 0)
216     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)>.");
217   else
218   if (strcasecmp (cmd, "is_launching") == 0 || strcasecmp (cmd, "is-launching") == 0)
219     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)>.");
220   else
221   if (strcasecmp (cmd, "is_busy") == 0 || strcasecmp (cmd, "is-busy") == 0)
222     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)>.");
223   else
224   if (strcasecmp (cmd, "get_state") == 0 || strcasecmp (cmd, "get-state") == 0)
225     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)>.");
226   else
227   if (strcasecmp (cmd, "mount") == 0)
228     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.");
229   else
230   if (strcasecmp (cmd, "sync") == 0)
231     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.");
232   else
233   if (strcasecmp (cmd, "touch") == 0)
234     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.");
235   else
236   if (strcasecmp (cmd, "cat") == 0)
237     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.");
238   else
239   if (strcasecmp (cmd, "ll") == 0)
240     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.");
241   else
242   if (strcasecmp (cmd, "ls") == 0)
243     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.");
244   else
245   if (strcasecmp (cmd, "list_devices") == 0 || strcasecmp (cmd, "list-devices") == 0)
246     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>");
247   else
248   if (strcasecmp (cmd, "list_partitions") == 0 || strcasecmp (cmd, "list-partitions") == 0)
249     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>.");
250   else
251   if (strcasecmp (cmd, "pvs") == 0)
252     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>.");
253   else
254   if (strcasecmp (cmd, "vgs") == 0)
255     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>.");
256   else
257   if (strcasecmp (cmd, "lvs") == 0)
258     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>.");
259   else
260   if (strcasecmp (cmd, "pvs_full") == 0 || strcasecmp (cmd, "pvs-full") == 0)
261     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.");
262   else
263   if (strcasecmp (cmd, "vgs_full") == 0 || strcasecmp (cmd, "vgs-full") == 0)
264     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.");
265   else
266   if (strcasecmp (cmd, "lvs_full") == 0 || strcasecmp (cmd, "lvs-full") == 0)
267     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.");
268   else
269   if (strcasecmp (cmd, "read_lines") == 0 || strcasecmp (cmd, "read-lines") == 0)
270     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.");
271   else
272   if (strcasecmp (cmd, "aug_init") == 0 || strcasecmp (cmd, "aug-init") == 0)
273     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/>.");
274   else
275   if (strcasecmp (cmd, "aug_close") == 0 || strcasecmp (cmd, "aug-close") == 0)
276     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.");
277   else
278   if (strcasecmp (cmd, "aug_defvar") == 0 || strcasecmp (cmd, "aug-defvar") == 0)
279     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.");
280   else
281   if (strcasecmp (cmd, "aug_defnode") == 0 || strcasecmp (cmd, "aug-defnode") == 0)
282     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.");
283   else
284   if (strcasecmp (cmd, "aug_get") == 0 || strcasecmp (cmd, "aug-get") == 0)
285     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.");
286   else
287   if (strcasecmp (cmd, "aug_set") == 0 || strcasecmp (cmd, "aug-set") == 0)
288     pod2text ("aug-set - set Augeas path to value", " aug-set <path> <val>\n\nSet the value associated with C<path> to C<value>.");
289   else
290   if (strcasecmp (cmd, "aug_insert") == 0 || strcasecmp (cmd, "aug-insert") == 0)
291     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]>.");
292   else
293   if (strcasecmp (cmd, "aug_rm") == 0 || strcasecmp (cmd, "aug-rm") == 0)
294     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.");
295   else
296   if (strcasecmp (cmd, "aug_mv") == 0 || strcasecmp (cmd, "aug-mv") == 0)
297     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.");
298   else
299   if (strcasecmp (cmd, "aug_match") == 0 || strcasecmp (cmd, "aug-match") == 0)
300     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.");
301   else
302   if (strcasecmp (cmd, "aug_save") == 0 || strcasecmp (cmd, "aug-save") == 0)
303     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.");
304   else
305   if (strcasecmp (cmd, "aug_load") == 0 || strcasecmp (cmd, "aug-load") == 0)
306     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.");
307   else
308   if (strcasecmp (cmd, "aug_ls") == 0 || strcasecmp (cmd, "aug-ls") == 0)
309     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.");
310   else
311   if (strcasecmp (cmd, "rm") == 0)
312     pod2text ("rm - remove a file", " rm <path>\n\nRemove the single file C<path>.");
313   else
314   if (strcasecmp (cmd, "rmdir") == 0)
315     pod2text ("rmdir - remove a directory", " rmdir <path>\n\nRemove the single directory C<path>.");
316   else
317   if (strcasecmp (cmd, "rm_rf") == 0 || strcasecmp (cmd, "rm-rf") == 0)
318     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.");
319   else
320   if (strcasecmp (cmd, "mkdir") == 0)
321     pod2text ("mkdir - create a directory", " mkdir <path>\n\nCreate a directory named C<path>.");
322   else
323   if (strcasecmp (cmd, "mkdir_p") == 0 || strcasecmp (cmd, "mkdir-p") == 0)
324     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.");
325   else
326   if (strcasecmp (cmd, "chmod") == 0)
327     pod2text ("chmod - change file mode", " chmod <mode> <path>\n\nChange the mode (permissions) of C<path> to C<mode>.  Only\nnumeric modes are supported.");
328   else
329   if (strcasecmp (cmd, "chown") == 0)
330     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).");
331   else
332   if (strcasecmp (cmd, "exists") == 0)
333     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>.");
334   else
335   if (strcasecmp (cmd, "is_file") == 0 || strcasecmp (cmd, "is-file") == 0)
336     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>.");
337   else
338   if (strcasecmp (cmd, "is_dir") == 0 || strcasecmp (cmd, "is-dir") == 0)
339     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>.");
340   else
341   if (strcasecmp (cmd, "pvcreate") == 0)
342     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>.");
343   else
344   if (strcasecmp (cmd, "vgcreate") == 0)
345     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>.");
346   else
347   if (strcasecmp (cmd, "lvcreate") == 0)
348     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.");
349   else
350   if (strcasecmp (cmd, "mkfs") == 0)
351     pod2text ("mkfs - make a filesystem", " mkfs <fstype> <device>\n\nThis creates a filesystem on C<device> (usually a partition\nor LVM logical volume).  The filesystem type is C<fstype>, for\nexample C<ext3>.");
352   else
353   if (strcasecmp (cmd, "sfdisk") == 0)
354     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\nSee also: C<sfdisk_l>, C<sfdisk_N>\n\nB<This command is dangerous.  Without careful use you\ncan easily destroy all your data>.");
355   else
356   if (strcasecmp (cmd, "write_file") == 0 || strcasecmp (cmd, "write-file") == 0)
357     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\nI<NB.> Owing to a bug, writing content containing ASCII NUL\ncharacters does I<not> work, even if the length is specified.\nWe hope to resolve this bug in a future version.  In the meantime\nuse C<upload>.\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.");
358   else
359   if (strcasecmp (cmd, "umount") == 0 || strcasecmp (cmd, "unmount") == 0)
360     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.");
361   else
362   if (strcasecmp (cmd, "mounts") == 0)
363     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.");
364   else
365   if (strcasecmp (cmd, "umount_all") == 0 || strcasecmp (cmd, "umount-all") == 0 || strcasecmp (cmd, "unmount-all") == 0)
366     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.");
367   else
368   if (strcasecmp (cmd, "lvm_remove_all") == 0 || strcasecmp (cmd, "lvm-remove-all") == 0)
369     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>.");
370   else
371   if (strcasecmp (cmd, "file") == 0)
372     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).");
373   else
374   if (strcasecmp (cmd, "command") == 0)
375     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 return value is anything printed to I<stdout> by\nthe command.\n\nIf the command returns a non-zero exit status, then\nthis function returns an error message.  The error message\nstring is the content of I<stderr> from the command.\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.\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.");
376   else
377   if (strcasecmp (cmd, "command_lines") == 0 || strcasecmp (cmd, "command-lines") == 0)
378     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.\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.");
379   else
380   if (strcasecmp (cmd, "stat") == 0)
381     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.");
382   else
383   if (strcasecmp (cmd, "lstat") == 0)
384     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.");
385   else
386   if (strcasecmp (cmd, "statvfs") == 0)
387     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.");
388   else
389   if (strcasecmp (cmd, "tune2fs_l") == 0 || strcasecmp (cmd, "tune2fs-l") == 0)
390     pod2text ("tune2fs-l - get ext2/ext3/ext4 superblock details", " tune2fs-l <device>\n\nThis returns the contents of the ext2, ext3 or ext4 filesystem\nsuperblock on 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.");
391   else
392   if (strcasecmp (cmd, "blockdev_setro") == 0 || strcasecmp (cmd, "blockdev-setro") == 0)
393     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.");
394   else
395   if (strcasecmp (cmd, "blockdev_setrw") == 0 || strcasecmp (cmd, "blockdev-setrw") == 0)
396     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.");
397   else
398   if (strcasecmp (cmd, "blockdev_getro") == 0 || strcasecmp (cmd, "blockdev-getro") == 0)
399     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.");
400   else
401   if (strcasecmp (cmd, "blockdev_getss") == 0 || strcasecmp (cmd, "blockdev-getss") == 0)
402     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.");
403   else
404   if (strcasecmp (cmd, "blockdev_getbsz") == 0 || strcasecmp (cmd, "blockdev-getbsz") == 0)
405     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.");
406   else
407   if (strcasecmp (cmd, "blockdev_setbsz") == 0 || strcasecmp (cmd, "blockdev-setbsz") == 0)
408     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.");
409   else
410   if (strcasecmp (cmd, "blockdev_getsz") == 0 || strcasecmp (cmd, "blockdev-getsz") == 0)
411     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.");
412   else
413   if (strcasecmp (cmd, "blockdev_getsize64") == 0 || strcasecmp (cmd, "blockdev-getsize64") == 0)
414     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.");
415   else
416   if (strcasecmp (cmd, "blockdev_flushbufs") == 0 || strcasecmp (cmd, "blockdev-flushbufs") == 0)
417     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.");
418   else
419   if (strcasecmp (cmd, "blockdev_rereadpt") == 0 || strcasecmp (cmd, "blockdev-rereadpt") == 0)
420     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.");
421   else
422   if (strcasecmp (cmd, "upload") == 0)
423     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>.");
424   else
425   if (strcasecmp (cmd, "download") == 0)
426     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>.");
427   else
428   if (strcasecmp (cmd, "checksum") == 0)
429     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.");
430   else
431   if (strcasecmp (cmd, "tar_in") == 0 || strcasecmp (cmd, "tar-in") == 0)
432     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>.");
433   else
434   if (strcasecmp (cmd, "tar_out") == 0 || strcasecmp (cmd, "tar-out") == 0)
435     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>.");
436   else
437   if (strcasecmp (cmd, "tgz_in") == 0 || strcasecmp (cmd, "tgz-in") == 0)
438     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>.");
439   else
440   if (strcasecmp (cmd, "tgz_out") == 0 || strcasecmp (cmd, "tgz-out") == 0)
441     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>.");
442   else
443   if (strcasecmp (cmd, "mount_ro") == 0 || strcasecmp (cmd, "mount-ro") == 0)
444     pod2text ("mount-ro - mount a guest disk, read-only", " mount-ro <device> <mountpoint>\n\nThis is the same as the C<mount> command, but it\nmounts the filesystem with the read-only (I<-o ro>) flag.");
445   else
446   if (strcasecmp (cmd, "mount_options") == 0 || strcasecmp (cmd, "mount-options") == 0)
447     pod2text ("mount-options - mount a guest disk with mount options", " mount-options <options> <device> <mountpoint>\n\nThis is the same as the C<mount> command, but it\nallows you to set the mount options as for the\nL<mount(8)> I<-o> flag.");
448   else
449   if (strcasecmp (cmd, "mount_vfs") == 0 || strcasecmp (cmd, "mount-vfs") == 0)
450     pod2text ("mount-vfs - mount a guest disk with mount options and vfstype", " mount-vfs <options> <vfstype> <device> <mountpoint>\n\nThis is the same as the C<mount> command, but it\nallows you to set both the mount options and the vfstype\nas for the L<mount(8)> I<-o> and I<-t> flags.");
451   else
452   if (strcasecmp (cmd, "debug") == 0)
453     pod2text ("debug - debugging and internals", " debug <subcmd> <extraargs>\n\nThe C<debug> command exposes some internals of\nC<guestfsd> (the guestfs daemon) that runs inside the\nqemu subprocess.\n\nThere is no comprehensive help for this command.  You have\nto look at the file C<daemon/debug.c> in the libguestfs source\nto find out what you can do.");
454   else
455   if (strcasecmp (cmd, "lvremove") == 0)
456     pod2text ("lvremove - remove an LVM logical volume", " lvremove <device>\n\nRemove an LVM logical volume C<device>, where C<device> is\nthe path to the LV, such as C</dev/VG/LV>.\n\nYou can also remove all LVs in a volume group by specifying\nthe VG name, C</dev/VG>.");
457   else
458   if (strcasecmp (cmd, "vgremove") == 0)
459     pod2text ("vgremove - remove an LVM volume group", " vgremove <vgname>\n\nRemove an LVM volume group C<vgname>, (for example C<VG>).\n\nThis also forcibly removes all logical volumes in the volume\ngroup (if any).");
460   else
461   if (strcasecmp (cmd, "pvremove") == 0)
462     pod2text ("pvremove - remove an LVM physical volume", " pvremove <device>\n\nThis wipes a physical volume C<device> so that LVM will no longer\nrecognise it.\n\nThe implementation uses the C<pvremove> command which refuses to\nwipe physical volumes that contain any volume groups, so you have\nto remove those first.");
463   else
464   if (strcasecmp (cmd, "set_e2label") == 0 || strcasecmp (cmd, "set-e2label") == 0)
465     pod2text ("set-e2label - set the ext2/3/4 filesystem label", " set-e2label <device> <label>\n\nThis sets the ext2/3/4 filesystem label of the filesystem on\nC<device> to C<label>.  Filesystem labels are limited to\n16 characters.\n\nYou can use either C<tune2fs_l> or C<get_e2label>\nto return the existing label on a filesystem.");
466   else
467   if (strcasecmp (cmd, "get_e2label") == 0 || strcasecmp (cmd, "get-e2label") == 0)
468     pod2text ("get-e2label - get the ext2/3/4 filesystem label", " get-e2label <device>\n\nThis returns the ext2/3/4 filesystem label of the filesystem on\nC<device>.");
469   else
470   if (strcasecmp (cmd, "set_e2uuid") == 0 || strcasecmp (cmd, "set-e2uuid") == 0)
471     pod2text ("set-e2uuid - set the ext2/3/4 filesystem UUID", " set-e2uuid <device> <uuid>\n\nThis sets the ext2/3/4 filesystem UUID of the filesystem on\nC<device> to C<uuid>.  The format of the UUID and alternatives\nsuch as C<clear>, C<random> and C<time> are described in the\nL<tune2fs(8)> manpage.\n\nYou can use either C<tune2fs_l> or C<get_e2uuid>\nto return the existing UUID of a filesystem.");
472   else
473   if (strcasecmp (cmd, "get_e2uuid") == 0 || strcasecmp (cmd, "get-e2uuid") == 0)
474     pod2text ("get-e2uuid - get the ext2/3/4 filesystem UUID", " get-e2uuid <device>\n\nThis returns the ext2/3/4 filesystem UUID of the filesystem on\nC<device>.");
475   else
476   if (strcasecmp (cmd, "fsck") == 0)
477     pod2text ("fsck - run the filesystem checker", " fsck <fstype> <device>\n\nThis runs the filesystem checker (fsck) on C<device> which\nshould have filesystem type C<fstype>.\n\nThe returned integer is the status.  See L<fsck(8)> for the\nlist of status codes from C<fsck>.\n\nNotes:\n\n=over 4\n\n=item *\n\nMultiple status codes can be summed together.\n\n=item *\n\nA non-zero return code can mean \"success\", for example if\nerrors have been corrected on the filesystem.\n\n=item *\n\nChecking or repairing NTFS volumes is not supported\n(by linux-ntfs).\n\n=back\n\nThis command is entirely equivalent to running C<fsck -a -t fstype device>.");
478   else
479   if (strcasecmp (cmd, "zero") == 0)
480     pod2text ("zero - write zeroes to the device", " zero <device>\n\nThis command writes zeroes over the first few blocks of C<device>.\n\nHow many blocks are zeroed isn't specified (but it's I<not> enough\nto securely wipe the device).  It should be sufficient to remove\nany partition tables, filesystem superblocks and so on.");
481   else
482   if (strcasecmp (cmd, "grub_install") == 0 || strcasecmp (cmd, "grub-install") == 0)
483     pod2text ("grub-install - install GRUB", " grub-install <root> <device>\n\nThis command installs GRUB (the Grand Unified Bootloader) on\nC<device>, with the root directory being C<root>.");
484   else
485   if (strcasecmp (cmd, "cp") == 0)
486     pod2text ("cp - copy a file", " cp <src> <dest>\n\nThis copies a file from C<src> to C<dest> where C<dest> is\neither a destination filename or destination directory.");
487   else
488   if (strcasecmp (cmd, "cp_a") == 0 || strcasecmp (cmd, "cp-a") == 0)
489     pod2text ("cp-a - copy a file or directory recursively", " cp-a <src> <dest>\n\nThis copies a file or directory from C<src> to C<dest>\nrecursively using the C<cp -a> command.");
490   else
491   if (strcasecmp (cmd, "mv") == 0)
492     pod2text ("mv - move a file", " mv <src> <dest>\n\nThis moves a file from C<src> to C<dest> where C<dest> is\neither a destination filename or destination directory.");
493   else
494   if (strcasecmp (cmd, "drop_caches") == 0 || strcasecmp (cmd, "drop-caches") == 0)
495     pod2text ("drop-caches - drop kernel page cache, dentries and inodes", " drop-caches <whattodrop>\n\nThis instructs the guest kernel to drop its page cache,\nand/or dentries and inode caches.  The parameter C<whattodrop>\ntells the kernel what precisely to drop, see\nL<http://linux-mm.org/Drop_Caches>\n\nSetting C<whattodrop> to 3 should drop everything.\n\nThis automatically calls L<sync(2)> before the operation,\nso that the maximum guest memory is freed.");
496   else
497   if (strcasecmp (cmd, "dmesg") == 0)
498     pod2text ("dmesg - return kernel messages", " dmesg\n\nThis returns the kernel messages (C<dmesg> output) from\nthe guest kernel.  This is sometimes useful for extended\ndebugging of problems.\n\nAnother way to get the same information is to enable\nverbose messages with C<set_verbose> or by setting\nthe environment variable C<LIBGUESTFS_DEBUG=1> before\nrunning the program.");
499   else
500   if (strcasecmp (cmd, "ping_daemon") == 0 || strcasecmp (cmd, "ping-daemon") == 0)
501     pod2text ("ping-daemon - ping the guest daemon", " ping-daemon\n\nThis is a test probe into the guestfs daemon running inside\nthe qemu subprocess.  Calling this function checks that the\ndaemon responds to the ping message, without affecting the daemon\nor attached block device(s) in any other way.");
502   else
503   if (strcasecmp (cmd, "equal") == 0)
504     pod2text ("equal - test if two files have equal contents", " equal <file1> <file2>\n\nThis compares the two files C<file1> and C<file2> and returns\ntrue if their content is exactly equal, or false otherwise.\n\nThe external L<cmp(1)> program is used for the comparison.");
505   else
506   if (strcasecmp (cmd, "strings") == 0)
507     pod2text ("strings - print the printable strings in a file", " strings <path>\n\nThis runs the L<strings(1)> command on a file and returns\nthe list of printable strings found.\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.");
508   else
509   if (strcasecmp (cmd, "strings_e") == 0 || strcasecmp (cmd, "strings-e") == 0)
510     pod2text ("strings-e - print the printable strings in a file", " strings-e <encoding> <path>\n\nThis is like the C<strings> command, but allows you to\nspecify the encoding.\n\nSee the L<strings(1)> manpage for the full list of encodings.\n\nCommonly useful encodings are C<l> (lower case L) which will\nshow strings inside Windows/x86 files.\n\nThe returned strings are transcoded to UTF-8.\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.");
511   else
512   if (strcasecmp (cmd, "hexdump") == 0)
513     pod2text ("hexdump - dump a file in hexadecimal", " hexdump <path>\n\nThis runs C<hexdump -C> on the given C<path>.  The result is\nthe human-readable, canonical hex dump of the file.\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.");
514   else
515   if (strcasecmp (cmd, "zerofree") == 0)
516     pod2text ("zerofree - zero unused inodes and disk blocks on ext2/3 filesystem", " zerofree <device>\n\nThis runs the I<zerofree> program on C<device>.  This program\nclaims to zero unused inodes and disk blocks on an ext2/3\nfilesystem, thus making it possible to compress the filesystem\nmore effectively.\n\nYou should B<not> run this program if the filesystem is\nmounted.\n\nIt is possible that using this program can damage the filesystem\nor data on the filesystem.");
517   else
518   if (strcasecmp (cmd, "pvresize") == 0)
519     pod2text ("pvresize - resize an LVM physical volume", " pvresize <device>\n\nThis resizes (expands or shrinks) an existing LVM physical\nvolume to match the new size of the underlying device.");
520   else
521   if (strcasecmp (cmd, "sfdisk_N") == 0 || strcasecmp (cmd, "sfdisk-N") == 0)
522     pod2text ("sfdisk-N - modify a single partition on a block device", " sfdisk-N <device> <n> <cyls> <heads> <sectors> <line>\n\nThis runs L<sfdisk(8)> option to modify just the single\npartition C<n> (note: C<n> counts from 1).\n\nFor other parameters, see C<sfdisk>.  You should usually\npass C<0> for the cyls/heads/sectors parameters.\n\nB<This command is dangerous.  Without careful use you\ncan easily destroy all your data>.");
523   else
524   if (strcasecmp (cmd, "sfdisk_l") == 0 || strcasecmp (cmd, "sfdisk-l") == 0)
525     pod2text ("sfdisk-l - display the partition table", " sfdisk-l <device>\n\nThis displays the partition table on C<device>, in the\nhuman-readable output of the L<sfdisk(8)> command.  It is\nnot intended to be parsed.");
526   else
527   if (strcasecmp (cmd, "sfdisk_kernel_geometry") == 0 || strcasecmp (cmd, "sfdisk-kernel-geometry") == 0)
528     pod2text ("sfdisk-kernel-geometry - display the kernel geometry", " sfdisk-kernel-geometry <device>\n\nThis displays the kernel's idea of the geometry of C<device>.\n\nThe result is in human-readable format, and not designed to\nbe parsed.");
529   else
530   if (strcasecmp (cmd, "sfdisk_disk_geometry") == 0 || strcasecmp (cmd, "sfdisk-disk-geometry") == 0)
531     pod2text ("sfdisk-disk-geometry - display the disk geometry from the partition table", " sfdisk-disk-geometry <device>\n\nThis displays the disk geometry of C<device> read from the\npartition table.  Especially in the case where the underlying\nblock device has been resized, this can be different from the\nkernel's idea of the geometry (see C<sfdisk_kernel_geometry>).\n\nThe result is in human-readable format, and not designed to\nbe parsed.");
532   else
533   if (strcasecmp (cmd, "vg_activate_all") == 0 || strcasecmp (cmd, "vg-activate-all") == 0)
534     pod2text ("vg-activate-all - activate or deactivate all volume groups", " vg-activate-all <activate>\n\nThis command activates or (if C<activate> is false) deactivates\nall logical volumes in all volume groups.\nIf activated, then they are made known to the\nkernel, ie. they appear as C</dev/mapper> devices.  If deactivated,\nthen those devices disappear.\n\nThis command is the same as running C<vgchange -a y|n>");
535   else
536   if (strcasecmp (cmd, "vg_activate") == 0 || strcasecmp (cmd, "vg-activate") == 0)
537     pod2text ("vg-activate - activate or deactivate some volume groups", " vg-activate <activate> <volgroups>\n\nThis command activates or (if C<activate> is false) deactivates\nall logical volumes in the listed volume groups C<volgroups>.\nIf activated, then they are made known to the\nkernel, ie. they appear as C</dev/mapper> devices.  If deactivated,\nthen those devices disappear.\n\nThis command is the same as running C<vgchange -a y|n volgroups...>\n\nNote that if C<volgroups> is an empty list then B<all> volume groups\nare activated or deactivated.");
538   else
539   if (strcasecmp (cmd, "lvresize") == 0)
540     pod2text ("lvresize - resize an LVM logical volume", " lvresize <device> <mbytes>\n\nThis resizes (expands or shrinks) an existing LVM logical\nvolume to C<mbytes>.  When reducing, data in the reduced part\nis lost.");
541   else
542   if (strcasecmp (cmd, "resize2fs") == 0)
543     pod2text ("resize2fs - resize an ext2/ext3 filesystem", " resize2fs <device>\n\nThis resizes an ext2 or ext3 filesystem to match the size of\nthe underlying device.\n\nI<Note:> It is sometimes required that you run C<e2fsck_f>\non the C<device> before calling this command.  For unknown reasons\nC<resize2fs> sometimes gives an error about this and sometimes not.\nIn any case, it is always safe to call C<e2fsck_f> before\ncalling this function.");
544   else
545   if (strcasecmp (cmd, "find") == 0)
546     pod2text ("find - find all files and directories", " find <directory>\n\nThis command lists out all files and directories, recursively,\nstarting at C<directory>.  It is essentially equivalent to\nrunning the shell command C<find directory -print> but some\npost-processing happens on the output, described below.\n\nThis returns a list of strings I<without any prefix>.  Thus\nif the directory structure was:\n\n /tmp/a\n /tmp/b\n /tmp/c/d\n\nthen the returned list from C<find> C</tmp> would be\n4 elements:\n\n a\n b\n c\n c/d\n\nIf C<directory> is not a directory, then this command returns\nan error.\n\nThe returned list is sorted.");
547   else
548   if (strcasecmp (cmd, "e2fsck_f") == 0 || strcasecmp (cmd, "e2fsck-f") == 0)
549     pod2text ("e2fsck-f - check an ext2/ext3 filesystem", " e2fsck-f <device>\n\nThis runs C<e2fsck -p -f device>, ie. runs the ext2/ext3\nfilesystem checker on C<device>, noninteractively (C<-p>),\neven if the filesystem appears to be clean (C<-f>).\n\nThis command is only needed because of C<resize2fs>\n(q.v.).  Normally you should use C<fsck>.");
550   else
551     display_builtin_command (cmd);
552 }
553
554 static void print_pv (struct guestfs_lvm_pv *pv)
555 {
556   int i;
557
558   printf ("pv_name: %s\n", pv->pv_name);
559   printf ("pv_uuid: ");
560   for (i = 0; i < 32; ++i)
561     printf ("%c", pv->pv_uuid[i]);
562   printf ("\n");
563   printf ("pv_fmt: %s\n", pv->pv_fmt);
564   printf ("pv_size: %" PRIu64 "\n", pv->pv_size);
565   printf ("dev_size: %" PRIu64 "\n", pv->dev_size);
566   printf ("pv_free: %" PRIu64 "\n", pv->pv_free);
567   printf ("pv_used: %" PRIu64 "\n", pv->pv_used);
568   printf ("pv_attr: %s\n", pv->pv_attr);
569   printf ("pv_pe_count: %" PRIi64 "\n", pv->pv_pe_count);
570   printf ("pv_pe_alloc_count: %" PRIi64 "\n", pv->pv_pe_alloc_count);
571   printf ("pv_tags: %s\n", pv->pv_tags);
572   printf ("pe_start: %" PRIu64 "\n", pv->pe_start);
573   printf ("pv_mda_count: %" PRIi64 "\n", pv->pv_mda_count);
574   printf ("pv_mda_free: %" PRIu64 "\n", pv->pv_mda_free);
575 }
576
577 static void print_pv_list (struct guestfs_lvm_pv_list *pvs)
578 {
579   int i;
580
581   for (i = 0; i < pvs->len; ++i)
582     print_pv (&pvs->val[i]);
583 }
584
585 static void print_vg (struct guestfs_lvm_vg *vg)
586 {
587   int i;
588
589   printf ("vg_name: %s\n", vg->vg_name);
590   printf ("vg_uuid: ");
591   for (i = 0; i < 32; ++i)
592     printf ("%c", vg->vg_uuid[i]);
593   printf ("\n");
594   printf ("vg_fmt: %s\n", vg->vg_fmt);
595   printf ("vg_attr: %s\n", vg->vg_attr);
596   printf ("vg_size: %" PRIu64 "\n", vg->vg_size);
597   printf ("vg_free: %" PRIu64 "\n", vg->vg_free);
598   printf ("vg_sysid: %s\n", vg->vg_sysid);
599   printf ("vg_extent_size: %" PRIu64 "\n", vg->vg_extent_size);
600   printf ("vg_extent_count: %" PRIi64 "\n", vg->vg_extent_count);
601   printf ("vg_free_count: %" PRIi64 "\n", vg->vg_free_count);
602   printf ("max_lv: %" PRIi64 "\n", vg->max_lv);
603   printf ("max_pv: %" PRIi64 "\n", vg->max_pv);
604   printf ("pv_count: %" PRIi64 "\n", vg->pv_count);
605   printf ("lv_count: %" PRIi64 "\n", vg->lv_count);
606   printf ("snap_count: %" PRIi64 "\n", vg->snap_count);
607   printf ("vg_seqno: %" PRIi64 "\n", vg->vg_seqno);
608   printf ("vg_tags: %s\n", vg->vg_tags);
609   printf ("vg_mda_count: %" PRIi64 "\n", vg->vg_mda_count);
610   printf ("vg_mda_free: %" PRIu64 "\n", vg->vg_mda_free);
611 }
612
613 static void print_vg_list (struct guestfs_lvm_vg_list *vgs)
614 {
615   int i;
616
617   for (i = 0; i < vgs->len; ++i)
618     print_vg (&vgs->val[i]);
619 }
620
621 static void print_lv (struct guestfs_lvm_lv *lv)
622 {
623   int i;
624
625   printf ("lv_name: %s\n", lv->lv_name);
626   printf ("lv_uuid: ");
627   for (i = 0; i < 32; ++i)
628     printf ("%c", lv->lv_uuid[i]);
629   printf ("\n");
630   printf ("lv_attr: %s\n", lv->lv_attr);
631   printf ("lv_major: %" PRIi64 "\n", lv->lv_major);
632   printf ("lv_minor: %" PRIi64 "\n", lv->lv_minor);
633   printf ("lv_kernel_major: %" PRIi64 "\n", lv->lv_kernel_major);
634   printf ("lv_kernel_minor: %" PRIi64 "\n", lv->lv_kernel_minor);
635   printf ("lv_size: %" PRIu64 "\n", lv->lv_size);
636   printf ("seg_count: %" PRIi64 "\n", lv->seg_count);
637   printf ("origin: %s\n", lv->origin);
638   if (lv->snap_percent >= 0) printf ("snap_percent: %g %%\n", lv->snap_percent);
639   else printf ("snap_percent: \n");
640   if (lv->copy_percent >= 0) printf ("copy_percent: %g %%\n", lv->copy_percent);
641   else printf ("copy_percent: \n");
642   printf ("move_pv: %s\n", lv->move_pv);
643   printf ("lv_tags: %s\n", lv->lv_tags);
644   printf ("mirror_log: %s\n", lv->mirror_log);
645   printf ("modules: %s\n", lv->modules);
646 }
647
648 static void print_lv_list (struct guestfs_lvm_lv_list *lvs)
649 {
650   int i;
651
652   for (i = 0; i < lvs->len; ++i)
653     print_lv (&lvs->val[i]);
654 }
655
656 static void print_stat (struct guestfs_stat *stat)
657 {
658   printf ("dev: %" PRIi64 "\n", stat->dev);
659   printf ("ino: %" PRIi64 "\n", stat->ino);
660   printf ("mode: %" PRIi64 "\n", stat->mode);
661   printf ("nlink: %" PRIi64 "\n", stat->nlink);
662   printf ("uid: %" PRIi64 "\n", stat->uid);
663   printf ("gid: %" PRIi64 "\n", stat->gid);
664   printf ("rdev: %" PRIi64 "\n", stat->rdev);
665   printf ("size: %" PRIi64 "\n", stat->size);
666   printf ("blksize: %" PRIi64 "\n", stat->blksize);
667   printf ("blocks: %" PRIi64 "\n", stat->blocks);
668   printf ("atime: %" PRIi64 "\n", stat->atime);
669   printf ("mtime: %" PRIi64 "\n", stat->mtime);
670   printf ("ctime: %" PRIi64 "\n", stat->ctime);
671 }
672
673 static void print_statvfs (struct guestfs_statvfs *statvfs)
674 {
675   printf ("bsize: %" PRIi64 "\n", statvfs->bsize);
676   printf ("frsize: %" PRIi64 "\n", statvfs->frsize);
677   printf ("blocks: %" PRIi64 "\n", statvfs->blocks);
678   printf ("bfree: %" PRIi64 "\n", statvfs->bfree);
679   printf ("bavail: %" PRIi64 "\n", statvfs->bavail);
680   printf ("files: %" PRIi64 "\n", statvfs->files);
681   printf ("ffree: %" PRIi64 "\n", statvfs->ffree);
682   printf ("favail: %" PRIi64 "\n", statvfs->favail);
683   printf ("fsid: %" PRIi64 "\n", statvfs->fsid);
684   printf ("flag: %" PRIi64 "\n", statvfs->flag);
685   printf ("namemax: %" PRIi64 "\n", statvfs->namemax);
686 }
687
688 static int run_launch (const char *cmd, int argc, char *argv[])
689 {
690   int r;
691   if (argc != 0) {
692     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
693     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
694     return -1;
695   }
696   r = launch (g);
697   return r;
698 }
699
700 static int run_kill_subprocess (const char *cmd, int argc, char *argv[])
701 {
702   int r;
703   if (argc != 0) {
704     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
705     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
706     return -1;
707   }
708   r = guestfs_kill_subprocess (g);
709   return r;
710 }
711
712 static int run_add_drive (const char *cmd, int argc, char *argv[])
713 {
714   int r;
715   const char *filename;
716   if (argc != 1) {
717     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
718     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
719     return -1;
720   }
721   filename = argv[0];
722   r = guestfs_add_drive (g, filename);
723   return r;
724 }
725
726 static int run_add_cdrom (const char *cmd, int argc, char *argv[])
727 {
728   int r;
729   const char *filename;
730   if (argc != 1) {
731     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
732     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
733     return -1;
734   }
735   filename = argv[0];
736   r = guestfs_add_cdrom (g, filename);
737   return r;
738 }
739
740 static int run_config (const char *cmd, int argc, char *argv[])
741 {
742   int r;
743   const char *qemuparam;
744   const char *qemuvalue;
745   if (argc != 2) {
746     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
747     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
748     return -1;
749   }
750   qemuparam = argv[0];
751   qemuvalue = strcmp (argv[1], "") != 0 ? argv[1] : NULL;
752   r = guestfs_config (g, qemuparam, qemuvalue);
753   return r;
754 }
755
756 static int run_set_qemu (const char *cmd, int argc, char *argv[])
757 {
758   int r;
759   const char *qemu;
760   if (argc != 1) {
761     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
762     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
763     return -1;
764   }
765   qemu = argv[0];
766   r = guestfs_set_qemu (g, qemu);
767   return r;
768 }
769
770 static int run_get_qemu (const char *cmd, int argc, char *argv[])
771 {
772   const char *r;
773   if (argc != 0) {
774     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
775     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
776     return -1;
777   }
778   r = guestfs_get_qemu (g);
779   if (r == NULL) return -1;
780   printf ("%s\n", r);
781   return 0;
782 }
783
784 static int run_set_path (const char *cmd, int argc, char *argv[])
785 {
786   int r;
787   const char *path;
788   if (argc != 1) {
789     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
790     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
791     return -1;
792   }
793   path = argv[0];
794   r = guestfs_set_path (g, path);
795   return r;
796 }
797
798 static int run_get_path (const char *cmd, int argc, char *argv[])
799 {
800   const char *r;
801   if (argc != 0) {
802     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
803     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
804     return -1;
805   }
806   r = guestfs_get_path (g);
807   if (r == NULL) return -1;
808   printf ("%s\n", r);
809   return 0;
810 }
811
812 static int run_set_append (const char *cmd, int argc, char *argv[])
813 {
814   int r;
815   const char *append;
816   if (argc != 1) {
817     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
818     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
819     return -1;
820   }
821   append = argv[0];
822   r = guestfs_set_append (g, append);
823   return r;
824 }
825
826 static int run_get_append (const char *cmd, int argc, char *argv[])
827 {
828   const char *r;
829   if (argc != 0) {
830     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
831     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
832     return -1;
833   }
834   r = guestfs_get_append (g);
835   if (r == NULL) return -1;
836   printf ("%s\n", r);
837   return 0;
838 }
839
840 static int run_set_autosync (const char *cmd, int argc, char *argv[])
841 {
842   int r;
843   int autosync;
844   if (argc != 1) {
845     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
846     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
847     return -1;
848   }
849   autosync = is_true (argv[0]) ? 1 : 0;
850   r = guestfs_set_autosync (g, autosync);
851   return r;
852 }
853
854 static int run_get_autosync (const char *cmd, int argc, char *argv[])
855 {
856   int r;
857   if (argc != 0) {
858     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
859     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
860     return -1;
861   }
862   r = guestfs_get_autosync (g);
863   if (r == -1) return -1;
864   if (r) printf ("true\n"); else printf ("false\n");
865   return 0;
866 }
867
868 static int run_set_verbose (const char *cmd, int argc, char *argv[])
869 {
870   int r;
871   int verbose;
872   if (argc != 1) {
873     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
874     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
875     return -1;
876   }
877   verbose = is_true (argv[0]) ? 1 : 0;
878   r = guestfs_set_verbose (g, verbose);
879   return r;
880 }
881
882 static int run_get_verbose (const char *cmd, int argc, char *argv[])
883 {
884   int r;
885   if (argc != 0) {
886     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
887     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
888     return -1;
889   }
890   r = guestfs_get_verbose (g);
891   if (r == -1) return -1;
892   if (r) printf ("true\n"); else printf ("false\n");
893   return 0;
894 }
895
896 static int run_is_ready (const char *cmd, int argc, char *argv[])
897 {
898   int r;
899   if (argc != 0) {
900     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
901     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
902     return -1;
903   }
904   r = guestfs_is_ready (g);
905   if (r == -1) return -1;
906   if (r) printf ("true\n"); else printf ("false\n");
907   return 0;
908 }
909
910 static int run_is_config (const char *cmd, int argc, char *argv[])
911 {
912   int r;
913   if (argc != 0) {
914     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
915     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
916     return -1;
917   }
918   r = guestfs_is_config (g);
919   if (r == -1) return -1;
920   if (r) printf ("true\n"); else printf ("false\n");
921   return 0;
922 }
923
924 static int run_is_launching (const char *cmd, int argc, char *argv[])
925 {
926   int 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_is_launching (g);
933   if (r == -1) return -1;
934   if (r) printf ("true\n"); else printf ("false\n");
935   return 0;
936 }
937
938 static int run_is_busy (const char *cmd, int argc, char *argv[])
939 {
940   int r;
941   if (argc != 0) {
942     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
943     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
944     return -1;
945   }
946   r = guestfs_is_busy (g);
947   if (r == -1) return -1;
948   if (r) printf ("true\n"); else printf ("false\n");
949   return 0;
950 }
951
952 static int run_get_state (const char *cmd, int argc, char *argv[])
953 {
954   int r;
955   if (argc != 0) {
956     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
957     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
958     return -1;
959   }
960   r = guestfs_get_state (g);
961   if (r == -1) return -1;
962   printf ("%d\n", r);
963   return 0;
964 }
965
966 static int run_mount (const char *cmd, int argc, char *argv[])
967 {
968   int r;
969   const char *device;
970   const char *mountpoint;
971   if (argc != 2) {
972     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
973     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
974     return -1;
975   }
976   device = argv[0];
977   mountpoint = argv[1];
978   r = guestfs_mount (g, device, mountpoint);
979   return r;
980 }
981
982 static int run_sync (const char *cmd, int argc, char *argv[])
983 {
984   int r;
985   if (argc != 0) {
986     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
987     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
988     return -1;
989   }
990   r = guestfs_sync (g);
991   return r;
992 }
993
994 static int run_touch (const char *cmd, int argc, char *argv[])
995 {
996   int r;
997   const char *path;
998   if (argc != 1) {
999     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1000     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1001     return -1;
1002   }
1003   path = argv[0];
1004   r = guestfs_touch (g, path);
1005   return r;
1006 }
1007
1008 static int run_cat (const char *cmd, int argc, char *argv[])
1009 {
1010   char *r;
1011   const char *path;
1012   if (argc != 1) {
1013     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1014     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1015     return -1;
1016   }
1017   path = argv[0];
1018   r = guestfs_cat (g, path);
1019   if (r == NULL) return -1;
1020   printf ("%s\n", r);
1021   free (r);
1022   return 0;
1023 }
1024
1025 static int run_ll (const char *cmd, int argc, char *argv[])
1026 {
1027   char *r;
1028   const char *directory;
1029   if (argc != 1) {
1030     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1031     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1032     return -1;
1033   }
1034   directory = argv[0];
1035   r = guestfs_ll (g, directory);
1036   if (r == NULL) return -1;
1037   printf ("%s\n", r);
1038   free (r);
1039   return 0;
1040 }
1041
1042 static int run_ls (const char *cmd, int argc, char *argv[])
1043 {
1044   char **r;
1045   const char *directory;
1046   if (argc != 1) {
1047     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1048     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1049     return -1;
1050   }
1051   directory = argv[0];
1052   r = guestfs_ls (g, directory);
1053   if (r == NULL) return -1;
1054   print_strings (r);
1055   free_strings (r);
1056   return 0;
1057 }
1058
1059 static int run_list_devices (const char *cmd, int argc, char *argv[])
1060 {
1061   char **r;
1062   if (argc != 0) {
1063     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1064     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1065     return -1;
1066   }
1067   r = guestfs_list_devices (g);
1068   if (r == NULL) return -1;
1069   print_strings (r);
1070   free_strings (r);
1071   return 0;
1072 }
1073
1074 static int run_list_partitions (const char *cmd, int argc, char *argv[])
1075 {
1076   char **r;
1077   if (argc != 0) {
1078     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1079     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1080     return -1;
1081   }
1082   r = guestfs_list_partitions (g);
1083   if (r == NULL) return -1;
1084   print_strings (r);
1085   free_strings (r);
1086   return 0;
1087 }
1088
1089 static int run_pvs (const char *cmd, int argc, char *argv[])
1090 {
1091   char **r;
1092   if (argc != 0) {
1093     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1094     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1095     return -1;
1096   }
1097   r = guestfs_pvs (g);
1098   if (r == NULL) return -1;
1099   print_strings (r);
1100   free_strings (r);
1101   return 0;
1102 }
1103
1104 static int run_vgs (const char *cmd, int argc, char *argv[])
1105 {
1106   char **r;
1107   if (argc != 0) {
1108     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1109     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1110     return -1;
1111   }
1112   r = guestfs_vgs (g);
1113   if (r == NULL) return -1;
1114   print_strings (r);
1115   free_strings (r);
1116   return 0;
1117 }
1118
1119 static int run_lvs (const char *cmd, int argc, char *argv[])
1120 {
1121   char **r;
1122   if (argc != 0) {
1123     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1124     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1125     return -1;
1126   }
1127   r = guestfs_lvs (g);
1128   if (r == NULL) return -1;
1129   print_strings (r);
1130   free_strings (r);
1131   return 0;
1132 }
1133
1134 static int run_pvs_full (const char *cmd, int argc, char *argv[])
1135 {
1136   struct guestfs_lvm_pv_list *r;
1137   if (argc != 0) {
1138     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1139     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1140     return -1;
1141   }
1142   r = guestfs_pvs_full (g);
1143   if (r == NULL) return -1;
1144   print_pv_list (r);
1145   guestfs_free_lvm_pv_list (r);
1146   return 0;
1147 }
1148
1149 static int run_vgs_full (const char *cmd, int argc, char *argv[])
1150 {
1151   struct guestfs_lvm_vg_list *r;
1152   if (argc != 0) {
1153     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1154     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1155     return -1;
1156   }
1157   r = guestfs_vgs_full (g);
1158   if (r == NULL) return -1;
1159   print_vg_list (r);
1160   guestfs_free_lvm_vg_list (r);
1161   return 0;
1162 }
1163
1164 static int run_lvs_full (const char *cmd, int argc, char *argv[])
1165 {
1166   struct guestfs_lvm_lv_list *r;
1167   if (argc != 0) {
1168     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1169     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1170     return -1;
1171   }
1172   r = guestfs_lvs_full (g);
1173   if (r == NULL) return -1;
1174   print_lv_list (r);
1175   guestfs_free_lvm_lv_list (r);
1176   return 0;
1177 }
1178
1179 static int run_read_lines (const char *cmd, int argc, char *argv[])
1180 {
1181   char **r;
1182   const char *path;
1183   if (argc != 1) {
1184     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1185     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1186     return -1;
1187   }
1188   path = argv[0];
1189   r = guestfs_read_lines (g, path);
1190   if (r == NULL) return -1;
1191   print_strings (r);
1192   free_strings (r);
1193   return 0;
1194 }
1195
1196 static int run_aug_init (const char *cmd, int argc, char *argv[])
1197 {
1198   int r;
1199   const char *root;
1200   int flags;
1201   if (argc != 2) {
1202     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1203     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1204     return -1;
1205   }
1206   root = argv[0];
1207   flags = atoi (argv[1]);
1208   r = guestfs_aug_init (g, root, flags);
1209   return r;
1210 }
1211
1212 static int run_aug_close (const char *cmd, int argc, char *argv[])
1213 {
1214   int r;
1215   if (argc != 0) {
1216     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1217     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1218     return -1;
1219   }
1220   r = guestfs_aug_close (g);
1221   return r;
1222 }
1223
1224 static int run_aug_defvar (const char *cmd, int argc, char *argv[])
1225 {
1226   int r;
1227   const char *name;
1228   const char *expr;
1229   if (argc != 2) {
1230     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1231     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1232     return -1;
1233   }
1234   name = argv[0];
1235   expr = strcmp (argv[1], "") != 0 ? argv[1] : NULL;
1236   r = guestfs_aug_defvar (g, name, expr);
1237   if (r == -1) return -1;
1238   printf ("%d\n", r);
1239   return 0;
1240 }
1241
1242 static int run_aug_defnode (const char *cmd, int argc, char *argv[])
1243 {
1244   struct guestfs_int_bool *r;
1245   const char *name;
1246   const char *expr;
1247   const char *val;
1248   if (argc != 3) {
1249     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1250     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1251     return -1;
1252   }
1253   name = argv[0];
1254   expr = argv[1];
1255   val = argv[2];
1256   r = guestfs_aug_defnode (g, name, expr, val);
1257   if (r == NULL) return -1;
1258   printf ("%d, %s\n", r->i,
1259     r->b ? "true" : "false");
1260   guestfs_free_int_bool (r);
1261   return 0;
1262 }
1263
1264 static int run_aug_get (const char *cmd, int argc, char *argv[])
1265 {
1266   char *r;
1267   const char *path;
1268   if (argc != 1) {
1269     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1270     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1271     return -1;
1272   }
1273   path = argv[0];
1274   r = guestfs_aug_get (g, path);
1275   if (r == NULL) return -1;
1276   printf ("%s\n", r);
1277   free (r);
1278   return 0;
1279 }
1280
1281 static int run_aug_set (const char *cmd, int argc, char *argv[])
1282 {
1283   int r;
1284   const char *path;
1285   const char *val;
1286   if (argc != 2) {
1287     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1288     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1289     return -1;
1290   }
1291   path = argv[0];
1292   val = argv[1];
1293   r = guestfs_aug_set (g, path, val);
1294   return r;
1295 }
1296
1297 static int run_aug_insert (const char *cmd, int argc, char *argv[])
1298 {
1299   int r;
1300   const char *path;
1301   const char *label;
1302   int before;
1303   if (argc != 3) {
1304     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1305     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1306     return -1;
1307   }
1308   path = argv[0];
1309   label = argv[1];
1310   before = is_true (argv[2]) ? 1 : 0;
1311   r = guestfs_aug_insert (g, path, label, before);
1312   return r;
1313 }
1314
1315 static int run_aug_rm (const char *cmd, int argc, char *argv[])
1316 {
1317   int r;
1318   const char *path;
1319   if (argc != 1) {
1320     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1321     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1322     return -1;
1323   }
1324   path = argv[0];
1325   r = guestfs_aug_rm (g, path);
1326   if (r == -1) return -1;
1327   printf ("%d\n", r);
1328   return 0;
1329 }
1330
1331 static int run_aug_mv (const char *cmd, int argc, char *argv[])
1332 {
1333   int r;
1334   const char *src;
1335   const char *dest;
1336   if (argc != 2) {
1337     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1338     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1339     return -1;
1340   }
1341   src = argv[0];
1342   dest = argv[1];
1343   r = guestfs_aug_mv (g, src, dest);
1344   return r;
1345 }
1346
1347 static int run_aug_match (const char *cmd, int argc, char *argv[])
1348 {
1349   char **r;
1350   const char *path;
1351   if (argc != 1) {
1352     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1353     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1354     return -1;
1355   }
1356   path = argv[0];
1357   r = guestfs_aug_match (g, path);
1358   if (r == NULL) return -1;
1359   print_strings (r);
1360   free_strings (r);
1361   return 0;
1362 }
1363
1364 static int run_aug_save (const char *cmd, int argc, char *argv[])
1365 {
1366   int r;
1367   if (argc != 0) {
1368     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1369     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1370     return -1;
1371   }
1372   r = guestfs_aug_save (g);
1373   return r;
1374 }
1375
1376 static int run_aug_load (const char *cmd, int argc, char *argv[])
1377 {
1378   int r;
1379   if (argc != 0) {
1380     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1381     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1382     return -1;
1383   }
1384   r = guestfs_aug_load (g);
1385   return r;
1386 }
1387
1388 static int run_aug_ls (const char *cmd, int argc, char *argv[])
1389 {
1390   char **r;
1391   const char *path;
1392   if (argc != 1) {
1393     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1394     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1395     return -1;
1396   }
1397   path = argv[0];
1398   r = guestfs_aug_ls (g, path);
1399   if (r == NULL) return -1;
1400   print_strings (r);
1401   free_strings (r);
1402   return 0;
1403 }
1404
1405 static int run_rm (const char *cmd, int argc, char *argv[])
1406 {
1407   int r;
1408   const char *path;
1409   if (argc != 1) {
1410     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1411     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1412     return -1;
1413   }
1414   path = argv[0];
1415   r = guestfs_rm (g, path);
1416   return r;
1417 }
1418
1419 static int run_rmdir (const char *cmd, int argc, char *argv[])
1420 {
1421   int r;
1422   const char *path;
1423   if (argc != 1) {
1424     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1425     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1426     return -1;
1427   }
1428   path = argv[0];
1429   r = guestfs_rmdir (g, path);
1430   return r;
1431 }
1432
1433 static int run_rm_rf (const char *cmd, int argc, char *argv[])
1434 {
1435   int r;
1436   const char *path;
1437   if (argc != 1) {
1438     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1439     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1440     return -1;
1441   }
1442   path = argv[0];
1443   r = guestfs_rm_rf (g, path);
1444   return r;
1445 }
1446
1447 static int run_mkdir (const char *cmd, int argc, char *argv[])
1448 {
1449   int r;
1450   const char *path;
1451   if (argc != 1) {
1452     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1453     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1454     return -1;
1455   }
1456   path = argv[0];
1457   r = guestfs_mkdir (g, path);
1458   return r;
1459 }
1460
1461 static int run_mkdir_p (const char *cmd, int argc, char *argv[])
1462 {
1463   int r;
1464   const char *path;
1465   if (argc != 1) {
1466     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1467     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1468     return -1;
1469   }
1470   path = argv[0];
1471   r = guestfs_mkdir_p (g, path);
1472   return r;
1473 }
1474
1475 static int run_chmod (const char *cmd, int argc, char *argv[])
1476 {
1477   int r;
1478   int mode;
1479   const char *path;
1480   if (argc != 2) {
1481     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1482     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1483     return -1;
1484   }
1485   mode = atoi (argv[0]);
1486   path = argv[1];
1487   r = guestfs_chmod (g, mode, path);
1488   return r;
1489 }
1490
1491 static int run_chown (const char *cmd, int argc, char *argv[])
1492 {
1493   int r;
1494   int owner;
1495   int group;
1496   const char *path;
1497   if (argc != 3) {
1498     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1499     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1500     return -1;
1501   }
1502   owner = atoi (argv[0]);
1503   group = atoi (argv[1]);
1504   path = argv[2];
1505   r = guestfs_chown (g, owner, group, path);
1506   return r;
1507 }
1508
1509 static int run_exists (const char *cmd, int argc, char *argv[])
1510 {
1511   int r;
1512   const char *path;
1513   if (argc != 1) {
1514     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1515     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1516     return -1;
1517   }
1518   path = argv[0];
1519   r = guestfs_exists (g, path);
1520   if (r == -1) return -1;
1521   if (r) printf ("true\n"); else printf ("false\n");
1522   return 0;
1523 }
1524
1525 static int run_is_file (const char *cmd, int argc, char *argv[])
1526 {
1527   int r;
1528   const char *path;
1529   if (argc != 1) {
1530     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1531     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1532     return -1;
1533   }
1534   path = argv[0];
1535   r = guestfs_is_file (g, path);
1536   if (r == -1) return -1;
1537   if (r) printf ("true\n"); else printf ("false\n");
1538   return 0;
1539 }
1540
1541 static int run_is_dir (const char *cmd, int argc, char *argv[])
1542 {
1543   int r;
1544   const char *path;
1545   if (argc != 1) {
1546     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1547     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1548     return -1;
1549   }
1550   path = argv[0];
1551   r = guestfs_is_dir (g, path);
1552   if (r == -1) return -1;
1553   if (r) printf ("true\n"); else printf ("false\n");
1554   return 0;
1555 }
1556
1557 static int run_pvcreate (const char *cmd, int argc, char *argv[])
1558 {
1559   int r;
1560   const char *device;
1561   if (argc != 1) {
1562     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1563     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1564     return -1;
1565   }
1566   device = argv[0];
1567   r = guestfs_pvcreate (g, device);
1568   return r;
1569 }
1570
1571 static int run_vgcreate (const char *cmd, int argc, char *argv[])
1572 {
1573   int r;
1574   const char *volgroup;
1575   char **physvols;
1576   if (argc != 2) {
1577     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1578     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1579     return -1;
1580   }
1581   volgroup = argv[0];
1582   physvols = parse_string_list (argv[1]);
1583   r = guestfs_vgcreate (g, volgroup, physvols);
1584   return r;
1585 }
1586
1587 static int run_lvcreate (const char *cmd, int argc, char *argv[])
1588 {
1589   int r;
1590   const char *logvol;
1591   const char *volgroup;
1592   int mbytes;
1593   if (argc != 3) {
1594     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1595     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1596     return -1;
1597   }
1598   logvol = argv[0];
1599   volgroup = argv[1];
1600   mbytes = atoi (argv[2]);
1601   r = guestfs_lvcreate (g, logvol, volgroup, mbytes);
1602   return r;
1603 }
1604
1605 static int run_mkfs (const char *cmd, int argc, char *argv[])
1606 {
1607   int r;
1608   const char *fstype;
1609   const char *device;
1610   if (argc != 2) {
1611     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1612     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1613     return -1;
1614   }
1615   fstype = argv[0];
1616   device = argv[1];
1617   r = guestfs_mkfs (g, fstype, device);
1618   return r;
1619 }
1620
1621 static int run_sfdisk (const char *cmd, int argc, char *argv[])
1622 {
1623   int r;
1624   const char *device;
1625   int cyls;
1626   int heads;
1627   int sectors;
1628   char **lines;
1629   if (argc != 5) {
1630     fprintf (stderr, "%s should have 5 parameter(s)\n", cmd);
1631     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1632     return -1;
1633   }
1634   device = argv[0];
1635   cyls = atoi (argv[1]);
1636   heads = atoi (argv[2]);
1637   sectors = atoi (argv[3]);
1638   lines = parse_string_list (argv[4]);
1639   r = guestfs_sfdisk (g, device, cyls, heads, sectors, lines);
1640   return r;
1641 }
1642
1643 static int run_write_file (const char *cmd, int argc, char *argv[])
1644 {
1645   int r;
1646   const char *path;
1647   const char *content;
1648   int size;
1649   if (argc != 3) {
1650     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1651     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1652     return -1;
1653   }
1654   path = argv[0];
1655   content = argv[1];
1656   size = atoi (argv[2]);
1657   r = guestfs_write_file (g, path, content, size);
1658   return r;
1659 }
1660
1661 static int run_umount (const char *cmd, int argc, char *argv[])
1662 {
1663   int r;
1664   const char *pathordevice;
1665   if (argc != 1) {
1666     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1667     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1668     return -1;
1669   }
1670   pathordevice = argv[0];
1671   r = guestfs_umount (g, pathordevice);
1672   return r;
1673 }
1674
1675 static int run_mounts (const char *cmd, int argc, char *argv[])
1676 {
1677   char **r;
1678   if (argc != 0) {
1679     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1680     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1681     return -1;
1682   }
1683   r = guestfs_mounts (g);
1684   if (r == NULL) return -1;
1685   print_strings (r);
1686   free_strings (r);
1687   return 0;
1688 }
1689
1690 static int run_umount_all (const char *cmd, int argc, char *argv[])
1691 {
1692   int r;
1693   if (argc != 0) {
1694     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1695     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1696     return -1;
1697   }
1698   r = guestfs_umount_all (g);
1699   return r;
1700 }
1701
1702 static int run_lvm_remove_all (const char *cmd, int argc, char *argv[])
1703 {
1704   int r;
1705   if (argc != 0) {
1706     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1707     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1708     return -1;
1709   }
1710   r = guestfs_lvm_remove_all (g);
1711   return r;
1712 }
1713
1714 static int run_file (const char *cmd, int argc, char *argv[])
1715 {
1716   char *r;
1717   const char *path;
1718   if (argc != 1) {
1719     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1720     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1721     return -1;
1722   }
1723   path = argv[0];
1724   r = guestfs_file (g, path);
1725   if (r == NULL) return -1;
1726   printf ("%s\n", r);
1727   free (r);
1728   return 0;
1729 }
1730
1731 static int run_command (const char *cmd, int argc, char *argv[])
1732 {
1733   char *r;
1734   char **arguments;
1735   if (argc != 1) {
1736     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1737     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1738     return -1;
1739   }
1740   arguments = parse_string_list (argv[0]);
1741   r = guestfs_command (g, arguments);
1742   if (r == NULL) return -1;
1743   printf ("%s\n", r);
1744   free (r);
1745   return 0;
1746 }
1747
1748 static int run_command_lines (const char *cmd, int argc, char *argv[])
1749 {
1750   char **r;
1751   char **arguments;
1752   if (argc != 1) {
1753     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1754     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1755     return -1;
1756   }
1757   arguments = parse_string_list (argv[0]);
1758   r = guestfs_command_lines (g, arguments);
1759   if (r == NULL) return -1;
1760   print_strings (r);
1761   free_strings (r);
1762   return 0;
1763 }
1764
1765 static int run_stat (const char *cmd, int argc, char *argv[])
1766 {
1767   struct guestfs_stat *r;
1768   const char *path;
1769   if (argc != 1) {
1770     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1771     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1772     return -1;
1773   }
1774   path = argv[0];
1775   r = guestfs_stat (g, path);
1776   if (r == NULL) return -1;
1777   print_stat (r);
1778   free (r);
1779   return 0;
1780 }
1781
1782 static int run_lstat (const char *cmd, int argc, char *argv[])
1783 {
1784   struct guestfs_stat *r;
1785   const char *path;
1786   if (argc != 1) {
1787     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1788     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1789     return -1;
1790   }
1791   path = argv[0];
1792   r = guestfs_lstat (g, path);
1793   if (r == NULL) return -1;
1794   print_stat (r);
1795   free (r);
1796   return 0;
1797 }
1798
1799 static int run_statvfs (const char *cmd, int argc, char *argv[])
1800 {
1801   struct guestfs_statvfs *r;
1802   const char *path;
1803   if (argc != 1) {
1804     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1805     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1806     return -1;
1807   }
1808   path = argv[0];
1809   r = guestfs_statvfs (g, path);
1810   if (r == NULL) return -1;
1811   print_statvfs (r);
1812   free (r);
1813   return 0;
1814 }
1815
1816 static int run_tune2fs_l (const char *cmd, int argc, char *argv[])
1817 {
1818   char **r;
1819   const char *device;
1820   if (argc != 1) {
1821     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1822     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1823     return -1;
1824   }
1825   device = argv[0];
1826   r = guestfs_tune2fs_l (g, device);
1827   if (r == NULL) return -1;
1828   print_table (r);
1829   free_strings (r);
1830   return 0;
1831 }
1832
1833 static int run_blockdev_setro (const char *cmd, int argc, char *argv[])
1834 {
1835   int r;
1836   const char *device;
1837   if (argc != 1) {
1838     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1839     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1840     return -1;
1841   }
1842   device = argv[0];
1843   r = guestfs_blockdev_setro (g, device);
1844   return r;
1845 }
1846
1847 static int run_blockdev_setrw (const char *cmd, int argc, char *argv[])
1848 {
1849   int r;
1850   const char *device;
1851   if (argc != 1) {
1852     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1853     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1854     return -1;
1855   }
1856   device = argv[0];
1857   r = guestfs_blockdev_setrw (g, device);
1858   return r;
1859 }
1860
1861 static int run_blockdev_getro (const char *cmd, int argc, char *argv[])
1862 {
1863   int r;
1864   const char *device;
1865   if (argc != 1) {
1866     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1867     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1868     return -1;
1869   }
1870   device = argv[0];
1871   r = guestfs_blockdev_getro (g, device);
1872   if (r == -1) return -1;
1873   if (r) printf ("true\n"); else printf ("false\n");
1874   return 0;
1875 }
1876
1877 static int run_blockdev_getss (const char *cmd, int argc, char *argv[])
1878 {
1879   int r;
1880   const char *device;
1881   if (argc != 1) {
1882     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1883     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1884     return -1;
1885   }
1886   device = argv[0];
1887   r = guestfs_blockdev_getss (g, device);
1888   if (r == -1) return -1;
1889   printf ("%d\n", r);
1890   return 0;
1891 }
1892
1893 static int run_blockdev_getbsz (const char *cmd, int argc, char *argv[])
1894 {
1895   int r;
1896   const char *device;
1897   if (argc != 1) {
1898     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1899     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1900     return -1;
1901   }
1902   device = argv[0];
1903   r = guestfs_blockdev_getbsz (g, device);
1904   if (r == -1) return -1;
1905   printf ("%d\n", r);
1906   return 0;
1907 }
1908
1909 static int run_blockdev_setbsz (const char *cmd, int argc, char *argv[])
1910 {
1911   int r;
1912   const char *device;
1913   int blocksize;
1914   if (argc != 2) {
1915     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1916     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1917     return -1;
1918   }
1919   device = argv[0];
1920   blocksize = atoi (argv[1]);
1921   r = guestfs_blockdev_setbsz (g, device, blocksize);
1922   return r;
1923 }
1924
1925 static int run_blockdev_getsz (const char *cmd, int argc, char *argv[])
1926 {
1927   int64_t r;
1928   const char *device;
1929   if (argc != 1) {
1930     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1931     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1932     return -1;
1933   }
1934   device = argv[0];
1935   r = guestfs_blockdev_getsz (g, device);
1936   if (r == -1) return -1;
1937   printf ("%" PRIi64 "\n", r);
1938   return 0;
1939 }
1940
1941 static int run_blockdev_getsize64 (const char *cmd, int argc, char *argv[])
1942 {
1943   int64_t r;
1944   const char *device;
1945   if (argc != 1) {
1946     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1947     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1948     return -1;
1949   }
1950   device = argv[0];
1951   r = guestfs_blockdev_getsize64 (g, device);
1952   if (r == -1) return -1;
1953   printf ("%" PRIi64 "\n", r);
1954   return 0;
1955 }
1956
1957 static int run_blockdev_flushbufs (const char *cmd, int argc, char *argv[])
1958 {
1959   int r;
1960   const char *device;
1961   if (argc != 1) {
1962     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1963     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1964     return -1;
1965   }
1966   device = argv[0];
1967   r = guestfs_blockdev_flushbufs (g, device);
1968   return r;
1969 }
1970
1971 static int run_blockdev_rereadpt (const char *cmd, int argc, char *argv[])
1972 {
1973   int r;
1974   const char *device;
1975   if (argc != 1) {
1976     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1977     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1978     return -1;
1979   }
1980   device = argv[0];
1981   r = guestfs_blockdev_rereadpt (g, device);
1982   return r;
1983 }
1984
1985 static int run_upload (const char *cmd, int argc, char *argv[])
1986 {
1987   int r;
1988   const char *filename;
1989   const char *remotefilename;
1990   if (argc != 2) {
1991     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1992     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1993     return -1;
1994   }
1995   filename = strcmp (argv[0], "-") != 0 ? argv[0] : "/dev/stdin";
1996   remotefilename = argv[1];
1997   r = guestfs_upload (g, filename, remotefilename);
1998   return r;
1999 }
2000
2001 static int run_download (const char *cmd, int argc, char *argv[])
2002 {
2003   int r;
2004   const char *remotefilename;
2005   const char *filename;
2006   if (argc != 2) {
2007     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2008     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2009     return -1;
2010   }
2011   remotefilename = argv[0];
2012   filename = strcmp (argv[1], "-") != 0 ? argv[1] : "/dev/stdout";
2013   r = guestfs_download (g, remotefilename, filename);
2014   return r;
2015 }
2016
2017 static int run_checksum (const char *cmd, int argc, char *argv[])
2018 {
2019   char *r;
2020   const char *csumtype;
2021   const char *path;
2022   if (argc != 2) {
2023     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2024     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2025     return -1;
2026   }
2027   csumtype = argv[0];
2028   path = argv[1];
2029   r = guestfs_checksum (g, csumtype, path);
2030   if (r == NULL) return -1;
2031   printf ("%s\n", r);
2032   free (r);
2033   return 0;
2034 }
2035
2036 static int run_tar_in (const char *cmd, int argc, char *argv[])
2037 {
2038   int r;
2039   const char *tarfile;
2040   const char *directory;
2041   if (argc != 2) {
2042     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2043     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2044     return -1;
2045   }
2046   tarfile = strcmp (argv[0], "-") != 0 ? argv[0] : "/dev/stdin";
2047   directory = argv[1];
2048   r = guestfs_tar_in (g, tarfile, directory);
2049   return r;
2050 }
2051
2052 static int run_tar_out (const char *cmd, int argc, char *argv[])
2053 {
2054   int r;
2055   const char *directory;
2056   const char *tarfile;
2057   if (argc != 2) {
2058     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2059     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2060     return -1;
2061   }
2062   directory = argv[0];
2063   tarfile = strcmp (argv[1], "-") != 0 ? argv[1] : "/dev/stdout";
2064   r = guestfs_tar_out (g, directory, tarfile);
2065   return r;
2066 }
2067
2068 static int run_tgz_in (const char *cmd, int argc, char *argv[])
2069 {
2070   int r;
2071   const char *tarball;
2072   const char *directory;
2073   if (argc != 2) {
2074     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2075     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2076     return -1;
2077   }
2078   tarball = strcmp (argv[0], "-") != 0 ? argv[0] : "/dev/stdin";
2079   directory = argv[1];
2080   r = guestfs_tgz_in (g, tarball, directory);
2081   return r;
2082 }
2083
2084 static int run_tgz_out (const char *cmd, int argc, char *argv[])
2085 {
2086   int r;
2087   const char *directory;
2088   const char *tarball;
2089   if (argc != 2) {
2090     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2091     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2092     return -1;
2093   }
2094   directory = argv[0];
2095   tarball = strcmp (argv[1], "-") != 0 ? argv[1] : "/dev/stdout";
2096   r = guestfs_tgz_out (g, directory, tarball);
2097   return r;
2098 }
2099
2100 static int run_mount_ro (const char *cmd, int argc, char *argv[])
2101 {
2102   int r;
2103   const char *device;
2104   const char *mountpoint;
2105   if (argc != 2) {
2106     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2107     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2108     return -1;
2109   }
2110   device = argv[0];
2111   mountpoint = argv[1];
2112   r = guestfs_mount_ro (g, device, mountpoint);
2113   return r;
2114 }
2115
2116 static int run_mount_options (const char *cmd, int argc, char *argv[])
2117 {
2118   int r;
2119   const char *options;
2120   const char *device;
2121   const char *mountpoint;
2122   if (argc != 3) {
2123     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
2124     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2125     return -1;
2126   }
2127   options = argv[0];
2128   device = argv[1];
2129   mountpoint = argv[2];
2130   r = guestfs_mount_options (g, options, device, mountpoint);
2131   return r;
2132 }
2133
2134 static int run_mount_vfs (const char *cmd, int argc, char *argv[])
2135 {
2136   int r;
2137   const char *options;
2138   const char *vfstype;
2139   const char *device;
2140   const char *mountpoint;
2141   if (argc != 4) {
2142     fprintf (stderr, "%s should have 4 parameter(s)\n", cmd);
2143     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2144     return -1;
2145   }
2146   options = argv[0];
2147   vfstype = argv[1];
2148   device = argv[2];
2149   mountpoint = argv[3];
2150   r = guestfs_mount_vfs (g, options, vfstype, device, mountpoint);
2151   return r;
2152 }
2153
2154 static int run_debug (const char *cmd, int argc, char *argv[])
2155 {
2156   char *r;
2157   const char *subcmd;
2158   char **extraargs;
2159   if (argc != 2) {
2160     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2161     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2162     return -1;
2163   }
2164   subcmd = argv[0];
2165   extraargs = parse_string_list (argv[1]);
2166   r = guestfs_debug (g, subcmd, extraargs);
2167   if (r == NULL) return -1;
2168   printf ("%s\n", r);
2169   free (r);
2170   return 0;
2171 }
2172
2173 static int run_lvremove (const char *cmd, int argc, char *argv[])
2174 {
2175   int r;
2176   const char *device;
2177   if (argc != 1) {
2178     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2179     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2180     return -1;
2181   }
2182   device = argv[0];
2183   r = guestfs_lvremove (g, device);
2184   return r;
2185 }
2186
2187 static int run_vgremove (const char *cmd, int argc, char *argv[])
2188 {
2189   int r;
2190   const char *vgname;
2191   if (argc != 1) {
2192     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2193     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2194     return -1;
2195   }
2196   vgname = argv[0];
2197   r = guestfs_vgremove (g, vgname);
2198   return r;
2199 }
2200
2201 static int run_pvremove (const char *cmd, int argc, char *argv[])
2202 {
2203   int r;
2204   const char *device;
2205   if (argc != 1) {
2206     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2207     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2208     return -1;
2209   }
2210   device = argv[0];
2211   r = guestfs_pvremove (g, device);
2212   return r;
2213 }
2214
2215 static int run_set_e2label (const char *cmd, int argc, char *argv[])
2216 {
2217   int r;
2218   const char *device;
2219   const char *label;
2220   if (argc != 2) {
2221     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2222     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2223     return -1;
2224   }
2225   device = argv[0];
2226   label = argv[1];
2227   r = guestfs_set_e2label (g, device, label);
2228   return r;
2229 }
2230
2231 static int run_get_e2label (const char *cmd, int argc, char *argv[])
2232 {
2233   char *r;
2234   const char *device;
2235   if (argc != 1) {
2236     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2237     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2238     return -1;
2239   }
2240   device = argv[0];
2241   r = guestfs_get_e2label (g, device);
2242   if (r == NULL) return -1;
2243   printf ("%s\n", r);
2244   free (r);
2245   return 0;
2246 }
2247
2248 static int run_set_e2uuid (const char *cmd, int argc, char *argv[])
2249 {
2250   int r;
2251   const char *device;
2252   const char *uuid;
2253   if (argc != 2) {
2254     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2255     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2256     return -1;
2257   }
2258   device = argv[0];
2259   uuid = argv[1];
2260   r = guestfs_set_e2uuid (g, device, uuid);
2261   return r;
2262 }
2263
2264 static int run_get_e2uuid (const char *cmd, int argc, char *argv[])
2265 {
2266   char *r;
2267   const char *device;
2268   if (argc != 1) {
2269     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2270     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2271     return -1;
2272   }
2273   device = argv[0];
2274   r = guestfs_get_e2uuid (g, device);
2275   if (r == NULL) return -1;
2276   printf ("%s\n", r);
2277   free (r);
2278   return 0;
2279 }
2280
2281 static int run_fsck (const char *cmd, int argc, char *argv[])
2282 {
2283   int r;
2284   const char *fstype;
2285   const char *device;
2286   if (argc != 2) {
2287     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2288     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2289     return -1;
2290   }
2291   fstype = argv[0];
2292   device = argv[1];
2293   r = guestfs_fsck (g, fstype, device);
2294   if (r == -1) return -1;
2295   printf ("%d\n", r);
2296   return 0;
2297 }
2298
2299 static int run_zero (const char *cmd, int argc, char *argv[])
2300 {
2301   int r;
2302   const char *device;
2303   if (argc != 1) {
2304     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2305     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2306     return -1;
2307   }
2308   device = argv[0];
2309   r = guestfs_zero (g, device);
2310   return r;
2311 }
2312
2313 static int run_grub_install (const char *cmd, int argc, char *argv[])
2314 {
2315   int r;
2316   const char *root;
2317   const char *device;
2318   if (argc != 2) {
2319     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2320     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2321     return -1;
2322   }
2323   root = argv[0];
2324   device = argv[1];
2325   r = guestfs_grub_install (g, root, device);
2326   return r;
2327 }
2328
2329 static int run_cp (const char *cmd, int argc, char *argv[])
2330 {
2331   int r;
2332   const char *src;
2333   const char *dest;
2334   if (argc != 2) {
2335     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2336     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2337     return -1;
2338   }
2339   src = argv[0];
2340   dest = argv[1];
2341   r = guestfs_cp (g, src, dest);
2342   return r;
2343 }
2344
2345 static int run_cp_a (const char *cmd, int argc, char *argv[])
2346 {
2347   int r;
2348   const char *src;
2349   const char *dest;
2350   if (argc != 2) {
2351     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2352     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2353     return -1;
2354   }
2355   src = argv[0];
2356   dest = argv[1];
2357   r = guestfs_cp_a (g, src, dest);
2358   return r;
2359 }
2360
2361 static int run_mv (const char *cmd, int argc, char *argv[])
2362 {
2363   int r;
2364   const char *src;
2365   const char *dest;
2366   if (argc != 2) {
2367     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2368     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2369     return -1;
2370   }
2371   src = argv[0];
2372   dest = argv[1];
2373   r = guestfs_mv (g, src, dest);
2374   return r;
2375 }
2376
2377 static int run_drop_caches (const char *cmd, int argc, char *argv[])
2378 {
2379   int r;
2380   int whattodrop;
2381   if (argc != 1) {
2382     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2383     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2384     return -1;
2385   }
2386   whattodrop = atoi (argv[0]);
2387   r = guestfs_drop_caches (g, whattodrop);
2388   return r;
2389 }
2390
2391 static int run_dmesg (const char *cmd, int argc, char *argv[])
2392 {
2393   char *r;
2394   if (argc != 0) {
2395     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
2396     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2397     return -1;
2398   }
2399   r = guestfs_dmesg (g);
2400   if (r == NULL) return -1;
2401   printf ("%s\n", r);
2402   free (r);
2403   return 0;
2404 }
2405
2406 static int run_ping_daemon (const char *cmd, int argc, char *argv[])
2407 {
2408   int r;
2409   if (argc != 0) {
2410     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
2411     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2412     return -1;
2413   }
2414   r = guestfs_ping_daemon (g);
2415   return r;
2416 }
2417
2418 static int run_equal (const char *cmd, int argc, char *argv[])
2419 {
2420   int r;
2421   const char *file1;
2422   const char *file2;
2423   if (argc != 2) {
2424     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2425     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2426     return -1;
2427   }
2428   file1 = argv[0];
2429   file2 = argv[1];
2430   r = guestfs_equal (g, file1, file2);
2431   if (r == -1) return -1;
2432   if (r) printf ("true\n"); else printf ("false\n");
2433   return 0;
2434 }
2435
2436 static int run_strings (const char *cmd, int argc, char *argv[])
2437 {
2438   char **r;
2439   const char *path;
2440   if (argc != 1) {
2441     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2442     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2443     return -1;
2444   }
2445   path = argv[0];
2446   r = guestfs_strings (g, path);
2447   if (r == NULL) return -1;
2448   print_strings (r);
2449   free_strings (r);
2450   return 0;
2451 }
2452
2453 static int run_strings_e (const char *cmd, int argc, char *argv[])
2454 {
2455   char **r;
2456   const char *encoding;
2457   const char *path;
2458   if (argc != 2) {
2459     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2460     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2461     return -1;
2462   }
2463   encoding = argv[0];
2464   path = argv[1];
2465   r = guestfs_strings_e (g, encoding, path);
2466   if (r == NULL) return -1;
2467   print_strings (r);
2468   free_strings (r);
2469   return 0;
2470 }
2471
2472 static int run_hexdump (const char *cmd, int argc, char *argv[])
2473 {
2474   char *r;
2475   const char *path;
2476   if (argc != 1) {
2477     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2478     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2479     return -1;
2480   }
2481   path = argv[0];
2482   r = guestfs_hexdump (g, path);
2483   if (r == NULL) return -1;
2484   printf ("%s\n", r);
2485   free (r);
2486   return 0;
2487 }
2488
2489 static int run_zerofree (const char *cmd, int argc, char *argv[])
2490 {
2491   int r;
2492   const char *device;
2493   if (argc != 1) {
2494     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2495     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2496     return -1;
2497   }
2498   device = argv[0];
2499   r = guestfs_zerofree (g, device);
2500   return r;
2501 }
2502
2503 static int run_pvresize (const char *cmd, int argc, char *argv[])
2504 {
2505   int r;
2506   const char *device;
2507   if (argc != 1) {
2508     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2509     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2510     return -1;
2511   }
2512   device = argv[0];
2513   r = guestfs_pvresize (g, device);
2514   return r;
2515 }
2516
2517 static int run_sfdisk_N (const char *cmd, int argc, char *argv[])
2518 {
2519   int r;
2520   const char *device;
2521   int n;
2522   int cyls;
2523   int heads;
2524   int sectors;
2525   const char *line;
2526   if (argc != 6) {
2527     fprintf (stderr, "%s should have 6 parameter(s)\n", cmd);
2528     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2529     return -1;
2530   }
2531   device = argv[0];
2532   n = atoi (argv[1]);
2533   cyls = atoi (argv[2]);
2534   heads = atoi (argv[3]);
2535   sectors = atoi (argv[4]);
2536   line = argv[5];
2537   r = guestfs_sfdisk_N (g, device, n, cyls, heads, sectors, line);
2538   return r;
2539 }
2540
2541 static int run_sfdisk_l (const char *cmd, int argc, char *argv[])
2542 {
2543   char *r;
2544   const char *device;
2545   if (argc != 1) {
2546     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2547     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2548     return -1;
2549   }
2550   device = argv[0];
2551   r = guestfs_sfdisk_l (g, device);
2552   if (r == NULL) return -1;
2553   printf ("%s\n", r);
2554   free (r);
2555   return 0;
2556 }
2557
2558 static int run_sfdisk_kernel_geometry (const char *cmd, int argc, char *argv[])
2559 {
2560   char *r;
2561   const char *device;
2562   if (argc != 1) {
2563     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2564     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2565     return -1;
2566   }
2567   device = argv[0];
2568   r = guestfs_sfdisk_kernel_geometry (g, device);
2569   if (r == NULL) return -1;
2570   printf ("%s\n", r);
2571   free (r);
2572   return 0;
2573 }
2574
2575 static int run_sfdisk_disk_geometry (const char *cmd, int argc, char *argv[])
2576 {
2577   char *r;
2578   const char *device;
2579   if (argc != 1) {
2580     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2581     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2582     return -1;
2583   }
2584   device = argv[0];
2585   r = guestfs_sfdisk_disk_geometry (g, device);
2586   if (r == NULL) return -1;
2587   printf ("%s\n", r);
2588   free (r);
2589   return 0;
2590 }
2591
2592 static int run_vg_activate_all (const char *cmd, int argc, char *argv[])
2593 {
2594   int r;
2595   int activate;
2596   if (argc != 1) {
2597     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2598     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2599     return -1;
2600   }
2601   activate = is_true (argv[0]) ? 1 : 0;
2602   r = guestfs_vg_activate_all (g, activate);
2603   return r;
2604 }
2605
2606 static int run_vg_activate (const char *cmd, int argc, char *argv[])
2607 {
2608   int r;
2609   int activate;
2610   char **volgroups;
2611   if (argc != 2) {
2612     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2613     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2614     return -1;
2615   }
2616   activate = is_true (argv[0]) ? 1 : 0;
2617   volgroups = parse_string_list (argv[1]);
2618   r = guestfs_vg_activate (g, activate, volgroups);
2619   return r;
2620 }
2621
2622 static int run_lvresize (const char *cmd, int argc, char *argv[])
2623 {
2624   int r;
2625   const char *device;
2626   int mbytes;
2627   if (argc != 2) {
2628     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
2629     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2630     return -1;
2631   }
2632   device = argv[0];
2633   mbytes = atoi (argv[1]);
2634   r = guestfs_lvresize (g, device, mbytes);
2635   return r;
2636 }
2637
2638 static int run_resize2fs (const char *cmd, int argc, char *argv[])
2639 {
2640   int r;
2641   const char *device;
2642   if (argc != 1) {
2643     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2644     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2645     return -1;
2646   }
2647   device = argv[0];
2648   r = guestfs_resize2fs (g, device);
2649   return r;
2650 }
2651
2652 static int run_find (const char *cmd, int argc, char *argv[])
2653 {
2654   char **r;
2655   const char *directory;
2656   if (argc != 1) {
2657     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2658     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2659     return -1;
2660   }
2661   directory = argv[0];
2662   r = guestfs_find (g, directory);
2663   if (r == NULL) return -1;
2664   print_strings (r);
2665   free_strings (r);
2666   return 0;
2667 }
2668
2669 static int run_e2fsck_f (const char *cmd, int argc, char *argv[])
2670 {
2671   int r;
2672   const char *device;
2673   if (argc != 1) {
2674     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
2675     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
2676     return -1;
2677   }
2678   device = argv[0];
2679   r = guestfs_e2fsck_f (g, device);
2680   return r;
2681 }
2682
2683 int run_action (const char *cmd, int argc, char *argv[])
2684 {
2685   if (strcasecmp (cmd, "launch") == 0 || strcasecmp (cmd, "run") == 0)
2686     return run_launch (cmd, argc, argv);
2687   else
2688   if (strcasecmp (cmd, "kill_subprocess") == 0 || strcasecmp (cmd, "kill-subprocess") == 0)
2689     return run_kill_subprocess (cmd, argc, argv);
2690   else
2691   if (strcasecmp (cmd, "add_drive") == 0 || strcasecmp (cmd, "add-drive") == 0 || strcasecmp (cmd, "add") == 0)
2692     return run_add_drive (cmd, argc, argv);
2693   else
2694   if (strcasecmp (cmd, "add_cdrom") == 0 || strcasecmp (cmd, "add-cdrom") == 0 || strcasecmp (cmd, "cdrom") == 0)
2695     return run_add_cdrom (cmd, argc, argv);
2696   else
2697   if (strcasecmp (cmd, "config") == 0)
2698     return run_config (cmd, argc, argv);
2699   else
2700   if (strcasecmp (cmd, "set_qemu") == 0 || strcasecmp (cmd, "set-qemu") == 0 || strcasecmp (cmd, "qemu") == 0)
2701     return run_set_qemu (cmd, argc, argv);
2702   else
2703   if (strcasecmp (cmd, "get_qemu") == 0 || strcasecmp (cmd, "get-qemu") == 0)
2704     return run_get_qemu (cmd, argc, argv);
2705   else
2706   if (strcasecmp (cmd, "set_path") == 0 || strcasecmp (cmd, "set-path") == 0 || strcasecmp (cmd, "path") == 0)
2707     return run_set_path (cmd, argc, argv);
2708   else
2709   if (strcasecmp (cmd, "get_path") == 0 || strcasecmp (cmd, "get-path") == 0)
2710     return run_get_path (cmd, argc, argv);
2711   else
2712   if (strcasecmp (cmd, "set_append") == 0 || strcasecmp (cmd, "set-append") == 0 || strcasecmp (cmd, "append") == 0)
2713     return run_set_append (cmd, argc, argv);
2714   else
2715   if (strcasecmp (cmd, "get_append") == 0 || strcasecmp (cmd, "get-append") == 0)
2716     return run_get_append (cmd, argc, argv);
2717   else
2718   if (strcasecmp (cmd, "set_autosync") == 0 || strcasecmp (cmd, "set-autosync") == 0 || strcasecmp (cmd, "autosync") == 0)
2719     return run_set_autosync (cmd, argc, argv);
2720   else
2721   if (strcasecmp (cmd, "get_autosync") == 0 || strcasecmp (cmd, "get-autosync") == 0)
2722     return run_get_autosync (cmd, argc, argv);
2723   else
2724   if (strcasecmp (cmd, "set_verbose") == 0 || strcasecmp (cmd, "set-verbose") == 0 || strcasecmp (cmd, "verbose") == 0)
2725     return run_set_verbose (cmd, argc, argv);
2726   else
2727   if (strcasecmp (cmd, "get_verbose") == 0 || strcasecmp (cmd, "get-verbose") == 0)
2728     return run_get_verbose (cmd, argc, argv);
2729   else
2730   if (strcasecmp (cmd, "is_ready") == 0 || strcasecmp (cmd, "is-ready") == 0)
2731     return run_is_ready (cmd, argc, argv);
2732   else
2733   if (strcasecmp (cmd, "is_config") == 0 || strcasecmp (cmd, "is-config") == 0)
2734     return run_is_config (cmd, argc, argv);
2735   else
2736   if (strcasecmp (cmd, "is_launching") == 0 || strcasecmp (cmd, "is-launching") == 0)
2737     return run_is_launching (cmd, argc, argv);
2738   else
2739   if (strcasecmp (cmd, "is_busy") == 0 || strcasecmp (cmd, "is-busy") == 0)
2740     return run_is_busy (cmd, argc, argv);
2741   else
2742   if (strcasecmp (cmd, "get_state") == 0 || strcasecmp (cmd, "get-state") == 0)
2743     return run_get_state (cmd, argc, argv);
2744   else
2745   if (strcasecmp (cmd, "mount") == 0)
2746     return run_mount (cmd, argc, argv);
2747   else
2748   if (strcasecmp (cmd, "sync") == 0)
2749     return run_sync (cmd, argc, argv);
2750   else
2751   if (strcasecmp (cmd, "touch") == 0)
2752     return run_touch (cmd, argc, argv);
2753   else
2754   if (strcasecmp (cmd, "cat") == 0)
2755     return run_cat (cmd, argc, argv);
2756   else
2757   if (strcasecmp (cmd, "ll") == 0)
2758     return run_ll (cmd, argc, argv);
2759   else
2760   if (strcasecmp (cmd, "ls") == 0)
2761     return run_ls (cmd, argc, argv);
2762   else
2763   if (strcasecmp (cmd, "list_devices") == 0 || strcasecmp (cmd, "list-devices") == 0)
2764     return run_list_devices (cmd, argc, argv);
2765   else
2766   if (strcasecmp (cmd, "list_partitions") == 0 || strcasecmp (cmd, "list-partitions") == 0)
2767     return run_list_partitions (cmd, argc, argv);
2768   else
2769   if (strcasecmp (cmd, "pvs") == 0)
2770     return run_pvs (cmd, argc, argv);
2771   else
2772   if (strcasecmp (cmd, "vgs") == 0)
2773     return run_vgs (cmd, argc, argv);
2774   else
2775   if (strcasecmp (cmd, "lvs") == 0)
2776     return run_lvs (cmd, argc, argv);
2777   else
2778   if (strcasecmp (cmd, "pvs_full") == 0 || strcasecmp (cmd, "pvs-full") == 0)
2779     return run_pvs_full (cmd, argc, argv);
2780   else
2781   if (strcasecmp (cmd, "vgs_full") == 0 || strcasecmp (cmd, "vgs-full") == 0)
2782     return run_vgs_full (cmd, argc, argv);
2783   else
2784   if (strcasecmp (cmd, "lvs_full") == 0 || strcasecmp (cmd, "lvs-full") == 0)
2785     return run_lvs_full (cmd, argc, argv);
2786   else
2787   if (strcasecmp (cmd, "read_lines") == 0 || strcasecmp (cmd, "read-lines") == 0)
2788     return run_read_lines (cmd, argc, argv);
2789   else
2790   if (strcasecmp (cmd, "aug_init") == 0 || strcasecmp (cmd, "aug-init") == 0)
2791     return run_aug_init (cmd, argc, argv);
2792   else
2793   if (strcasecmp (cmd, "aug_close") == 0 || strcasecmp (cmd, "aug-close") == 0)
2794     return run_aug_close (cmd, argc, argv);
2795   else
2796   if (strcasecmp (cmd, "aug_defvar") == 0 || strcasecmp (cmd, "aug-defvar") == 0)
2797     return run_aug_defvar (cmd, argc, argv);
2798   else
2799   if (strcasecmp (cmd, "aug_defnode") == 0 || strcasecmp (cmd, "aug-defnode") == 0)
2800     return run_aug_defnode (cmd, argc, argv);
2801   else
2802   if (strcasecmp (cmd, "aug_get") == 0 || strcasecmp (cmd, "aug-get") == 0)
2803     return run_aug_get (cmd, argc, argv);
2804   else
2805   if (strcasecmp (cmd, "aug_set") == 0 || strcasecmp (cmd, "aug-set") == 0)
2806     return run_aug_set (cmd, argc, argv);
2807   else
2808   if (strcasecmp (cmd, "aug_insert") == 0 || strcasecmp (cmd, "aug-insert") == 0)
2809     return run_aug_insert (cmd, argc, argv);
2810   else
2811   if (strcasecmp (cmd, "aug_rm") == 0 || strcasecmp (cmd, "aug-rm") == 0)
2812     return run_aug_rm (cmd, argc, argv);
2813   else
2814   if (strcasecmp (cmd, "aug_mv") == 0 || strcasecmp (cmd, "aug-mv") == 0)
2815     return run_aug_mv (cmd, argc, argv);
2816   else
2817   if (strcasecmp (cmd, "aug_match") == 0 || strcasecmp (cmd, "aug-match") == 0)
2818     return run_aug_match (cmd, argc, argv);
2819   else
2820   if (strcasecmp (cmd, "aug_save") == 0 || strcasecmp (cmd, "aug-save") == 0)
2821     return run_aug_save (cmd, argc, argv);
2822   else
2823   if (strcasecmp (cmd, "aug_load") == 0 || strcasecmp (cmd, "aug-load") == 0)
2824     return run_aug_load (cmd, argc, argv);
2825   else
2826   if (strcasecmp (cmd, "aug_ls") == 0 || strcasecmp (cmd, "aug-ls") == 0)
2827     return run_aug_ls (cmd, argc, argv);
2828   else
2829   if (strcasecmp (cmd, "rm") == 0)
2830     return run_rm (cmd, argc, argv);
2831   else
2832   if (strcasecmp (cmd, "rmdir") == 0)
2833     return run_rmdir (cmd, argc, argv);
2834   else
2835   if (strcasecmp (cmd, "rm_rf") == 0 || strcasecmp (cmd, "rm-rf") == 0)
2836     return run_rm_rf (cmd, argc, argv);
2837   else
2838   if (strcasecmp (cmd, "mkdir") == 0)
2839     return run_mkdir (cmd, argc, argv);
2840   else
2841   if (strcasecmp (cmd, "mkdir_p") == 0 || strcasecmp (cmd, "mkdir-p") == 0)
2842     return run_mkdir_p (cmd, argc, argv);
2843   else
2844   if (strcasecmp (cmd, "chmod") == 0)
2845     return run_chmod (cmd, argc, argv);
2846   else
2847   if (strcasecmp (cmd, "chown") == 0)
2848     return run_chown (cmd, argc, argv);
2849   else
2850   if (strcasecmp (cmd, "exists") == 0)
2851     return run_exists (cmd, argc, argv);
2852   else
2853   if (strcasecmp (cmd, "is_file") == 0 || strcasecmp (cmd, "is-file") == 0)
2854     return run_is_file (cmd, argc, argv);
2855   else
2856   if (strcasecmp (cmd, "is_dir") == 0 || strcasecmp (cmd, "is-dir") == 0)
2857     return run_is_dir (cmd, argc, argv);
2858   else
2859   if (strcasecmp (cmd, "pvcreate") == 0)
2860     return run_pvcreate (cmd, argc, argv);
2861   else
2862   if (strcasecmp (cmd, "vgcreate") == 0)
2863     return run_vgcreate (cmd, argc, argv);
2864   else
2865   if (strcasecmp (cmd, "lvcreate") == 0)
2866     return run_lvcreate (cmd, argc, argv);
2867   else
2868   if (strcasecmp (cmd, "mkfs") == 0)
2869     return run_mkfs (cmd, argc, argv);
2870   else
2871   if (strcasecmp (cmd, "sfdisk") == 0)
2872     return run_sfdisk (cmd, argc, argv);
2873   else
2874   if (strcasecmp (cmd, "write_file") == 0 || strcasecmp (cmd, "write-file") == 0)
2875     return run_write_file (cmd, argc, argv);
2876   else
2877   if (strcasecmp (cmd, "umount") == 0 || strcasecmp (cmd, "unmount") == 0)
2878     return run_umount (cmd, argc, argv);
2879   else
2880   if (strcasecmp (cmd, "mounts") == 0)
2881     return run_mounts (cmd, argc, argv);
2882   else
2883   if (strcasecmp (cmd, "umount_all") == 0 || strcasecmp (cmd, "umount-all") == 0 || strcasecmp (cmd, "unmount-all") == 0)
2884     return run_umount_all (cmd, argc, argv);
2885   else
2886   if (strcasecmp (cmd, "lvm_remove_all") == 0 || strcasecmp (cmd, "lvm-remove-all") == 0)
2887     return run_lvm_remove_all (cmd, argc, argv);
2888   else
2889   if (strcasecmp (cmd, "file") == 0)
2890     return run_file (cmd, argc, argv);
2891   else
2892   if (strcasecmp (cmd, "command") == 0)
2893     return run_command (cmd, argc, argv);
2894   else
2895   if (strcasecmp (cmd, "command_lines") == 0 || strcasecmp (cmd, "command-lines") == 0)
2896     return run_command_lines (cmd, argc, argv);
2897   else
2898   if (strcasecmp (cmd, "stat") == 0)
2899     return run_stat (cmd, argc, argv);
2900   else
2901   if (strcasecmp (cmd, "lstat") == 0)
2902     return run_lstat (cmd, argc, argv);
2903   else
2904   if (strcasecmp (cmd, "statvfs") == 0)
2905     return run_statvfs (cmd, argc, argv);
2906   else
2907   if (strcasecmp (cmd, "tune2fs_l") == 0 || strcasecmp (cmd, "tune2fs-l") == 0)
2908     return run_tune2fs_l (cmd, argc, argv);
2909   else
2910   if (strcasecmp (cmd, "blockdev_setro") == 0 || strcasecmp (cmd, "blockdev-setro") == 0)
2911     return run_blockdev_setro (cmd, argc, argv);
2912   else
2913   if (strcasecmp (cmd, "blockdev_setrw") == 0 || strcasecmp (cmd, "blockdev-setrw") == 0)
2914     return run_blockdev_setrw (cmd, argc, argv);
2915   else
2916   if (strcasecmp (cmd, "blockdev_getro") == 0 || strcasecmp (cmd, "blockdev-getro") == 0)
2917     return run_blockdev_getro (cmd, argc, argv);
2918   else
2919   if (strcasecmp (cmd, "blockdev_getss") == 0 || strcasecmp (cmd, "blockdev-getss") == 0)
2920     return run_blockdev_getss (cmd, argc, argv);
2921   else
2922   if (strcasecmp (cmd, "blockdev_getbsz") == 0 || strcasecmp (cmd, "blockdev-getbsz") == 0)
2923     return run_blockdev_getbsz (cmd, argc, argv);
2924   else
2925   if (strcasecmp (cmd, "blockdev_setbsz") == 0 || strcasecmp (cmd, "blockdev-setbsz") == 0)
2926     return run_blockdev_setbsz (cmd, argc, argv);
2927   else
2928   if (strcasecmp (cmd, "blockdev_getsz") == 0 || strcasecmp (cmd, "blockdev-getsz") == 0)
2929     return run_blockdev_getsz (cmd, argc, argv);
2930   else
2931   if (strcasecmp (cmd, "blockdev_getsize64") == 0 || strcasecmp (cmd, "blockdev-getsize64") == 0)
2932     return run_blockdev_getsize64 (cmd, argc, argv);
2933   else
2934   if (strcasecmp (cmd, "blockdev_flushbufs") == 0 || strcasecmp (cmd, "blockdev-flushbufs") == 0)
2935     return run_blockdev_flushbufs (cmd, argc, argv);
2936   else
2937   if (strcasecmp (cmd, "blockdev_rereadpt") == 0 || strcasecmp (cmd, "blockdev-rereadpt") == 0)
2938     return run_blockdev_rereadpt (cmd, argc, argv);
2939   else
2940   if (strcasecmp (cmd, "upload") == 0)
2941     return run_upload (cmd, argc, argv);
2942   else
2943   if (strcasecmp (cmd, "download") == 0)
2944     return run_download (cmd, argc, argv);
2945   else
2946   if (strcasecmp (cmd, "checksum") == 0)
2947     return run_checksum (cmd, argc, argv);
2948   else
2949   if (strcasecmp (cmd, "tar_in") == 0 || strcasecmp (cmd, "tar-in") == 0)
2950     return run_tar_in (cmd, argc, argv);
2951   else
2952   if (strcasecmp (cmd, "tar_out") == 0 || strcasecmp (cmd, "tar-out") == 0)
2953     return run_tar_out (cmd, argc, argv);
2954   else
2955   if (strcasecmp (cmd, "tgz_in") == 0 || strcasecmp (cmd, "tgz-in") == 0)
2956     return run_tgz_in (cmd, argc, argv);
2957   else
2958   if (strcasecmp (cmd, "tgz_out") == 0 || strcasecmp (cmd, "tgz-out") == 0)
2959     return run_tgz_out (cmd, argc, argv);
2960   else
2961   if (strcasecmp (cmd, "mount_ro") == 0 || strcasecmp (cmd, "mount-ro") == 0)
2962     return run_mount_ro (cmd, argc, argv);
2963   else
2964   if (strcasecmp (cmd, "mount_options") == 0 || strcasecmp (cmd, "mount-options") == 0)
2965     return run_mount_options (cmd, argc, argv);
2966   else
2967   if (strcasecmp (cmd, "mount_vfs") == 0 || strcasecmp (cmd, "mount-vfs") == 0)
2968     return run_mount_vfs (cmd, argc, argv);
2969   else
2970   if (strcasecmp (cmd, "debug") == 0)
2971     return run_debug (cmd, argc, argv);
2972   else
2973   if (strcasecmp (cmd, "lvremove") == 0)
2974     return run_lvremove (cmd, argc, argv);
2975   else
2976   if (strcasecmp (cmd, "vgremove") == 0)
2977     return run_vgremove (cmd, argc, argv);
2978   else
2979   if (strcasecmp (cmd, "pvremove") == 0)
2980     return run_pvremove (cmd, argc, argv);
2981   else
2982   if (strcasecmp (cmd, "set_e2label") == 0 || strcasecmp (cmd, "set-e2label") == 0)
2983     return run_set_e2label (cmd, argc, argv);
2984   else
2985   if (strcasecmp (cmd, "get_e2label") == 0 || strcasecmp (cmd, "get-e2label") == 0)
2986     return run_get_e2label (cmd, argc, argv);
2987   else
2988   if (strcasecmp (cmd, "set_e2uuid") == 0 || strcasecmp (cmd, "set-e2uuid") == 0)
2989     return run_set_e2uuid (cmd, argc, argv);
2990   else
2991   if (strcasecmp (cmd, "get_e2uuid") == 0 || strcasecmp (cmd, "get-e2uuid") == 0)
2992     return run_get_e2uuid (cmd, argc, argv);
2993   else
2994   if (strcasecmp (cmd, "fsck") == 0)
2995     return run_fsck (cmd, argc, argv);
2996   else
2997   if (strcasecmp (cmd, "zero") == 0)
2998     return run_zero (cmd, argc, argv);
2999   else
3000   if (strcasecmp (cmd, "grub_install") == 0 || strcasecmp (cmd, "grub-install") == 0)
3001     return run_grub_install (cmd, argc, argv);
3002   else
3003   if (strcasecmp (cmd, "cp") == 0)
3004     return run_cp (cmd, argc, argv);
3005   else
3006   if (strcasecmp (cmd, "cp_a") == 0 || strcasecmp (cmd, "cp-a") == 0)
3007     return run_cp_a (cmd, argc, argv);
3008   else
3009   if (strcasecmp (cmd, "mv") == 0)
3010     return run_mv (cmd, argc, argv);
3011   else
3012   if (strcasecmp (cmd, "drop_caches") == 0 || strcasecmp (cmd, "drop-caches") == 0)
3013     return run_drop_caches (cmd, argc, argv);
3014   else
3015   if (strcasecmp (cmd, "dmesg") == 0)
3016     return run_dmesg (cmd, argc, argv);
3017   else
3018   if (strcasecmp (cmd, "ping_daemon") == 0 || strcasecmp (cmd, "ping-daemon") == 0)
3019     return run_ping_daemon (cmd, argc, argv);
3020   else
3021   if (strcasecmp (cmd, "equal") == 0)
3022     return run_equal (cmd, argc, argv);
3023   else
3024   if (strcasecmp (cmd, "strings") == 0)
3025     return run_strings (cmd, argc, argv);
3026   else
3027   if (strcasecmp (cmd, "strings_e") == 0 || strcasecmp (cmd, "strings-e") == 0)
3028     return run_strings_e (cmd, argc, argv);
3029   else
3030   if (strcasecmp (cmd, "hexdump") == 0)
3031     return run_hexdump (cmd, argc, argv);
3032   else
3033   if (strcasecmp (cmd, "zerofree") == 0)
3034     return run_zerofree (cmd, argc, argv);
3035   else
3036   if (strcasecmp (cmd, "pvresize") == 0)
3037     return run_pvresize (cmd, argc, argv);
3038   else
3039   if (strcasecmp (cmd, "sfdisk_N") == 0 || strcasecmp (cmd, "sfdisk-N") == 0)
3040     return run_sfdisk_N (cmd, argc, argv);
3041   else
3042   if (strcasecmp (cmd, "sfdisk_l") == 0 || strcasecmp (cmd, "sfdisk-l") == 0)
3043     return run_sfdisk_l (cmd, argc, argv);
3044   else
3045   if (strcasecmp (cmd, "sfdisk_kernel_geometry") == 0 || strcasecmp (cmd, "sfdisk-kernel-geometry") == 0)
3046     return run_sfdisk_kernel_geometry (cmd, argc, argv);
3047   else
3048   if (strcasecmp (cmd, "sfdisk_disk_geometry") == 0 || strcasecmp (cmd, "sfdisk-disk-geometry") == 0)
3049     return run_sfdisk_disk_geometry (cmd, argc, argv);
3050   else
3051   if (strcasecmp (cmd, "vg_activate_all") == 0 || strcasecmp (cmd, "vg-activate-all") == 0)
3052     return run_vg_activate_all (cmd, argc, argv);
3053   else
3054   if (strcasecmp (cmd, "vg_activate") == 0 || strcasecmp (cmd, "vg-activate") == 0)
3055     return run_vg_activate (cmd, argc, argv);
3056   else
3057   if (strcasecmp (cmd, "lvresize") == 0)
3058     return run_lvresize (cmd, argc, argv);
3059   else
3060   if (strcasecmp (cmd, "resize2fs") == 0)
3061     return run_resize2fs (cmd, argc, argv);
3062   else
3063   if (strcasecmp (cmd, "find") == 0)
3064     return run_find (cmd, argc, argv);
3065   else
3066   if (strcasecmp (cmd, "e2fsck_f") == 0 || strcasecmp (cmd, "e2fsck-f") == 0)
3067     return run_e2fsck_f (cmd, argc, argv);
3068   else
3069     {
3070       fprintf (stderr, "%s: unknown command\n", cmd);
3071       return -1;
3072     }
3073   return 0;
3074 }
3075