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