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