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