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