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