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