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