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