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