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