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