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