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