Begin to add the upload and download commands.
[libguestfs.git] / fish / cmds.c
1 /* libguestfs generated file
2  * WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.
3  * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
4  *
5  * Copyright (C) 2009 Red Hat Inc.
6  *
7  * This program is free software; you can redistribute it and/or modify
8  * it under the terms of the GNU General Public License as published by
9  * the Free Software Foundation; either version 2 of the License, or
10  * (at your option) any later version.
11  *
12  * This program is distributed in the hope that it will be useful,
13  * but WITHOUT ANY WARRANTY; without even the implied warranty of
14  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15  * GNU General Public License for more details.
16  *
17  * You should have received a copy of the GNU General Public License along
18  * with this program; if not, write to the Free Software Foundation, Inc.,
19  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20  */
21
22 #include <stdio.h>
23 #include <stdlib.h>
24 #include <string.h>
25 #include <inttypes.h>
26
27 #include <guestfs.h>
28 #include "fish.h"
29
30 void list_commands (void)
31 {
32   printf ("    %-16s     %s\n", "Command", "Description");
33   list_builtin_commands ();
34   printf ("%-20s %s\n", "add-cdrom", "add a CD-ROM disk image to examine");
35   printf ("%-20s %s\n", "add-drive", "add an image to examine or modify");
36   printf ("%-20s %s\n", "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", "chmod", "change file mode");
61   printf ("%-20s %s\n", "chown", "change file owner and group");
62   printf ("%-20s %s\n", "command", "run a command from the guest filesystem");
63   printf ("%-20s %s\n", "command-lines", "run a command, returning lines");
64   printf ("%-20s %s\n", "config", "add qemu parameters");
65   printf ("%-20s %s\n", "download", "download a file to the local machine");
66   printf ("%-20s %s\n", "exists", "test if file or directory exists");
67   printf ("%-20s %s\n", "file", "determine file type");
68   printf ("%-20s %s\n", "get-autosync", "get autosync mode");
69   printf ("%-20s %s\n", "get-path", "get the search path");
70   printf ("%-20s %s\n", "get-state", "get the current state");
71   printf ("%-20s %s\n", "get-verbose", "get verbose mode");
72   printf ("%-20s %s\n", "is-busy", "is busy processing a command");
73   printf ("%-20s %s\n", "is-config", "is in configuration state");
74   printf ("%-20s %s\n", "is-dir", "test if file exists");
75   printf ("%-20s %s\n", "is-file", "test if file exists");
76   printf ("%-20s %s\n", "is-launching", "is launching subprocess");
77   printf ("%-20s %s\n", "is-ready", "is ready to accept commands");
78   printf ("%-20s %s\n", "kill-subprocess", "kill the qemu subprocess");
79   printf ("%-20s %s\n", "launch", "launch the qemu subprocess");
80   printf ("%-20s %s\n", "list-devices", "list the block devices");
81   printf ("%-20s %s\n", "list-partitions", "list the partitions");
82   printf ("%-20s %s\n", "ll", "list the files in a directory (long format)");
83   printf ("%-20s %s\n", "ls", "list the files in a directory");
84   printf ("%-20s %s\n", "lstat", "get file information for a symbolic link");
85   printf ("%-20s %s\n", "lvcreate", "create an LVM volume group");
86   printf ("%-20s %s\n", "lvm-remove-all", "remove all LVM LVs, VGs and PVs");
87   printf ("%-20s %s\n", "lvs", "list the LVM logical volumes (LVs)");
88   printf ("%-20s %s\n", "lvs-full", "list the LVM logical volumes (LVs)");
89   printf ("%-20s %s\n", "mkdir", "create a directory");
90   printf ("%-20s %s\n", "mkdir-p", "create a directory and parents");
91   printf ("%-20s %s\n", "mkfs", "make a filesystem");
92   printf ("%-20s %s\n", "mount", "mount a guest disk at a position in the filesystem");
93   printf ("%-20s %s\n", "mounts", "show mounted filesystems");
94   printf ("%-20s %s\n", "pvcreate", "create an LVM physical volume");
95   printf ("%-20s %s\n", "pvs", "list the LVM physical volumes (PVs)");
96   printf ("%-20s %s\n", "pvs-full", "list the LVM physical volumes (PVs)");
97   printf ("%-20s %s\n", "read-lines", "read file as lines");
98   printf ("%-20s %s\n", "rm", "remove a file");
99   printf ("%-20s %s\n", "rm-rf", "remove a file or directory recursively");
100   printf ("%-20s %s\n", "rmdir", "remove a directory");
101   printf ("%-20s %s\n", "set-autosync", "set autosync mode");
102   printf ("%-20s %s\n", "set-path", "set the search path");
103   printf ("%-20s %s\n", "set-verbose", "set verbose mode");
104   printf ("%-20s %s\n", "sfdisk", "create partitions on a block device");
105   printf ("%-20s %s\n", "stat", "get file information");
106   printf ("%-20s %s\n", "statvfs", "get file system statistics");
107   printf ("%-20s %s\n", "sync", "sync disks, writes are flushed through to the disk image");
108   printf ("%-20s %s\n", "touch", "update file timestamps or create a new file");
109   printf ("%-20s %s\n", "tune2fs-l", "get ext2/ext3 superblock details");
110   printf ("%-20s %s\n", "umount", "unmount a filesystem");
111   printf ("%-20s %s\n", "umount-all", "unmount all filesystems");
112   printf ("%-20s %s\n", "upload", "upload a file from the local machine");
113   printf ("%-20s %s\n", "vgcreate", "create an LVM volume group");
114   printf ("%-20s %s\n", "vgs", "list the LVM volume groups (VGs)");
115   printf ("%-20s %s\n", "vgs-full", "list the LVM volume groups (VGs)");
116   printf ("%-20s %s\n", "write-file", "create a file");
117   printf ("    Use -h <cmd> / help <cmd> to show detailed help for a command.\n");
118 }
119
120 void display_command (const char *cmd)
121 {
122   if (strcasecmp (cmd, "launch") == 0 || strcasecmp (cmd, "run") == 0)
123     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.");
124   else
125   if (strcasecmp (cmd, "kill_subprocess") == 0 || strcasecmp (cmd, "kill-subprocess") == 0)
126     pod2text ("kill-subprocess - kill the qemu subprocess", " kill-subprocess\n\nThis kills the qemu subprocess.  You should never need to call this.");
127   else
128   if (strcasecmp (cmd, "add_drive") == 0 || strcasecmp (cmd, "add-drive") == 0 || strcasecmp (cmd, "add") == 0)
129     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.");
130   else
131   if (strcasecmp (cmd, "add_cdrom") == 0 || strcasecmp (cmd, "add-cdrom") == 0 || strcasecmp (cmd, "cdrom") == 0)
132     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.");
133   else
134   if (strcasecmp (cmd, "config") == 0)
135     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.");
136   else
137   if (strcasecmp (cmd, "set_path") == 0 || strcasecmp (cmd, "set-path") == 0 || strcasecmp (cmd, "path") == 0)
138     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.");
139   else
140   if (strcasecmp (cmd, "get_path") == 0 || strcasecmp (cmd, "get-path") == 0)
141     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.");
142   else
143   if (strcasecmp (cmd, "set_autosync") == 0 || strcasecmp (cmd, "set-autosync") == 0 || strcasecmp (cmd, "autosync") == 0)
144     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<sync> when the handle is closed\n(also if the program exits without closing handles).\n\nYou can use 'autosync' as an alias for this command.");
145   else
146   if (strcasecmp (cmd, "get_autosync") == 0 || strcasecmp (cmd, "get-autosync") == 0)
147     pod2text ("get-autosync - get autosync mode", " get-autosync\n\nGet the autosync flag.");
148   else
149   if (strcasecmp (cmd, "set_verbose") == 0 || strcasecmp (cmd, "set-verbose") == 0 || strcasecmp (cmd, "verbose") == 0)
150     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.");
151   else
152   if (strcasecmp (cmd, "get_verbose") == 0 || strcasecmp (cmd, "get-verbose") == 0)
153     pod2text ("get-verbose - get verbose mode", " get-verbose\n\nThis returns the verbose messages flag.");
154   else
155   if (strcasecmp (cmd, "is_ready") == 0 || strcasecmp (cmd, "is-ready") == 0)
156     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)>.");
157   else
158   if (strcasecmp (cmd, "is_config") == 0 || strcasecmp (cmd, "is-config") == 0)
159     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)>.");
160   else
161   if (strcasecmp (cmd, "is_launching") == 0 || strcasecmp (cmd, "is-launching") == 0)
162     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)>.");
163   else
164   if (strcasecmp (cmd, "is_busy") == 0 || strcasecmp (cmd, "is-busy") == 0)
165     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)>.");
166   else
167   if (strcasecmp (cmd, "get_state") == 0 || strcasecmp (cmd, "get-state") == 0)
168     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)>.");
169   else
170   if (strcasecmp (cmd, "mount") == 0)
171     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.");
172   else
173   if (strcasecmp (cmd, "sync") == 0)
174     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.");
175   else
176   if (strcasecmp (cmd, "touch") == 0)
177     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.");
178   else
179   if (strcasecmp (cmd, "cat") == 0)
180     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.");
181   else
182   if (strcasecmp (cmd, "ll") == 0)
183     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.");
184   else
185   if (strcasecmp (cmd, "ls") == 0)
186     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.");
187   else
188   if (strcasecmp (cmd, "list_devices") == 0 || strcasecmp (cmd, "list-devices") == 0)
189     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>");
190   else
191   if (strcasecmp (cmd, "list_partitions") == 0 || strcasecmp (cmd, "list-partitions") == 0)
192     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>.");
193   else
194   if (strcasecmp (cmd, "pvs") == 0)
195     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>.");
196   else
197   if (strcasecmp (cmd, "vgs") == 0)
198     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>.");
199   else
200   if (strcasecmp (cmd, "lvs") == 0)
201     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>.");
202   else
203   if (strcasecmp (cmd, "pvs_full") == 0 || strcasecmp (cmd, "pvs-full") == 0)
204     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.");
205   else
206   if (strcasecmp (cmd, "vgs_full") == 0 || strcasecmp (cmd, "vgs-full") == 0)
207     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.");
208   else
209   if (strcasecmp (cmd, "lvs_full") == 0 || strcasecmp (cmd, "lvs-full") == 0)
210     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.");
211   else
212   if (strcasecmp (cmd, "read_lines") == 0 || strcasecmp (cmd, "read-lines") == 0)
213     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.");
214   else
215   if (strcasecmp (cmd, "aug_init") == 0 || strcasecmp (cmd, "aug-init") == 0)
216     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/>.");
217   else
218   if (strcasecmp (cmd, "aug_close") == 0 || strcasecmp (cmd, "aug-close") == 0)
219     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.");
220   else
221   if (strcasecmp (cmd, "aug_defvar") == 0 || strcasecmp (cmd, "aug-defvar") == 0)
222     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.");
223   else
224   if (strcasecmp (cmd, "aug_defnode") == 0 || strcasecmp (cmd, "aug-defnode") == 0)
225     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.");
226   else
227   if (strcasecmp (cmd, "aug_get") == 0 || strcasecmp (cmd, "aug-get") == 0)
228     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.");
229   else
230   if (strcasecmp (cmd, "aug_set") == 0 || strcasecmp (cmd, "aug-set") == 0)
231     pod2text ("aug-set - set Augeas path to value", " aug-set <path> <val>\n\nSet the value associated with C<path> to C<value>.");
232   else
233   if (strcasecmp (cmd, "aug_insert") == 0 || strcasecmp (cmd, "aug-insert") == 0)
234     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]>.");
235   else
236   if (strcasecmp (cmd, "aug_rm") == 0 || strcasecmp (cmd, "aug-rm") == 0)
237     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.");
238   else
239   if (strcasecmp (cmd, "aug_mv") == 0 || strcasecmp (cmd, "aug-mv") == 0)
240     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.");
241   else
242   if (strcasecmp (cmd, "aug_match") == 0 || strcasecmp (cmd, "aug-match") == 0)
243     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.");
244   else
245   if (strcasecmp (cmd, "aug_save") == 0 || strcasecmp (cmd, "aug-save") == 0)
246     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.");
247   else
248   if (strcasecmp (cmd, "aug_load") == 0 || strcasecmp (cmd, "aug-load") == 0)
249     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.");
250   else
251   if (strcasecmp (cmd, "aug_ls") == 0 || strcasecmp (cmd, "aug-ls") == 0)
252     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.");
253   else
254   if (strcasecmp (cmd, "rm") == 0)
255     pod2text ("rm - remove a file", " rm <path>\n\nRemove the single file C<path>.");
256   else
257   if (strcasecmp (cmd, "rmdir") == 0)
258     pod2text ("rmdir - remove a directory", " rmdir <path>\n\nRemove the single directory C<path>.");
259   else
260   if (strcasecmp (cmd, "rm_rf") == 0 || strcasecmp (cmd, "rm-rf") == 0)
261     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.");
262   else
263   if (strcasecmp (cmd, "mkdir") == 0)
264     pod2text ("mkdir - create a directory", " mkdir <path>\n\nCreate a directory named C<path>.");
265   else
266   if (strcasecmp (cmd, "mkdir_p") == 0 || strcasecmp (cmd, "mkdir-p") == 0)
267     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.");
268   else
269   if (strcasecmp (cmd, "chmod") == 0)
270     pod2text ("chmod - change file mode", " chmod <mode> <path>\n\nChange the mode (permissions) of C<path> to C<mode>.  Only\nnumeric modes are supported.");
271   else
272   if (strcasecmp (cmd, "chown") == 0)
273     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).");
274   else
275   if (strcasecmp (cmd, "exists") == 0)
276     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>.");
277   else
278   if (strcasecmp (cmd, "is_file") == 0 || strcasecmp (cmd, "is-file") == 0)
279     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>.");
280   else
281   if (strcasecmp (cmd, "is_dir") == 0 || strcasecmp (cmd, "is-dir") == 0)
282     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>.");
283   else
284   if (strcasecmp (cmd, "pvcreate") == 0)
285     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>.");
286   else
287   if (strcasecmp (cmd, "vgcreate") == 0)
288     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>.");
289   else
290   if (strcasecmp (cmd, "lvcreate") == 0)
291     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.");
292   else
293   if (strcasecmp (cmd, "mkfs") == 0)
294     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>.");
295   else
296   if (strcasecmp (cmd, "sfdisk") == 0)
297     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>.");
298   else
299   if (strcasecmp (cmd, "write_file") == 0 || strcasecmp (cmd, "write-file") == 0)
300     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.");
301   else
302   if (strcasecmp (cmd, "umount") == 0 || strcasecmp (cmd, "unmount") == 0)
303     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.");
304   else
305   if (strcasecmp (cmd, "mounts") == 0)
306     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.");
307   else
308   if (strcasecmp (cmd, "umount_all") == 0 || strcasecmp (cmd, "umount-all") == 0 || strcasecmp (cmd, "unmount-all") == 0)
309     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.");
310   else
311   if (strcasecmp (cmd, "lvm_remove_all") == 0 || strcasecmp (cmd, "lvm-remove-all") == 0)
312     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>.");
313   else
314   if (strcasecmp (cmd, "file") == 0)
315     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).");
316   else
317   if (strcasecmp (cmd, "command") == 0)
318     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.");
319   else
320   if (strcasecmp (cmd, "command_lines") == 0 || strcasecmp (cmd, "command-lines") == 0)
321     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.");
322   else
323   if (strcasecmp (cmd, "stat") == 0)
324     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.");
325   else
326   if (strcasecmp (cmd, "lstat") == 0)
327     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.");
328   else
329   if (strcasecmp (cmd, "statvfs") == 0)
330     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.");
331   else
332   if (strcasecmp (cmd, "tune2fs_l") == 0 || strcasecmp (cmd, "tune2fs-l") == 0)
333     pod2text ("tune2fs-l - get ext2/ext3 superblock details", " tune2fs-l <device>\n\nThis returns the contents of the ext2 or ext3 filesystem superblock\non 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.");
334   else
335   if (strcasecmp (cmd, "blockdev_setro") == 0 || strcasecmp (cmd, "blockdev-setro") == 0)
336     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.");
337   else
338   if (strcasecmp (cmd, "blockdev_setrw") == 0 || strcasecmp (cmd, "blockdev-setrw") == 0)
339     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.");
340   else
341   if (strcasecmp (cmd, "blockdev_getro") == 0 || strcasecmp (cmd, "blockdev-getro") == 0)
342     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.");
343   else
344   if (strcasecmp (cmd, "blockdev_getss") == 0 || strcasecmp (cmd, "blockdev-getss") == 0)
345     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.");
346   else
347   if (strcasecmp (cmd, "blockdev_getbsz") == 0 || strcasecmp (cmd, "blockdev-getbsz") == 0)
348     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.");
349   else
350   if (strcasecmp (cmd, "blockdev_setbsz") == 0 || strcasecmp (cmd, "blockdev-setbsz") == 0)
351     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.");
352   else
353   if (strcasecmp (cmd, "blockdev_getsz") == 0 || strcasecmp (cmd, "blockdev-getsz") == 0)
354     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.");
355   else
356   if (strcasecmp (cmd, "blockdev_getsize64") == 0 || strcasecmp (cmd, "blockdev-getsize64") == 0)
357     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.");
358   else
359   if (strcasecmp (cmd, "blockdev_flushbufs") == 0 || strcasecmp (cmd, "blockdev-flushbufs") == 0)
360     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.");
361   else
362   if (strcasecmp (cmd, "blockdev_rereadpt") == 0 || strcasecmp (cmd, "blockdev-rereadpt") == 0)
363     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.");
364   else
365   if (strcasecmp (cmd, "upload") == 0)
366     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>.");
367   else
368   if (strcasecmp (cmd, "download") == 0)
369     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>.");
370   else
371     display_builtin_command (cmd);
372 }
373
374 static void print_pv (struct guestfs_lvm_pv *pv)
375 {
376   int i;
377
378   printf ("pv_name: %s\n", pv->pv_name);
379   printf ("pv_uuid: ");
380   for (i = 0; i < 32; ++i)
381     printf ("%c", pv->pv_uuid[i]);
382   printf ("\n");
383   printf ("pv_fmt: %s\n", pv->pv_fmt);
384   printf ("pv_size: %" PRIu64 "\n", pv->pv_size);
385   printf ("dev_size: %" PRIu64 "\n", pv->dev_size);
386   printf ("pv_free: %" PRIu64 "\n", pv->pv_free);
387   printf ("pv_used: %" PRIu64 "\n", pv->pv_used);
388   printf ("pv_attr: %s\n", pv->pv_attr);
389   printf ("pv_pe_count: %" PRIi64 "\n", pv->pv_pe_count);
390   printf ("pv_pe_alloc_count: %" PRIi64 "\n", pv->pv_pe_alloc_count);
391   printf ("pv_tags: %s\n", pv->pv_tags);
392   printf ("pe_start: %" PRIu64 "\n", pv->pe_start);
393   printf ("pv_mda_count: %" PRIi64 "\n", pv->pv_mda_count);
394   printf ("pv_mda_free: %" PRIu64 "\n", pv->pv_mda_free);
395 }
396
397 static void print_pv_list (struct guestfs_lvm_pv_list *pvs)
398 {
399   int i;
400
401   for (i = 0; i < pvs->len; ++i)
402     print_pv (&pvs->val[i]);
403 }
404
405 static void print_vg (struct guestfs_lvm_vg *vg)
406 {
407   int i;
408
409   printf ("vg_name: %s\n", vg->vg_name);
410   printf ("vg_uuid: ");
411   for (i = 0; i < 32; ++i)
412     printf ("%c", vg->vg_uuid[i]);
413   printf ("\n");
414   printf ("vg_fmt: %s\n", vg->vg_fmt);
415   printf ("vg_attr: %s\n", vg->vg_attr);
416   printf ("vg_size: %" PRIu64 "\n", vg->vg_size);
417   printf ("vg_free: %" PRIu64 "\n", vg->vg_free);
418   printf ("vg_sysid: %s\n", vg->vg_sysid);
419   printf ("vg_extent_size: %" PRIu64 "\n", vg->vg_extent_size);
420   printf ("vg_extent_count: %" PRIi64 "\n", vg->vg_extent_count);
421   printf ("vg_free_count: %" PRIi64 "\n", vg->vg_free_count);
422   printf ("max_lv: %" PRIi64 "\n", vg->max_lv);
423   printf ("max_pv: %" PRIi64 "\n", vg->max_pv);
424   printf ("pv_count: %" PRIi64 "\n", vg->pv_count);
425   printf ("lv_count: %" PRIi64 "\n", vg->lv_count);
426   printf ("snap_count: %" PRIi64 "\n", vg->snap_count);
427   printf ("vg_seqno: %" PRIi64 "\n", vg->vg_seqno);
428   printf ("vg_tags: %s\n", vg->vg_tags);
429   printf ("vg_mda_count: %" PRIi64 "\n", vg->vg_mda_count);
430   printf ("vg_mda_free: %" PRIu64 "\n", vg->vg_mda_free);
431 }
432
433 static void print_vg_list (struct guestfs_lvm_vg_list *vgs)
434 {
435   int i;
436
437   for (i = 0; i < vgs->len; ++i)
438     print_vg (&vgs->val[i]);
439 }
440
441 static void print_lv (struct guestfs_lvm_lv *lv)
442 {
443   int i;
444
445   printf ("lv_name: %s\n", lv->lv_name);
446   printf ("lv_uuid: ");
447   for (i = 0; i < 32; ++i)
448     printf ("%c", lv->lv_uuid[i]);
449   printf ("\n");
450   printf ("lv_attr: %s\n", lv->lv_attr);
451   printf ("lv_major: %" PRIi64 "\n", lv->lv_major);
452   printf ("lv_minor: %" PRIi64 "\n", lv->lv_minor);
453   printf ("lv_kernel_major: %" PRIi64 "\n", lv->lv_kernel_major);
454   printf ("lv_kernel_minor: %" PRIi64 "\n", lv->lv_kernel_minor);
455   printf ("lv_size: %" PRIu64 "\n", lv->lv_size);
456   printf ("seg_count: %" PRIi64 "\n", lv->seg_count);
457   printf ("origin: %s\n", lv->origin);
458   if (lv->snap_percent >= 0) printf ("snap_percent: %g %%\n", lv->snap_percent);
459   else printf ("snap_percent: \n");
460   if (lv->copy_percent >= 0) printf ("copy_percent: %g %%\n", lv->copy_percent);
461   else printf ("copy_percent: \n");
462   printf ("move_pv: %s\n", lv->move_pv);
463   printf ("lv_tags: %s\n", lv->lv_tags);
464   printf ("mirror_log: %s\n", lv->mirror_log);
465   printf ("modules: %s\n", lv->modules);
466 }
467
468 static void print_lv_list (struct guestfs_lvm_lv_list *lvs)
469 {
470   int i;
471
472   for (i = 0; i < lvs->len; ++i)
473     print_lv (&lvs->val[i]);
474 }
475
476 static void print_stat (struct guestfs_stat *stat)
477 {
478   printf ("dev: %" PRIi64 "\n", stat->dev);
479   printf ("ino: %" PRIi64 "\n", stat->ino);
480   printf ("mode: %" PRIi64 "\n", stat->mode);
481   printf ("nlink: %" PRIi64 "\n", stat->nlink);
482   printf ("uid: %" PRIi64 "\n", stat->uid);
483   printf ("gid: %" PRIi64 "\n", stat->gid);
484   printf ("rdev: %" PRIi64 "\n", stat->rdev);
485   printf ("size: %" PRIi64 "\n", stat->size);
486   printf ("blksize: %" PRIi64 "\n", stat->blksize);
487   printf ("blocks: %" PRIi64 "\n", stat->blocks);
488   printf ("atime: %" PRIi64 "\n", stat->atime);
489   printf ("mtime: %" PRIi64 "\n", stat->mtime);
490   printf ("ctime: %" PRIi64 "\n", stat->ctime);
491 }
492
493 static void print_statvfs (struct guestfs_statvfs *statvfs)
494 {
495   printf ("bsize: %" PRIi64 "\n", statvfs->bsize);
496   printf ("frsize: %" PRIi64 "\n", statvfs->frsize);
497   printf ("blocks: %" PRIi64 "\n", statvfs->blocks);
498   printf ("bfree: %" PRIi64 "\n", statvfs->bfree);
499   printf ("bavail: %" PRIi64 "\n", statvfs->bavail);
500   printf ("files: %" PRIi64 "\n", statvfs->files);
501   printf ("ffree: %" PRIi64 "\n", statvfs->ffree);
502   printf ("favail: %" PRIi64 "\n", statvfs->favail);
503   printf ("fsid: %" PRIi64 "\n", statvfs->fsid);
504   printf ("flag: %" PRIi64 "\n", statvfs->flag);
505   printf ("namemax: %" PRIi64 "\n", statvfs->namemax);
506 }
507
508 static int run_launch (const char *cmd, int argc, char *argv[])
509 {
510   int r;
511   if (argc != 0) {
512     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
513     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
514     return -1;
515   }
516   r = launch (g);
517   return r;
518 }
519
520 static int run_kill_subprocess (const char *cmd, int argc, char *argv[])
521 {
522   int r;
523   if (argc != 0) {
524     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
525     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
526     return -1;
527   }
528   r = guestfs_kill_subprocess (g);
529   return r;
530 }
531
532 static int run_add_drive (const char *cmd, int argc, char *argv[])
533 {
534   int r;
535   const char *filename;
536   if (argc != 1) {
537     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
538     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
539     return -1;
540   }
541   filename = argv[0];
542   r = guestfs_add_drive (g, filename);
543   return r;
544 }
545
546 static int run_add_cdrom (const char *cmd, int argc, char *argv[])
547 {
548   int r;
549   const char *filename;
550   if (argc != 1) {
551     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
552     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
553     return -1;
554   }
555   filename = argv[0];
556   r = guestfs_add_cdrom (g, filename);
557   return r;
558 }
559
560 static int run_config (const char *cmd, int argc, char *argv[])
561 {
562   int r;
563   const char *qemuparam;
564   const char *qemuvalue;
565   if (argc != 2) {
566     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
567     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
568     return -1;
569   }
570   qemuparam = argv[0];
571   qemuvalue = strcmp (argv[1], "") != 0 ? argv[1] : NULL;
572   r = guestfs_config (g, qemuparam, qemuvalue);
573   return r;
574 }
575
576 static int run_set_path (const char *cmd, int argc, char *argv[])
577 {
578   int r;
579   const char *path;
580   if (argc != 1) {
581     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
582     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
583     return -1;
584   }
585   path = argv[0];
586   r = guestfs_set_path (g, path);
587   return r;
588 }
589
590 static int run_get_path (const char *cmd, int argc, char *argv[])
591 {
592   const char *r;
593   if (argc != 0) {
594     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
595     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
596     return -1;
597   }
598   r = guestfs_get_path (g);
599   if (r == NULL) return -1;
600   printf ("%s\n", r);
601   return 0;
602 }
603
604 static int run_set_autosync (const char *cmd, int argc, char *argv[])
605 {
606   int r;
607   int autosync;
608   if (argc != 1) {
609     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
610     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
611     return -1;
612   }
613   autosync = is_true (argv[0]) ? 1 : 0;
614   r = guestfs_set_autosync (g, autosync);
615   return r;
616 }
617
618 static int run_get_autosync (const char *cmd, int argc, char *argv[])
619 {
620   int r;
621   if (argc != 0) {
622     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
623     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
624     return -1;
625   }
626   r = guestfs_get_autosync (g);
627   if (r == -1) return -1;
628   if (r) printf ("true\n"); else printf ("false\n");
629   return 0;
630 }
631
632 static int run_set_verbose (const char *cmd, int argc, char *argv[])
633 {
634   int r;
635   int verbose;
636   if (argc != 1) {
637     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
638     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
639     return -1;
640   }
641   verbose = is_true (argv[0]) ? 1 : 0;
642   r = guestfs_set_verbose (g, verbose);
643   return r;
644 }
645
646 static int run_get_verbose (const char *cmd, int argc, char *argv[])
647 {
648   int r;
649   if (argc != 0) {
650     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
651     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
652     return -1;
653   }
654   r = guestfs_get_verbose (g);
655   if (r == -1) return -1;
656   if (r) printf ("true\n"); else printf ("false\n");
657   return 0;
658 }
659
660 static int run_is_ready (const char *cmd, int argc, char *argv[])
661 {
662   int r;
663   if (argc != 0) {
664     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
665     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
666     return -1;
667   }
668   r = guestfs_is_ready (g);
669   if (r == -1) return -1;
670   if (r) printf ("true\n"); else printf ("false\n");
671   return 0;
672 }
673
674 static int run_is_config (const char *cmd, int argc, char *argv[])
675 {
676   int r;
677   if (argc != 0) {
678     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
679     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
680     return -1;
681   }
682   r = guestfs_is_config (g);
683   if (r == -1) return -1;
684   if (r) printf ("true\n"); else printf ("false\n");
685   return 0;
686 }
687
688 static int run_is_launching (const char *cmd, int argc, char *argv[])
689 {
690   int r;
691   if (argc != 0) {
692     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
693     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
694     return -1;
695   }
696   r = guestfs_is_launching (g);
697   if (r == -1) return -1;
698   if (r) printf ("true\n"); else printf ("false\n");
699   return 0;
700 }
701
702 static int run_is_busy (const char *cmd, int argc, char *argv[])
703 {
704   int r;
705   if (argc != 0) {
706     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
707     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
708     return -1;
709   }
710   r = guestfs_is_busy (g);
711   if (r == -1) return -1;
712   if (r) printf ("true\n"); else printf ("false\n");
713   return 0;
714 }
715
716 static int run_get_state (const char *cmd, int argc, char *argv[])
717 {
718   int r;
719   if (argc != 0) {
720     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
721     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
722     return -1;
723   }
724   r = guestfs_get_state (g);
725   if (r == -1) return -1;
726   printf ("%d\n", r);
727   return 0;
728 }
729
730 static int run_mount (const char *cmd, int argc, char *argv[])
731 {
732   int r;
733   const char *device;
734   const char *mountpoint;
735   if (argc != 2) {
736     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
737     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
738     return -1;
739   }
740   device = argv[0];
741   mountpoint = argv[1];
742   r = guestfs_mount (g, device, mountpoint);
743   return r;
744 }
745
746 static int run_sync (const char *cmd, int argc, char *argv[])
747 {
748   int r;
749   if (argc != 0) {
750     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
751     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
752     return -1;
753   }
754   r = guestfs_sync (g);
755   return r;
756 }
757
758 static int run_touch (const char *cmd, int argc, char *argv[])
759 {
760   int r;
761   const char *path;
762   if (argc != 1) {
763     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
764     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
765     return -1;
766   }
767   path = argv[0];
768   r = guestfs_touch (g, path);
769   return r;
770 }
771
772 static int run_cat (const char *cmd, int argc, char *argv[])
773 {
774   char *r;
775   const char *path;
776   if (argc != 1) {
777     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
778     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
779     return -1;
780   }
781   path = argv[0];
782   r = guestfs_cat (g, path);
783   if (r == NULL) return -1;
784   printf ("%s\n", r);
785   free (r);
786   return 0;
787 }
788
789 static int run_ll (const char *cmd, int argc, char *argv[])
790 {
791   char *r;
792   const char *directory;
793   if (argc != 1) {
794     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
795     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
796     return -1;
797   }
798   directory = argv[0];
799   r = guestfs_ll (g, directory);
800   if (r == NULL) return -1;
801   printf ("%s\n", r);
802   free (r);
803   return 0;
804 }
805
806 static int run_ls (const char *cmd, int argc, char *argv[])
807 {
808   char **r;
809   const char *directory;
810   if (argc != 1) {
811     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
812     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
813     return -1;
814   }
815   directory = argv[0];
816   r = guestfs_ls (g, directory);
817   if (r == NULL) return -1;
818   print_strings (r);
819   free_strings (r);
820   return 0;
821 }
822
823 static int run_list_devices (const char *cmd, int argc, char *argv[])
824 {
825   char **r;
826   if (argc != 0) {
827     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
828     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
829     return -1;
830   }
831   r = guestfs_list_devices (g);
832   if (r == NULL) return -1;
833   print_strings (r);
834   free_strings (r);
835   return 0;
836 }
837
838 static int run_list_partitions (const char *cmd, int argc, char *argv[])
839 {
840   char **r;
841   if (argc != 0) {
842     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
843     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
844     return -1;
845   }
846   r = guestfs_list_partitions (g);
847   if (r == NULL) return -1;
848   print_strings (r);
849   free_strings (r);
850   return 0;
851 }
852
853 static int run_pvs (const char *cmd, int argc, char *argv[])
854 {
855   char **r;
856   if (argc != 0) {
857     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
858     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
859     return -1;
860   }
861   r = guestfs_pvs (g);
862   if (r == NULL) return -1;
863   print_strings (r);
864   free_strings (r);
865   return 0;
866 }
867
868 static int run_vgs (const char *cmd, int argc, char *argv[])
869 {
870   char **r;
871   if (argc != 0) {
872     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
873     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
874     return -1;
875   }
876   r = guestfs_vgs (g);
877   if (r == NULL) return -1;
878   print_strings (r);
879   free_strings (r);
880   return 0;
881 }
882
883 static int run_lvs (const char *cmd, int argc, char *argv[])
884 {
885   char **r;
886   if (argc != 0) {
887     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
888     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
889     return -1;
890   }
891   r = guestfs_lvs (g);
892   if (r == NULL) return -1;
893   print_strings (r);
894   free_strings (r);
895   return 0;
896 }
897
898 static int run_pvs_full (const char *cmd, int argc, char *argv[])
899 {
900   struct guestfs_lvm_pv_list *r;
901   if (argc != 0) {
902     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
903     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
904     return -1;
905   }
906   r = guestfs_pvs_full (g);
907   if (r == NULL) return -1;
908   print_pv_list (r);
909   guestfs_free_lvm_pv_list (r);
910   return 0;
911 }
912
913 static int run_vgs_full (const char *cmd, int argc, char *argv[])
914 {
915   struct guestfs_lvm_vg_list *r;
916   if (argc != 0) {
917     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
918     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
919     return -1;
920   }
921   r = guestfs_vgs_full (g);
922   if (r == NULL) return -1;
923   print_vg_list (r);
924   guestfs_free_lvm_vg_list (r);
925   return 0;
926 }
927
928 static int run_lvs_full (const char *cmd, int argc, char *argv[])
929 {
930   struct guestfs_lvm_lv_list *r;
931   if (argc != 0) {
932     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
933     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
934     return -1;
935   }
936   r = guestfs_lvs_full (g);
937   if (r == NULL) return -1;
938   print_lv_list (r);
939   guestfs_free_lvm_lv_list (r);
940   return 0;
941 }
942
943 static int run_read_lines (const char *cmd, int argc, char *argv[])
944 {
945   char **r;
946   const char *path;
947   if (argc != 1) {
948     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
949     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
950     return -1;
951   }
952   path = argv[0];
953   r = guestfs_read_lines (g, path);
954   if (r == NULL) return -1;
955   print_strings (r);
956   free_strings (r);
957   return 0;
958 }
959
960 static int run_aug_init (const char *cmd, int argc, char *argv[])
961 {
962   int r;
963   const char *root;
964   int flags;
965   if (argc != 2) {
966     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
967     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
968     return -1;
969   }
970   root = argv[0];
971   flags = atoi (argv[1]);
972   r = guestfs_aug_init (g, root, flags);
973   return r;
974 }
975
976 static int run_aug_close (const char *cmd, int argc, char *argv[])
977 {
978   int r;
979   if (argc != 0) {
980     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
981     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
982     return -1;
983   }
984   r = guestfs_aug_close (g);
985   return r;
986 }
987
988 static int run_aug_defvar (const char *cmd, int argc, char *argv[])
989 {
990   int r;
991   const char *name;
992   const char *expr;
993   if (argc != 2) {
994     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
995     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
996     return -1;
997   }
998   name = argv[0];
999   expr = strcmp (argv[1], "") != 0 ? argv[1] : NULL;
1000   r = guestfs_aug_defvar (g, name, expr);
1001   if (r == -1) return -1;
1002   printf ("%d\n", r);
1003   return 0;
1004 }
1005
1006 static int run_aug_defnode (const char *cmd, int argc, char *argv[])
1007 {
1008   struct guestfs_int_bool *r;
1009   const char *name;
1010   const char *expr;
1011   const char *val;
1012   if (argc != 3) {
1013     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1014     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1015     return -1;
1016   }
1017   name = argv[0];
1018   expr = argv[1];
1019   val = argv[2];
1020   r = guestfs_aug_defnode (g, name, expr, val);
1021   if (r == NULL) return -1;
1022   printf ("%d, %s\n", r->i,
1023     r->b ? "true" : "false");
1024   guestfs_free_int_bool (r);
1025   return 0;
1026 }
1027
1028 static int run_aug_get (const char *cmd, int argc, char *argv[])
1029 {
1030   char *r;
1031   const char *path;
1032   if (argc != 1) {
1033     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1034     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1035     return -1;
1036   }
1037   path = argv[0];
1038   r = guestfs_aug_get (g, path);
1039   if (r == NULL) return -1;
1040   printf ("%s\n", r);
1041   free (r);
1042   return 0;
1043 }
1044
1045 static int run_aug_set (const char *cmd, int argc, char *argv[])
1046 {
1047   int r;
1048   const char *path;
1049   const char *val;
1050   if (argc != 2) {
1051     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1052     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1053     return -1;
1054   }
1055   path = argv[0];
1056   val = argv[1];
1057   r = guestfs_aug_set (g, path, val);
1058   return r;
1059 }
1060
1061 static int run_aug_insert (const char *cmd, int argc, char *argv[])
1062 {
1063   int r;
1064   const char *path;
1065   const char *label;
1066   int before;
1067   if (argc != 3) {
1068     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1069     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1070     return -1;
1071   }
1072   path = argv[0];
1073   label = argv[1];
1074   before = is_true (argv[2]) ? 1 : 0;
1075   r = guestfs_aug_insert (g, path, label, before);
1076   return r;
1077 }
1078
1079 static int run_aug_rm (const char *cmd, int argc, char *argv[])
1080 {
1081   int r;
1082   const char *path;
1083   if (argc != 1) {
1084     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1085     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1086     return -1;
1087   }
1088   path = argv[0];
1089   r = guestfs_aug_rm (g, path);
1090   if (r == -1) return -1;
1091   printf ("%d\n", r);
1092   return 0;
1093 }
1094
1095 static int run_aug_mv (const char *cmd, int argc, char *argv[])
1096 {
1097   int r;
1098   const char *src;
1099   const char *dest;
1100   if (argc != 2) {
1101     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1102     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1103     return -1;
1104   }
1105   src = argv[0];
1106   dest = argv[1];
1107   r = guestfs_aug_mv (g, src, dest);
1108   return r;
1109 }
1110
1111 static int run_aug_match (const char *cmd, int argc, char *argv[])
1112 {
1113   char **r;
1114   const char *path;
1115   if (argc != 1) {
1116     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1117     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1118     return -1;
1119   }
1120   path = argv[0];
1121   r = guestfs_aug_match (g, path);
1122   if (r == NULL) return -1;
1123   print_strings (r);
1124   free_strings (r);
1125   return 0;
1126 }
1127
1128 static int run_aug_save (const char *cmd, int argc, char *argv[])
1129 {
1130   int r;
1131   if (argc != 0) {
1132     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1133     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1134     return -1;
1135   }
1136   r = guestfs_aug_save (g);
1137   return r;
1138 }
1139
1140 static int run_aug_load (const char *cmd, int argc, char *argv[])
1141 {
1142   int r;
1143   if (argc != 0) {
1144     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1145     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1146     return -1;
1147   }
1148   r = guestfs_aug_load (g);
1149   return r;
1150 }
1151
1152 static int run_aug_ls (const char *cmd, int argc, char *argv[])
1153 {
1154   char **r;
1155   const char *path;
1156   if (argc != 1) {
1157     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1158     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1159     return -1;
1160   }
1161   path = argv[0];
1162   r = guestfs_aug_ls (g, path);
1163   if (r == NULL) return -1;
1164   print_strings (r);
1165   free_strings (r);
1166   return 0;
1167 }
1168
1169 static int run_rm (const char *cmd, int argc, char *argv[])
1170 {
1171   int r;
1172   const char *path;
1173   if (argc != 1) {
1174     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1175     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1176     return -1;
1177   }
1178   path = argv[0];
1179   r = guestfs_rm (g, path);
1180   return r;
1181 }
1182
1183 static int run_rmdir (const char *cmd, int argc, char *argv[])
1184 {
1185   int r;
1186   const char *path;
1187   if (argc != 1) {
1188     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1189     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1190     return -1;
1191   }
1192   path = argv[0];
1193   r = guestfs_rmdir (g, path);
1194   return r;
1195 }
1196
1197 static int run_rm_rf (const char *cmd, int argc, char *argv[])
1198 {
1199   int r;
1200   const char *path;
1201   if (argc != 1) {
1202     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1203     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1204     return -1;
1205   }
1206   path = argv[0];
1207   r = guestfs_rm_rf (g, path);
1208   return r;
1209 }
1210
1211 static int run_mkdir (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_mkdir (g, path);
1222   return r;
1223 }
1224
1225 static int run_mkdir_p (const char *cmd, int argc, char *argv[])
1226 {
1227   int r;
1228   const char *path;
1229   if (argc != 1) {
1230     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1231     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1232     return -1;
1233   }
1234   path = argv[0];
1235   r = guestfs_mkdir_p (g, path);
1236   return r;
1237 }
1238
1239 static int run_chmod (const char *cmd, int argc, char *argv[])
1240 {
1241   int r;
1242   int mode;
1243   const char *path;
1244   if (argc != 2) {
1245     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1246     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1247     return -1;
1248   }
1249   mode = atoi (argv[0]);
1250   path = argv[1];
1251   r = guestfs_chmod (g, mode, path);
1252   return r;
1253 }
1254
1255 static int run_chown (const char *cmd, int argc, char *argv[])
1256 {
1257   int r;
1258   int owner;
1259   int group;
1260   const char *path;
1261   if (argc != 3) {
1262     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1263     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1264     return -1;
1265   }
1266   owner = atoi (argv[0]);
1267   group = atoi (argv[1]);
1268   path = argv[2];
1269   r = guestfs_chown (g, owner, group, path);
1270   return r;
1271 }
1272
1273 static int run_exists (const char *cmd, int argc, char *argv[])
1274 {
1275   int r;
1276   const char *path;
1277   if (argc != 1) {
1278     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1279     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1280     return -1;
1281   }
1282   path = argv[0];
1283   r = guestfs_exists (g, path);
1284   if (r == -1) return -1;
1285   if (r) printf ("true\n"); else printf ("false\n");
1286   return 0;
1287 }
1288
1289 static int run_is_file (const char *cmd, int argc, char *argv[])
1290 {
1291   int r;
1292   const char *path;
1293   if (argc != 1) {
1294     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1295     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1296     return -1;
1297   }
1298   path = argv[0];
1299   r = guestfs_is_file (g, path);
1300   if (r == -1) return -1;
1301   if (r) printf ("true\n"); else printf ("false\n");
1302   return 0;
1303 }
1304
1305 static int run_is_dir (const char *cmd, int argc, char *argv[])
1306 {
1307   int r;
1308   const char *path;
1309   if (argc != 1) {
1310     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1311     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1312     return -1;
1313   }
1314   path = argv[0];
1315   r = guestfs_is_dir (g, path);
1316   if (r == -1) return -1;
1317   if (r) printf ("true\n"); else printf ("false\n");
1318   return 0;
1319 }
1320
1321 static int run_pvcreate (const char *cmd, int argc, char *argv[])
1322 {
1323   int r;
1324   const char *device;
1325   if (argc != 1) {
1326     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1327     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1328     return -1;
1329   }
1330   device = argv[0];
1331   r = guestfs_pvcreate (g, device);
1332   return r;
1333 }
1334
1335 static int run_vgcreate (const char *cmd, int argc, char *argv[])
1336 {
1337   int r;
1338   const char *volgroup;
1339   char **physvols;
1340   if (argc != 2) {
1341     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1342     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1343     return -1;
1344   }
1345   volgroup = argv[0];
1346   physvols = parse_string_list (argv[1]);
1347   r = guestfs_vgcreate (g, volgroup, physvols);
1348   return r;
1349 }
1350
1351 static int run_lvcreate (const char *cmd, int argc, char *argv[])
1352 {
1353   int r;
1354   const char *logvol;
1355   const char *volgroup;
1356   int mbytes;
1357   if (argc != 3) {
1358     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1359     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1360     return -1;
1361   }
1362   logvol = argv[0];
1363   volgroup = argv[1];
1364   mbytes = atoi (argv[2]);
1365   r = guestfs_lvcreate (g, logvol, volgroup, mbytes);
1366   return r;
1367 }
1368
1369 static int run_mkfs (const char *cmd, int argc, char *argv[])
1370 {
1371   int r;
1372   const char *fstype;
1373   const char *device;
1374   if (argc != 2) {
1375     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1376     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1377     return -1;
1378   }
1379   fstype = argv[0];
1380   device = argv[1];
1381   r = guestfs_mkfs (g, fstype, device);
1382   return r;
1383 }
1384
1385 static int run_sfdisk (const char *cmd, int argc, char *argv[])
1386 {
1387   int r;
1388   const char *device;
1389   int cyls;
1390   int heads;
1391   int sectors;
1392   char **lines;
1393   if (argc != 5) {
1394     fprintf (stderr, "%s should have 5 parameter(s)\n", cmd);
1395     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1396     return -1;
1397   }
1398   device = argv[0];
1399   cyls = atoi (argv[1]);
1400   heads = atoi (argv[2]);
1401   sectors = atoi (argv[3]);
1402   lines = parse_string_list (argv[4]);
1403   r = guestfs_sfdisk (g, device, cyls, heads, sectors, lines);
1404   return r;
1405 }
1406
1407 static int run_write_file (const char *cmd, int argc, char *argv[])
1408 {
1409   int r;
1410   const char *path;
1411   const char *content;
1412   int size;
1413   if (argc != 3) {
1414     fprintf (stderr, "%s should have 3 parameter(s)\n", cmd);
1415     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1416     return -1;
1417   }
1418   path = argv[0];
1419   content = argv[1];
1420   size = atoi (argv[2]);
1421   r = guestfs_write_file (g, path, content, size);
1422   return r;
1423 }
1424
1425 static int run_umount (const char *cmd, int argc, char *argv[])
1426 {
1427   int r;
1428   const char *pathordevice;
1429   if (argc != 1) {
1430     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1431     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1432     return -1;
1433   }
1434   pathordevice = argv[0];
1435   r = guestfs_umount (g, pathordevice);
1436   return r;
1437 }
1438
1439 static int run_mounts (const char *cmd, int argc, char *argv[])
1440 {
1441   char **r;
1442   if (argc != 0) {
1443     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1444     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1445     return -1;
1446   }
1447   r = guestfs_mounts (g);
1448   if (r == NULL) return -1;
1449   print_strings (r);
1450   free_strings (r);
1451   return 0;
1452 }
1453
1454 static int run_umount_all (const char *cmd, int argc, char *argv[])
1455 {
1456   int r;
1457   if (argc != 0) {
1458     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1459     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1460     return -1;
1461   }
1462   r = guestfs_umount_all (g);
1463   return r;
1464 }
1465
1466 static int run_lvm_remove_all (const char *cmd, int argc, char *argv[])
1467 {
1468   int r;
1469   if (argc != 0) {
1470     fprintf (stderr, "%s should have 0 parameter(s)\n", cmd);
1471     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1472     return -1;
1473   }
1474   r = guestfs_lvm_remove_all (g);
1475   return r;
1476 }
1477
1478 static int run_file (const char *cmd, int argc, char *argv[])
1479 {
1480   char *r;
1481   const char *path;
1482   if (argc != 1) {
1483     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1484     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1485     return -1;
1486   }
1487   path = argv[0];
1488   r = guestfs_file (g, path);
1489   if (r == NULL) return -1;
1490   printf ("%s\n", r);
1491   free (r);
1492   return 0;
1493 }
1494
1495 static int run_command (const char *cmd, int argc, char *argv[])
1496 {
1497   char *r;
1498   char **arguments;
1499   if (argc != 1) {
1500     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1501     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1502     return -1;
1503   }
1504   arguments = parse_string_list (argv[0]);
1505   r = guestfs_command (g, arguments);
1506   if (r == NULL) return -1;
1507   printf ("%s\n", r);
1508   free (r);
1509   return 0;
1510 }
1511
1512 static int run_command_lines (const char *cmd, int argc, char *argv[])
1513 {
1514   char **r;
1515   char **arguments;
1516   if (argc != 1) {
1517     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1518     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1519     return -1;
1520   }
1521   arguments = parse_string_list (argv[0]);
1522   r = guestfs_command_lines (g, arguments);
1523   if (r == NULL) return -1;
1524   print_strings (r);
1525   free_strings (r);
1526   return 0;
1527 }
1528
1529 static int run_stat (const char *cmd, int argc, char *argv[])
1530 {
1531   struct guestfs_stat *r;
1532   const char *path;
1533   if (argc != 1) {
1534     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1535     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1536     return -1;
1537   }
1538   path = argv[0];
1539   r = guestfs_stat (g, path);
1540   if (r == NULL) return -1;
1541   print_stat (r);
1542   free (r);
1543   return 0;
1544 }
1545
1546 static int run_lstat (const char *cmd, int argc, char *argv[])
1547 {
1548   struct guestfs_stat *r;
1549   const char *path;
1550   if (argc != 1) {
1551     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1552     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1553     return -1;
1554   }
1555   path = argv[0];
1556   r = guestfs_lstat (g, path);
1557   if (r == NULL) return -1;
1558   print_stat (r);
1559   free (r);
1560   return 0;
1561 }
1562
1563 static int run_statvfs (const char *cmd, int argc, char *argv[])
1564 {
1565   struct guestfs_statvfs *r;
1566   const char *path;
1567   if (argc != 1) {
1568     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1569     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1570     return -1;
1571   }
1572   path = argv[0];
1573   r = guestfs_statvfs (g, path);
1574   if (r == NULL) return -1;
1575   print_statvfs (r);
1576   free (r);
1577   return 0;
1578 }
1579
1580 static int run_tune2fs_l (const char *cmd, int argc, char *argv[])
1581 {
1582   char **r;
1583   const char *device;
1584   if (argc != 1) {
1585     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1586     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1587     return -1;
1588   }
1589   device = argv[0];
1590   r = guestfs_tune2fs_l (g, device);
1591   if (r == NULL) return -1;
1592   print_table (r);
1593   free_strings (r);
1594   return 0;
1595 }
1596
1597 static int run_blockdev_setro (const char *cmd, int argc, char *argv[])
1598 {
1599   int r;
1600   const char *device;
1601   if (argc != 1) {
1602     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1603     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1604     return -1;
1605   }
1606   device = argv[0];
1607   r = guestfs_blockdev_setro (g, device);
1608   return r;
1609 }
1610
1611 static int run_blockdev_setrw (const char *cmd, int argc, char *argv[])
1612 {
1613   int r;
1614   const char *device;
1615   if (argc != 1) {
1616     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1617     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1618     return -1;
1619   }
1620   device = argv[0];
1621   r = guestfs_blockdev_setrw (g, device);
1622   return r;
1623 }
1624
1625 static int run_blockdev_getro (const char *cmd, int argc, char *argv[])
1626 {
1627   int r;
1628   const char *device;
1629   if (argc != 1) {
1630     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1631     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1632     return -1;
1633   }
1634   device = argv[0];
1635   r = guestfs_blockdev_getro (g, device);
1636   if (r == -1) return -1;
1637   if (r) printf ("true\n"); else printf ("false\n");
1638   return 0;
1639 }
1640
1641 static int run_blockdev_getss (const char *cmd, int argc, char *argv[])
1642 {
1643   int r;
1644   const char *device;
1645   if (argc != 1) {
1646     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1647     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1648     return -1;
1649   }
1650   device = argv[0];
1651   r = guestfs_blockdev_getss (g, device);
1652   if (r == -1) return -1;
1653   printf ("%d\n", r);
1654   return 0;
1655 }
1656
1657 static int run_blockdev_getbsz (const char *cmd, int argc, char *argv[])
1658 {
1659   int r;
1660   const char *device;
1661   if (argc != 1) {
1662     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1663     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1664     return -1;
1665   }
1666   device = argv[0];
1667   r = guestfs_blockdev_getbsz (g, device);
1668   if (r == -1) return -1;
1669   printf ("%d\n", r);
1670   return 0;
1671 }
1672
1673 static int run_blockdev_setbsz (const char *cmd, int argc, char *argv[])
1674 {
1675   int r;
1676   const char *device;
1677   int blocksize;
1678   if (argc != 2) {
1679     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1680     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1681     return -1;
1682   }
1683   device = argv[0];
1684   blocksize = atoi (argv[1]);
1685   r = guestfs_blockdev_setbsz (g, device, blocksize);
1686   return r;
1687 }
1688
1689 static int run_blockdev_getsz (const char *cmd, int argc, char *argv[])
1690 {
1691   int64_t r;
1692   const char *device;
1693   if (argc != 1) {
1694     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1695     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1696     return -1;
1697   }
1698   device = argv[0];
1699   r = guestfs_blockdev_getsz (g, device);
1700   if (r == -1) return -1;
1701   printf ("%" PRIi64 "\n", r);
1702   return 0;
1703 }
1704
1705 static int run_blockdev_getsize64 (const char *cmd, int argc, char *argv[])
1706 {
1707   int64_t r;
1708   const char *device;
1709   if (argc != 1) {
1710     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1711     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1712     return -1;
1713   }
1714   device = argv[0];
1715   r = guestfs_blockdev_getsize64 (g, device);
1716   if (r == -1) return -1;
1717   printf ("%" PRIi64 "\n", r);
1718   return 0;
1719 }
1720
1721 static int run_blockdev_flushbufs (const char *cmd, int argc, char *argv[])
1722 {
1723   int r;
1724   const char *device;
1725   if (argc != 1) {
1726     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1727     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1728     return -1;
1729   }
1730   device = argv[0];
1731   r = guestfs_blockdev_flushbufs (g, device);
1732   return r;
1733 }
1734
1735 static int run_blockdev_rereadpt (const char *cmd, int argc, char *argv[])
1736 {
1737   int r;
1738   const char *device;
1739   if (argc != 1) {
1740     fprintf (stderr, "%s should have 1 parameter(s)\n", cmd);
1741     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1742     return -1;
1743   }
1744   device = argv[0];
1745   r = guestfs_blockdev_rereadpt (g, device);
1746   return r;
1747 }
1748
1749 static int run_upload (const char *cmd, int argc, char *argv[])
1750 {
1751   int r;
1752   const char *filename;
1753   const char *remotefilename;
1754   if (argc != 2) {
1755     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1756     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1757     return -1;
1758   }
1759   filename = strcmp (argv[0], "-") != 0 ? argv[0] : "/dev/stdin";
1760   remotefilename = argv[1];
1761   r = guestfs_upload (g, filename, remotefilename);
1762   return r;
1763 }
1764
1765 static int run_download (const char *cmd, int argc, char *argv[])
1766 {
1767   int r;
1768   const char *remotefilename;
1769   const char *filename;
1770   if (argc != 2) {
1771     fprintf (stderr, "%s should have 2 parameter(s)\n", cmd);
1772     fprintf (stderr, "type 'help %s' for help on %s\n", cmd, cmd);
1773     return -1;
1774   }
1775   remotefilename = argv[0];
1776   filename = strcmp (argv[1], "-") != 0 ? argv[1] : "/dev/stdout";
1777   r = guestfs_download (g, remotefilename, filename);
1778   return r;
1779 }
1780
1781 int run_action (const char *cmd, int argc, char *argv[])
1782 {
1783   if (strcasecmp (cmd, "launch") == 0 || strcasecmp (cmd, "run") == 0)
1784     return run_launch (cmd, argc, argv);
1785   else
1786   if (strcasecmp (cmd, "kill_subprocess") == 0 || strcasecmp (cmd, "kill-subprocess") == 0)
1787     return run_kill_subprocess (cmd, argc, argv);
1788   else
1789   if (strcasecmp (cmd, "add_drive") == 0 || strcasecmp (cmd, "add-drive") == 0 || strcasecmp (cmd, "add") == 0)
1790     return run_add_drive (cmd, argc, argv);
1791   else
1792   if (strcasecmp (cmd, "add_cdrom") == 0 || strcasecmp (cmd, "add-cdrom") == 0 || strcasecmp (cmd, "cdrom") == 0)
1793     return run_add_cdrom (cmd, argc, argv);
1794   else
1795   if (strcasecmp (cmd, "config") == 0)
1796     return run_config (cmd, argc, argv);
1797   else
1798   if (strcasecmp (cmd, "set_path") == 0 || strcasecmp (cmd, "set-path") == 0 || strcasecmp (cmd, "path") == 0)
1799     return run_set_path (cmd, argc, argv);
1800   else
1801   if (strcasecmp (cmd, "get_path") == 0 || strcasecmp (cmd, "get-path") == 0)
1802     return run_get_path (cmd, argc, argv);
1803   else
1804   if (strcasecmp (cmd, "set_autosync") == 0 || strcasecmp (cmd, "set-autosync") == 0 || strcasecmp (cmd, "autosync") == 0)
1805     return run_set_autosync (cmd, argc, argv);
1806   else
1807   if (strcasecmp (cmd, "get_autosync") == 0 || strcasecmp (cmd, "get-autosync") == 0)
1808     return run_get_autosync (cmd, argc, argv);
1809   else
1810   if (strcasecmp (cmd, "set_verbose") == 0 || strcasecmp (cmd, "set-verbose") == 0 || strcasecmp (cmd, "verbose") == 0)
1811     return run_set_verbose (cmd, argc, argv);
1812   else
1813   if (strcasecmp (cmd, "get_verbose") == 0 || strcasecmp (cmd, "get-verbose") == 0)
1814     return run_get_verbose (cmd, argc, argv);
1815   else
1816   if (strcasecmp (cmd, "is_ready") == 0 || strcasecmp (cmd, "is-ready") == 0)
1817     return run_is_ready (cmd, argc, argv);
1818   else
1819   if (strcasecmp (cmd, "is_config") == 0 || strcasecmp (cmd, "is-config") == 0)
1820     return run_is_config (cmd, argc, argv);
1821   else
1822   if (strcasecmp (cmd, "is_launching") == 0 || strcasecmp (cmd, "is-launching") == 0)
1823     return run_is_launching (cmd, argc, argv);
1824   else
1825   if (strcasecmp (cmd, "is_busy") == 0 || strcasecmp (cmd, "is-busy") == 0)
1826     return run_is_busy (cmd, argc, argv);
1827   else
1828   if (strcasecmp (cmd, "get_state") == 0 || strcasecmp (cmd, "get-state") == 0)
1829     return run_get_state (cmd, argc, argv);
1830   else
1831   if (strcasecmp (cmd, "mount") == 0)
1832     return run_mount (cmd, argc, argv);
1833   else
1834   if (strcasecmp (cmd, "sync") == 0)
1835     return run_sync (cmd, argc, argv);
1836   else
1837   if (strcasecmp (cmd, "touch") == 0)
1838     return run_touch (cmd, argc, argv);
1839   else
1840   if (strcasecmp (cmd, "cat") == 0)
1841     return run_cat (cmd, argc, argv);
1842   else
1843   if (strcasecmp (cmd, "ll") == 0)
1844     return run_ll (cmd, argc, argv);
1845   else
1846   if (strcasecmp (cmd, "ls") == 0)
1847     return run_ls (cmd, argc, argv);
1848   else
1849   if (strcasecmp (cmd, "list_devices") == 0 || strcasecmp (cmd, "list-devices") == 0)
1850     return run_list_devices (cmd, argc, argv);
1851   else
1852   if (strcasecmp (cmd, "list_partitions") == 0 || strcasecmp (cmd, "list-partitions") == 0)
1853     return run_list_partitions (cmd, argc, argv);
1854   else
1855   if (strcasecmp (cmd, "pvs") == 0)
1856     return run_pvs (cmd, argc, argv);
1857   else
1858   if (strcasecmp (cmd, "vgs") == 0)
1859     return run_vgs (cmd, argc, argv);
1860   else
1861   if (strcasecmp (cmd, "lvs") == 0)
1862     return run_lvs (cmd, argc, argv);
1863   else
1864   if (strcasecmp (cmd, "pvs_full") == 0 || strcasecmp (cmd, "pvs-full") == 0)
1865     return run_pvs_full (cmd, argc, argv);
1866   else
1867   if (strcasecmp (cmd, "vgs_full") == 0 || strcasecmp (cmd, "vgs-full") == 0)
1868     return run_vgs_full (cmd, argc, argv);
1869   else
1870   if (strcasecmp (cmd, "lvs_full") == 0 || strcasecmp (cmd, "lvs-full") == 0)
1871     return run_lvs_full (cmd, argc, argv);
1872   else
1873   if (strcasecmp (cmd, "read_lines") == 0 || strcasecmp (cmd, "read-lines") == 0)
1874     return run_read_lines (cmd, argc, argv);
1875   else
1876   if (strcasecmp (cmd, "aug_init") == 0 || strcasecmp (cmd, "aug-init") == 0)
1877     return run_aug_init (cmd, argc, argv);
1878   else
1879   if (strcasecmp (cmd, "aug_close") == 0 || strcasecmp (cmd, "aug-close") == 0)
1880     return run_aug_close (cmd, argc, argv);
1881   else
1882   if (strcasecmp (cmd, "aug_defvar") == 0 || strcasecmp (cmd, "aug-defvar") == 0)
1883     return run_aug_defvar (cmd, argc, argv);
1884   else
1885   if (strcasecmp (cmd, "aug_defnode") == 0 || strcasecmp (cmd, "aug-defnode") == 0)
1886     return run_aug_defnode (cmd, argc, argv);
1887   else
1888   if (strcasecmp (cmd, "aug_get") == 0 || strcasecmp (cmd, "aug-get") == 0)
1889     return run_aug_get (cmd, argc, argv);
1890   else
1891   if (strcasecmp (cmd, "aug_set") == 0 || strcasecmp (cmd, "aug-set") == 0)
1892     return run_aug_set (cmd, argc, argv);
1893   else
1894   if (strcasecmp (cmd, "aug_insert") == 0 || strcasecmp (cmd, "aug-insert") == 0)
1895     return run_aug_insert (cmd, argc, argv);
1896   else
1897   if (strcasecmp (cmd, "aug_rm") == 0 || strcasecmp (cmd, "aug-rm") == 0)
1898     return run_aug_rm (cmd, argc, argv);
1899   else
1900   if (strcasecmp (cmd, "aug_mv") == 0 || strcasecmp (cmd, "aug-mv") == 0)
1901     return run_aug_mv (cmd, argc, argv);
1902   else
1903   if (strcasecmp (cmd, "aug_match") == 0 || strcasecmp (cmd, "aug-match") == 0)
1904     return run_aug_match (cmd, argc, argv);
1905   else
1906   if (strcasecmp (cmd, "aug_save") == 0 || strcasecmp (cmd, "aug-save") == 0)
1907     return run_aug_save (cmd, argc, argv);
1908   else
1909   if (strcasecmp (cmd, "aug_load") == 0 || strcasecmp (cmd, "aug-load") == 0)
1910     return run_aug_load (cmd, argc, argv);
1911   else
1912   if (strcasecmp (cmd, "aug_ls") == 0 || strcasecmp (cmd, "aug-ls") == 0)
1913     return run_aug_ls (cmd, argc, argv);
1914   else
1915   if (strcasecmp (cmd, "rm") == 0)
1916     return run_rm (cmd, argc, argv);
1917   else
1918   if (strcasecmp (cmd, "rmdir") == 0)
1919     return run_rmdir (cmd, argc, argv);
1920   else
1921   if (strcasecmp (cmd, "rm_rf") == 0 || strcasecmp (cmd, "rm-rf") == 0)
1922     return run_rm_rf (cmd, argc, argv);
1923   else
1924   if (strcasecmp (cmd, "mkdir") == 0)
1925     return run_mkdir (cmd, argc, argv);
1926   else
1927   if (strcasecmp (cmd, "mkdir_p") == 0 || strcasecmp (cmd, "mkdir-p") == 0)
1928     return run_mkdir_p (cmd, argc, argv);
1929   else
1930   if (strcasecmp (cmd, "chmod") == 0)
1931     return run_chmod (cmd, argc, argv);
1932   else
1933   if (strcasecmp (cmd, "chown") == 0)
1934     return run_chown (cmd, argc, argv);
1935   else
1936   if (strcasecmp (cmd, "exists") == 0)
1937     return run_exists (cmd, argc, argv);
1938   else
1939   if (strcasecmp (cmd, "is_file") == 0 || strcasecmp (cmd, "is-file") == 0)
1940     return run_is_file (cmd, argc, argv);
1941   else
1942   if (strcasecmp (cmd, "is_dir") == 0 || strcasecmp (cmd, "is-dir") == 0)
1943     return run_is_dir (cmd, argc, argv);
1944   else
1945   if (strcasecmp (cmd, "pvcreate") == 0)
1946     return run_pvcreate (cmd, argc, argv);
1947   else
1948   if (strcasecmp (cmd, "vgcreate") == 0)
1949     return run_vgcreate (cmd, argc, argv);
1950   else
1951   if (strcasecmp (cmd, "lvcreate") == 0)
1952     return run_lvcreate (cmd, argc, argv);
1953   else
1954   if (strcasecmp (cmd, "mkfs") == 0)
1955     return run_mkfs (cmd, argc, argv);
1956   else
1957   if (strcasecmp (cmd, "sfdisk") == 0)
1958     return run_sfdisk (cmd, argc, argv);
1959   else
1960   if (strcasecmp (cmd, "write_file") == 0 || strcasecmp (cmd, "write-file") == 0)
1961     return run_write_file (cmd, argc, argv);
1962   else
1963   if (strcasecmp (cmd, "umount") == 0 || strcasecmp (cmd, "unmount") == 0)
1964     return run_umount (cmd, argc, argv);
1965   else
1966   if (strcasecmp (cmd, "mounts") == 0)
1967     return run_mounts (cmd, argc, argv);
1968   else
1969   if (strcasecmp (cmd, "umount_all") == 0 || strcasecmp (cmd, "umount-all") == 0 || strcasecmp (cmd, "unmount-all") == 0)
1970     return run_umount_all (cmd, argc, argv);
1971   else
1972   if (strcasecmp (cmd, "lvm_remove_all") == 0 || strcasecmp (cmd, "lvm-remove-all") == 0)
1973     return run_lvm_remove_all (cmd, argc, argv);
1974   else
1975   if (strcasecmp (cmd, "file") == 0)
1976     return run_file (cmd, argc, argv);
1977   else
1978   if (strcasecmp (cmd, "command") == 0)
1979     return run_command (cmd, argc, argv);
1980   else
1981   if (strcasecmp (cmd, "command_lines") == 0 || strcasecmp (cmd, "command-lines") == 0)
1982     return run_command_lines (cmd, argc, argv);
1983   else
1984   if (strcasecmp (cmd, "stat") == 0)
1985     return run_stat (cmd, argc, argv);
1986   else
1987   if (strcasecmp (cmd, "lstat") == 0)
1988     return run_lstat (cmd, argc, argv);
1989   else
1990   if (strcasecmp (cmd, "statvfs") == 0)
1991     return run_statvfs (cmd, argc, argv);
1992   else
1993   if (strcasecmp (cmd, "tune2fs_l") == 0 || strcasecmp (cmd, "tune2fs-l") == 0)
1994     return run_tune2fs_l (cmd, argc, argv);
1995   else
1996   if (strcasecmp (cmd, "blockdev_setro") == 0 || strcasecmp (cmd, "blockdev-setro") == 0)
1997     return run_blockdev_setro (cmd, argc, argv);
1998   else
1999   if (strcasecmp (cmd, "blockdev_setrw") == 0 || strcasecmp (cmd, "blockdev-setrw") == 0)
2000     return run_blockdev_setrw (cmd, argc, argv);
2001   else
2002   if (strcasecmp (cmd, "blockdev_getro") == 0 || strcasecmp (cmd, "blockdev-getro") == 0)
2003     return run_blockdev_getro (cmd, argc, argv);
2004   else
2005   if (strcasecmp (cmd, "blockdev_getss") == 0 || strcasecmp (cmd, "blockdev-getss") == 0)
2006     return run_blockdev_getss (cmd, argc, argv);
2007   else
2008   if (strcasecmp (cmd, "blockdev_getbsz") == 0 || strcasecmp (cmd, "blockdev-getbsz") == 0)
2009     return run_blockdev_getbsz (cmd, argc, argv);
2010   else
2011   if (strcasecmp (cmd, "blockdev_setbsz") == 0 || strcasecmp (cmd, "blockdev-setbsz") == 0)
2012     return run_blockdev_setbsz (cmd, argc, argv);
2013   else
2014   if (strcasecmp (cmd, "blockdev_getsz") == 0 || strcasecmp (cmd, "blockdev-getsz") == 0)
2015     return run_blockdev_getsz (cmd, argc, argv);
2016   else
2017   if (strcasecmp (cmd, "blockdev_getsize64") == 0 || strcasecmp (cmd, "blockdev-getsize64") == 0)
2018     return run_blockdev_getsize64 (cmd, argc, argv);
2019   else
2020   if (strcasecmp (cmd, "blockdev_flushbufs") == 0 || strcasecmp (cmd, "blockdev-flushbufs") == 0)
2021     return run_blockdev_flushbufs (cmd, argc, argv);
2022   else
2023   if (strcasecmp (cmd, "blockdev_rereadpt") == 0 || strcasecmp (cmd, "blockdev-rereadpt") == 0)
2024     return run_blockdev_rereadpt (cmd, argc, argv);
2025   else
2026   if (strcasecmp (cmd, "upload") == 0)
2027     return run_upload (cmd, argc, argv);
2028   else
2029   if (strcasecmp (cmd, "download") == 0)
2030     return run_download (cmd, argc, argv);
2031   else
2032     {
2033       fprintf (stderr, "%s: unknown command\n", cmd);
2034       return -1;
2035     }
2036   return 0;
2037 }
2038