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