Documentation: lvcreate should say 'logical volume' (RHBZ#582953)
[libguestfs.git] / src / generator.ml
1 #!/usr/bin/env ocaml
2 (* libguestfs
3  * Copyright (C) 2009-2010 Red Hat Inc.
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
18  *)
19
20 (* This script generates a large amount of code and documentation for
21  * all the daemon actions.
22  *
23  * To add a new action there are only two files you need to change,
24  * this one to describe the interface (see the big table of
25  * 'daemon_functions' below), and daemon/<somefile>.c to write the
26  * implementation.
27  *
28  * After editing this file, run it (./src/generator.ml) to regenerate
29  * all the output files.  'make' will rerun this automatically when
30  * necessary.  Note that if you are using a separate build directory
31  * you must run generator.ml from the _source_ directory.
32  *
33  * IMPORTANT: This script should NOT print any warnings.  If it prints
34  * warnings, you should treat them as errors.
35  *
36  * OCaml tips:
37  * (1) In emacs, install tuareg-mode to display and format OCaml code
38  * correctly.  'vim' comes with a good OCaml editing mode by default.
39  * (2) Read the resources at http://ocaml-tutorial.org/
40  *)
41
42 #load "unix.cma";;
43 #load "str.cma";;
44 #directory "+xml-light";;
45 #directory "+../pkg-lib/xml-light";; (* for GODI users *)
46 #load "xml-light.cma";;
47
48 open Unix
49 open Printf
50
51 type style = ret * args
52 and ret =
53     (* "RErr" as a return value means an int used as a simple error
54      * indication, ie. 0 or -1.
55      *)
56   | RErr
57
58     (* "RInt" as a return value means an int which is -1 for error
59      * or any value >= 0 on success.  Only use this for smallish
60      * positive ints (0 <= i < 2^30).
61      *)
62   | RInt of string
63
64     (* "RInt64" is the same as RInt, but is guaranteed to be able
65      * to return a full 64 bit value, _except_ that -1 means error
66      * (so -1 cannot be a valid, non-error return value).
67      *)
68   | RInt64 of string
69
70     (* "RBool" is a bool return value which can be true/false or
71      * -1 for error.
72      *)
73   | RBool of string
74
75     (* "RConstString" is a string that refers to a constant value.
76      * The return value must NOT be NULL (since NULL indicates
77      * an error).
78      *
79      * Try to avoid using this.  In particular you cannot use this
80      * for values returned from the daemon, because there is no
81      * thread-safe way to return them in the C API.
82      *)
83   | RConstString of string
84
85     (* "RConstOptString" is an even more broken version of
86      * "RConstString".  The returned string may be NULL and there
87      * is no way to return an error indication.  Avoid using this!
88      *)
89   | RConstOptString of string
90
91     (* "RString" is a returned string.  It must NOT be NULL, since
92      * a NULL return indicates an error.  The caller frees this.
93      *)
94   | RString of string
95
96     (* "RStringList" is a list of strings.  No string in the list
97      * can be NULL.  The caller frees the strings and the array.
98      *)
99   | RStringList of string
100
101     (* "RStruct" is a function which returns a single named structure
102      * or an error indication (in C, a struct, and in other languages
103      * with varying representations, but usually very efficient).  See
104      * after the function list below for the structures.
105      *)
106   | RStruct of string * string          (* name of retval, name of struct *)
107
108     (* "RStructList" is a function which returns either a list/array
109      * of structures (could be zero-length), or an error indication.
110      *)
111   | RStructList of string * string      (* name of retval, name of struct *)
112
113     (* Key-value pairs of untyped strings.  Turns into a hashtable or
114      * dictionary in languages which support it.  DON'T use this as a
115      * general "bucket" for results.  Prefer a stronger typed return
116      * value if one is available, or write a custom struct.  Don't use
117      * this if the list could potentially be very long, since it is
118      * inefficient.  Keys should be unique.  NULLs are not permitted.
119      *)
120   | RHashtable of string
121
122     (* "RBufferOut" is handled almost exactly like RString, but
123      * it allows the string to contain arbitrary 8 bit data including
124      * ASCII NUL.  In the C API this causes an implicit extra parameter
125      * to be added of type <size_t *size_r>.  The extra parameter
126      * returns the actual size of the return buffer in bytes.
127      *
128      * Other programming languages support strings with arbitrary 8 bit
129      * data.
130      *
131      * At the RPC layer we have to use the opaque<> type instead of
132      * string<>.  Returned data is still limited to the max message
133      * size (ie. ~ 2 MB).
134      *)
135   | RBufferOut of string
136
137 and args = argt list    (* Function parameters, guestfs handle is implicit. *)
138
139     (* Note in future we should allow a "variable args" parameter as
140      * the final parameter, to allow commands like
141      *   chmod mode file [file(s)...]
142      * This is not implemented yet, but many commands (such as chmod)
143      * are currently defined with the argument order keeping this future
144      * possibility in mind.
145      *)
146 and argt =
147   | String of string    (* const char *name, cannot be NULL *)
148   | Device of string    (* /dev device name, cannot be NULL *)
149   | Pathname of string  (* file name, cannot be NULL *)
150   | Dev_or_Path of string (* /dev device name or Pathname, cannot be NULL *)
151   | OptString of string (* const char *name, may be NULL *)
152   | StringList of string(* list of strings (each string cannot be NULL) *)
153   | DeviceList of string(* list of Device names (each cannot be NULL) *)
154   | Bool of string      (* boolean *)
155   | Int of string       (* int (smallish ints, signed, <= 31 bits) *)
156   | Int64 of string     (* any 64 bit int *)
157     (* These are treated as filenames (simple string parameters) in
158      * the C API and bindings.  But in the RPC protocol, we transfer
159      * the actual file content up to or down from the daemon.
160      * FileIn: local machine -> daemon (in request)
161      * FileOut: daemon -> local machine (in reply)
162      * In guestfish (only), the special name "-" means read from
163      * stdin or write to stdout.
164      *)
165   | FileIn of string
166   | FileOut of string
167 (* Not implemented:
168     (* Opaque buffer which can contain arbitrary 8 bit data.
169      * In the C API, this is expressed as <char *, int> pair.
170      * Most other languages have a string type which can contain
171      * ASCII NUL.  We use whatever type is appropriate for each
172      * language.
173      * Buffers are limited by the total message size.  To transfer
174      * large blocks of data, use FileIn/FileOut parameters instead.
175      * To return an arbitrary buffer, use RBufferOut.
176      *)
177   | BufferIn of string
178 *)
179
180 type flags =
181   | ProtocolLimitWarning  (* display warning about protocol size limits *)
182   | DangerWillRobinson    (* flags particularly dangerous commands *)
183   | FishAlias of string   (* provide an alias for this cmd in guestfish *)
184   | FishAction of string  (* call this function in guestfish *)
185   | NotInFish             (* do not export via guestfish *)
186   | NotInDocs             (* do not add this function to documentation *)
187   | DeprecatedBy of string (* function is deprecated, use .. instead *)
188   | Optional of string    (* function is part of an optional group *)
189
190 (* You can supply zero or as many tests as you want per API call.
191  *
192  * Note that the test environment has 3 block devices, of size 500MB,
193  * 50MB and 10MB (respectively /dev/sda, /dev/sdb, /dev/sdc), and
194  * a fourth ISO block device with some known files on it (/dev/sdd).
195  *
196  * Note for partitioning purposes, the 500MB device has 1015 cylinders.
197  * Number of cylinders was 63 for IDE emulated disks with precisely
198  * the same size.  How exactly this is calculated is a mystery.
199  *
200  * The ISO block device (/dev/sdd) comes from images/test.iso.
201  *
202  * To be able to run the tests in a reasonable amount of time,
203  * the virtual machine and block devices are reused between tests.
204  * So don't try testing kill_subprocess :-x
205  *
206  * Between each test we blockdev-setrw, umount-all, lvm-remove-all.
207  *
208  * Don't assume anything about the previous contents of the block
209  * devices.  Use 'Init*' to create some initial scenarios.
210  *
211  * You can add a prerequisite clause to any individual test.  This
212  * is a run-time check, which, if it fails, causes the test to be
213  * skipped.  Useful if testing a command which might not work on
214  * all variations of libguestfs builds.  A test that has prerequisite
215  * of 'Always' is run unconditionally.
216  *
217  * In addition, packagers can skip individual tests by setting the
218  * environment variables:     eg:
219  *   SKIP_TEST_<CMD>_<NUM>=1  SKIP_TEST_COMMAND_3=1  (skips test #3 of command)
220  *   SKIP_TEST_<CMD>=1        SKIP_TEST_ZEROFREE=1   (skips all zerofree tests)
221  *)
222 type tests = (test_init * test_prereq * test) list
223 and test =
224     (* Run the command sequence and just expect nothing to fail. *)
225   | TestRun of seq
226
227     (* Run the command sequence and expect the output of the final
228      * command to be the string.
229      *)
230   | TestOutput of seq * string
231
232     (* Run the command sequence and expect the output of the final
233      * command to be the list of strings.
234      *)
235   | TestOutputList of seq * string list
236
237     (* Run the command sequence and expect the output of the final
238      * command to be the list of block devices (could be either
239      * "/dev/sd.." or "/dev/hd.." form - we don't check the 5th
240      * character of each string).
241      *)
242   | TestOutputListOfDevices of seq * string list
243
244     (* Run the command sequence and expect the output of the final
245      * command to be the integer.
246      *)
247   | TestOutputInt of seq * int
248
249     (* Run the command sequence and expect the output of the final
250      * command to be <op> <int>, eg. ">=", "1".
251      *)
252   | TestOutputIntOp of seq * string * int
253
254     (* Run the command sequence and expect the output of the final
255      * command to be a true value (!= 0 or != NULL).
256      *)
257   | TestOutputTrue of seq
258
259     (* Run the command sequence and expect the output of the final
260      * command to be a false value (== 0 or == NULL, but not an error).
261      *)
262   | TestOutputFalse of seq
263
264     (* Run the command sequence and expect the output of the final
265      * command to be a list of the given length (but don't care about
266      * content).
267      *)
268   | TestOutputLength of seq * int
269
270     (* Run the command sequence and expect the output of the final
271      * command to be a buffer (RBufferOut), ie. string + size.
272      *)
273   | TestOutputBuffer of seq * string
274
275     (* Run the command sequence and expect the output of the final
276      * command to be a structure.
277      *)
278   | TestOutputStruct of seq * test_field_compare list
279
280     (* Run the command sequence and expect the final command (only)
281      * to fail.
282      *)
283   | TestLastFail of seq
284
285 and test_field_compare =
286   | CompareWithInt of string * int
287   | CompareWithIntOp of string * string * int
288   | CompareWithString of string * string
289   | CompareFieldsIntEq of string * string
290   | CompareFieldsStrEq of string * string
291
292 (* Test prerequisites. *)
293 and test_prereq =
294     (* Test always runs. *)
295   | Always
296
297     (* Test is currently disabled - eg. it fails, or it tests some
298      * unimplemented feature.
299      *)
300   | Disabled
301
302     (* 'string' is some C code (a function body) that should return
303      * true or false.  The test will run if the code returns true.
304      *)
305   | If of string
306
307     (* As for 'If' but the test runs _unless_ the code returns true. *)
308   | Unless of string
309
310 (* Some initial scenarios for testing. *)
311 and test_init =
312     (* Do nothing, block devices could contain random stuff including
313      * LVM PVs, and some filesystems might be mounted.  This is usually
314      * a bad idea.
315      *)
316   | InitNone
317
318     (* Block devices are empty and no filesystems are mounted. *)
319   | InitEmpty
320
321     (* /dev/sda contains a single partition /dev/sda1, with random
322      * content.  /dev/sdb and /dev/sdc may have random content.
323      * No LVM.
324      *)
325   | InitPartition
326
327     (* /dev/sda contains a single partition /dev/sda1, which is formatted
328      * as ext2, empty [except for lost+found] and mounted on /.
329      * /dev/sdb and /dev/sdc may have random content.
330      * No LVM.
331      *)
332   | InitBasicFS
333
334     (* /dev/sda:
335      *   /dev/sda1 (is a PV):
336      *     /dev/VG/LV (size 8MB):
337      *       formatted as ext2, empty [except for lost+found], mounted on /
338      * /dev/sdb and /dev/sdc may have random content.
339      *)
340   | InitBasicFSonLVM
341
342     (* /dev/sdd (the ISO, see images/ directory in source)
343      * is mounted on /
344      *)
345   | InitISOFS
346
347 (* Sequence of commands for testing. *)
348 and seq = cmd list
349 and cmd = string list
350
351 (* Note about long descriptions: When referring to another
352  * action, use the format C<guestfs_other> (ie. the full name of
353  * the C function).  This will be replaced as appropriate in other
354  * language bindings.
355  *
356  * Apart from that, long descriptions are just perldoc paragraphs.
357  *)
358
359 (* Generate a random UUID (used in tests). *)
360 let uuidgen () =
361   let chan = open_process_in "uuidgen" in
362   let uuid = input_line chan in
363   (match close_process_in chan with
364    | WEXITED 0 -> ()
365    | WEXITED _ ->
366        failwith "uuidgen: process exited with non-zero status"
367    | WSIGNALED _ | WSTOPPED _ ->
368        failwith "uuidgen: process signalled or stopped by signal"
369   );
370   uuid
371
372 (* These test functions are used in the language binding tests. *)
373
374 let test_all_args = [
375   String "str";
376   OptString "optstr";
377   StringList "strlist";
378   Bool "b";
379   Int "integer";
380   Int64 "integer64";
381   FileIn "filein";
382   FileOut "fileout";
383 ]
384
385 let test_all_rets = [
386   (* except for RErr, which is tested thoroughly elsewhere *)
387   "test0rint",         RInt "valout";
388   "test0rint64",       RInt64 "valout";
389   "test0rbool",        RBool "valout";
390   "test0rconststring", RConstString "valout";
391   "test0rconstoptstring", RConstOptString "valout";
392   "test0rstring",      RString "valout";
393   "test0rstringlist",  RStringList "valout";
394   "test0rstruct",      RStruct ("valout", "lvm_pv");
395   "test0rstructlist",  RStructList ("valout", "lvm_pv");
396   "test0rhashtable",   RHashtable "valout";
397 ]
398
399 let test_functions = [
400   ("test0", (RErr, test_all_args), -1, [NotInFish; NotInDocs],
401    [],
402    "internal test function - do not use",
403    "\
404 This is an internal test function which is used to test whether
405 the automatically generated bindings can handle every possible
406 parameter type correctly.
407
408 It echos the contents of each parameter to stdout.
409
410 You probably don't want to call this function.");
411 ] @ List.flatten (
412   List.map (
413     fun (name, ret) ->
414       [(name, (ret, [String "val"]), -1, [NotInFish; NotInDocs],
415         [],
416         "internal test function - do not use",
417         "\
418 This is an internal test function which is used to test whether
419 the automatically generated bindings can handle every possible
420 return type correctly.
421
422 It converts string C<val> to the return type.
423
424 You probably don't want to call this function.");
425        (name ^ "err", (ret, []), -1, [NotInFish; NotInDocs],
426         [],
427         "internal test function - do not use",
428         "\
429 This is an internal test function which is used to test whether
430 the automatically generated bindings can handle every possible
431 return type correctly.
432
433 This function always returns an error.
434
435 You probably don't want to call this function.")]
436   ) test_all_rets
437 )
438
439 (* non_daemon_functions are any functions which don't get processed
440  * in the daemon, eg. functions for setting and getting local
441  * configuration values.
442  *)
443
444 let non_daemon_functions = test_functions @ [
445   ("launch", (RErr, []), -1, [FishAlias "run"; FishAction "launch"],
446    [],
447    "launch the qemu subprocess",
448    "\
449 Internally libguestfs is implemented by running a virtual machine
450 using L<qemu(1)>.
451
452 You should call this after configuring the handle
453 (eg. adding drives) but before performing any actions.");
454
455   ("wait_ready", (RErr, []), -1, [NotInFish],
456    [],
457    "wait until the qemu subprocess launches (no op)",
458    "\
459 This function is a no op.
460
461 In versions of the API E<lt> 1.0.71 you had to call this function
462 just after calling C<guestfs_launch> to wait for the launch
463 to complete.  However this is no longer necessary because
464 C<guestfs_launch> now does the waiting.
465
466 If you see any calls to this function in code then you can just
467 remove them, unless you want to retain compatibility with older
468 versions of the API.");
469
470   ("kill_subprocess", (RErr, []), -1, [],
471    [],
472    "kill the qemu subprocess",
473    "\
474 This kills the qemu subprocess.  You should never need to call this.");
475
476   ("add_drive", (RErr, [String "filename"]), -1, [FishAlias "add"],
477    [],
478    "add an image to examine or modify",
479    "\
480 This function adds a virtual machine disk image C<filename> to the
481 guest.  The first time you call this function, the disk appears as IDE
482 disk 0 (C</dev/sda>) in the guest, the second time as C</dev/sdb>, and
483 so on.
484
485 You don't necessarily need to be root when using libguestfs.  However
486 you obviously do need sufficient permissions to access the filename
487 for whatever operations you want to perform (ie. read access if you
488 just want to read the image or write access if you want to modify the
489 image).
490
491 This is equivalent to the qemu parameter
492 C<-drive file=filename,cache=off,if=...>.
493
494 C<cache=off> is omitted in cases where it is not supported by
495 the underlying filesystem.
496
497 C<if=...> is set at compile time by the configuration option
498 C<./configure --with-drive-if=...>.  In the rare case where you
499 might need to change this at run time, use C<guestfs_add_drive_with_if>
500 or C<guestfs_add_drive_ro_with_if>.
501
502 Note that this call checks for the existence of C<filename>.  This
503 stops you from specifying other types of drive which are supported
504 by qemu such as C<nbd:> and C<http:> URLs.  To specify those, use
505 the general C<guestfs_config> call instead.");
506
507   ("add_cdrom", (RErr, [String "filename"]), -1, [FishAlias "cdrom"],
508    [],
509    "add a CD-ROM disk image to examine",
510    "\
511 This function adds a virtual CD-ROM disk image to the guest.
512
513 This is equivalent to the qemu parameter C<-cdrom filename>.
514
515 Notes:
516
517 =over 4
518
519 =item *
520
521 This call checks for the existence of C<filename>.  This
522 stops you from specifying other types of drive which are supported
523 by qemu such as C<nbd:> and C<http:> URLs.  To specify those, use
524 the general C<guestfs_config> call instead.
525
526 =item *
527
528 If you just want to add an ISO file (often you use this as an
529 efficient way to transfer large files into the guest), then you
530 should probably use C<guestfs_add_drive_ro> instead.
531
532 =back");
533
534   ("add_drive_ro", (RErr, [String "filename"]), -1, [FishAlias "add-ro"],
535    [],
536    "add a drive in snapshot mode (read-only)",
537    "\
538 This adds a drive in snapshot mode, making it effectively
539 read-only.
540
541 Note that writes to the device are allowed, and will be seen for
542 the duration of the guestfs handle, but they are written
543 to a temporary file which is discarded as soon as the guestfs
544 handle is closed.  We don't currently have any method to enable
545 changes to be committed, although qemu can support this.
546
547 This is equivalent to the qemu parameter
548 C<-drive file=filename,snapshot=on,readonly=on,if=...>.
549
550 C<if=...> is set at compile time by the configuration option
551 C<./configure --with-drive-if=...>.  In the rare case where you
552 might need to change this at run time, use C<guestfs_add_drive_with_if>
553 or C<guestfs_add_drive_ro_with_if>.
554
555 C<readonly=on> is only added where qemu supports this option.
556
557 Note that this call checks for the existence of C<filename>.  This
558 stops you from specifying other types of drive which are supported
559 by qemu such as C<nbd:> and C<http:> URLs.  To specify those, use
560 the general C<guestfs_config> call instead.");
561
562   ("config", (RErr, [String "qemuparam"; OptString "qemuvalue"]), -1, [],
563    [],
564    "add qemu parameters",
565    "\
566 This can be used to add arbitrary qemu command line parameters
567 of the form C<-param value>.  Actually it's not quite arbitrary - we
568 prevent you from setting some parameters which would interfere with
569 parameters that we use.
570
571 The first character of C<param> string must be a C<-> (dash).
572
573 C<value> can be NULL.");
574
575   ("set_qemu", (RErr, [String "qemu"]), -1, [FishAlias "qemu"],
576    [],
577    "set the qemu binary",
578    "\
579 Set the qemu binary that we will use.
580
581 The default is chosen when the library was compiled by the
582 configure script.
583
584 You can also override this by setting the C<LIBGUESTFS_QEMU>
585 environment variable.
586
587 Setting C<qemu> to C<NULL> restores the default qemu binary.
588
589 Note that you should call this function as early as possible
590 after creating the handle.  This is because some pre-launch
591 operations depend on testing qemu features (by running C<qemu -help>).
592 If the qemu binary changes, we don't retest features, and
593 so you might see inconsistent results.  Using the environment
594 variable C<LIBGUESTFS_QEMU> is safest of all since that picks
595 the qemu binary at the same time as the handle is created.");
596
597   ("get_qemu", (RConstString "qemu", []), -1, [],
598    [InitNone, Always, TestRun (
599       [["get_qemu"]])],
600    "get the qemu binary",
601    "\
602 Return the current qemu binary.
603
604 This is always non-NULL.  If it wasn't set already, then this will
605 return the default qemu binary name.");
606
607   ("set_path", (RErr, [String "searchpath"]), -1, [FishAlias "path"],
608    [],
609    "set the search path",
610    "\
611 Set the path that libguestfs searches for kernel and initrd.img.
612
613 The default is C<$libdir/guestfs> unless overridden by setting
614 C<LIBGUESTFS_PATH> environment variable.
615
616 Setting C<path> to C<NULL> restores the default path.");
617
618   ("get_path", (RConstString "path", []), -1, [],
619    [InitNone, Always, TestRun (
620       [["get_path"]])],
621    "get the search path",
622    "\
623 Return the current search path.
624
625 This is always non-NULL.  If it wasn't set already, then this will
626 return the default path.");
627
628   ("set_append", (RErr, [OptString "append"]), -1, [FishAlias "append"],
629    [],
630    "add options to kernel command line",
631    "\
632 This function is used to add additional options to the
633 guest kernel command line.
634
635 The default is C<NULL> unless overridden by setting
636 C<LIBGUESTFS_APPEND> environment variable.
637
638 Setting C<append> to C<NULL> means I<no> additional options
639 are passed (libguestfs always adds a few of its own).");
640
641   ("get_append", (RConstOptString "append", []), -1, [],
642    (* This cannot be tested with the current framework.  The
643     * function can return NULL in normal operations, which the
644     * test framework interprets as an error.
645     *)
646    [],
647    "get the additional kernel options",
648    "\
649 Return the additional kernel options which are added to the
650 guest kernel command line.
651
652 If C<NULL> then no options are added.");
653
654   ("set_autosync", (RErr, [Bool "autosync"]), -1, [FishAlias "autosync"],
655    [],
656    "set autosync mode",
657    "\
658 If C<autosync> is true, this enables autosync.  Libguestfs will make a
659 best effort attempt to run C<guestfs_umount_all> followed by
660 C<guestfs_sync> when the handle is closed
661 (also if the program exits without closing handles).
662
663 This is disabled by default (except in guestfish where it is
664 enabled by default).");
665
666   ("get_autosync", (RBool "autosync", []), -1, [],
667    [InitNone, Always, TestRun (
668       [["get_autosync"]])],
669    "get autosync mode",
670    "\
671 Get the autosync flag.");
672
673   ("set_verbose", (RErr, [Bool "verbose"]), -1, [FishAlias "verbose"],
674    [],
675    "set verbose mode",
676    "\
677 If C<verbose> is true, this turns on verbose messages (to C<stderr>).
678
679 Verbose messages are disabled unless the environment variable
680 C<LIBGUESTFS_DEBUG> is defined and set to C<1>.");
681
682   ("get_verbose", (RBool "verbose", []), -1, [],
683    [],
684    "get verbose mode",
685    "\
686 This returns the verbose messages flag.");
687
688   ("is_ready", (RBool "ready", []), -1, [],
689    [InitNone, Always, TestOutputTrue (
690       [["is_ready"]])],
691    "is ready to accept commands",
692    "\
693 This returns true iff this handle is ready to accept commands
694 (in the C<READY> state).
695
696 For more information on states, see L<guestfs(3)>.");
697
698   ("is_config", (RBool "config", []), -1, [],
699    [InitNone, Always, TestOutputFalse (
700       [["is_config"]])],
701    "is in configuration state",
702    "\
703 This returns true iff this handle is being configured
704 (in the C<CONFIG> state).
705
706 For more information on states, see L<guestfs(3)>.");
707
708   ("is_launching", (RBool "launching", []), -1, [],
709    [InitNone, Always, TestOutputFalse (
710       [["is_launching"]])],
711    "is launching subprocess",
712    "\
713 This returns true iff this handle is launching the subprocess
714 (in the C<LAUNCHING> state).
715
716 For more information on states, see L<guestfs(3)>.");
717
718   ("is_busy", (RBool "busy", []), -1, [],
719    [InitNone, Always, TestOutputFalse (
720       [["is_busy"]])],
721    "is busy processing a command",
722    "\
723 This returns true iff this handle is busy processing a command
724 (in the C<BUSY> state).
725
726 For more information on states, see L<guestfs(3)>.");
727
728   ("get_state", (RInt "state", []), -1, [],
729    [],
730    "get the current state",
731    "\
732 This returns the current state as an opaque integer.  This is
733 only useful for printing debug and internal error messages.
734
735 For more information on states, see L<guestfs(3)>.");
736
737   ("set_memsize", (RErr, [Int "memsize"]), -1, [FishAlias "memsize"],
738    [InitNone, Always, TestOutputInt (
739       [["set_memsize"; "500"];
740        ["get_memsize"]], 500)],
741    "set memory allocated to the qemu subprocess",
742    "\
743 This sets the memory size in megabytes allocated to the
744 qemu subprocess.  This only has any effect if called before
745 C<guestfs_launch>.
746
747 You can also change this by setting the environment
748 variable C<LIBGUESTFS_MEMSIZE> before the handle is
749 created.
750
751 For more information on the architecture of libguestfs,
752 see L<guestfs(3)>.");
753
754   ("get_memsize", (RInt "memsize", []), -1, [],
755    [InitNone, Always, TestOutputIntOp (
756       [["get_memsize"]], ">=", 256)],
757    "get memory allocated to the qemu subprocess",
758    "\
759 This gets the memory size in megabytes allocated to the
760 qemu subprocess.
761
762 If C<guestfs_set_memsize> was not called
763 on this handle, and if C<LIBGUESTFS_MEMSIZE> was not set,
764 then this returns the compiled-in default value for memsize.
765
766 For more information on the architecture of libguestfs,
767 see L<guestfs(3)>.");
768
769   ("get_pid", (RInt "pid", []), -1, [FishAlias "pid"],
770    [InitNone, Always, TestOutputIntOp (
771       [["get_pid"]], ">=", 1)],
772    "get PID of qemu subprocess",
773    "\
774 Return the process ID of the qemu subprocess.  If there is no
775 qemu subprocess, then this will return an error.
776
777 This is an internal call used for debugging and testing.");
778
779   ("version", (RStruct ("version", "version"), []), -1, [],
780    [InitNone, Always, TestOutputStruct (
781       [["version"]], [CompareWithInt ("major", 1)])],
782    "get the library version number",
783    "\
784 Return the libguestfs version number that the program is linked
785 against.
786
787 Note that because of dynamic linking this is not necessarily
788 the version of libguestfs that you compiled against.  You can
789 compile the program, and then at runtime dynamically link
790 against a completely different C<libguestfs.so> library.
791
792 This call was added in version C<1.0.58>.  In previous
793 versions of libguestfs there was no way to get the version
794 number.  From C code you can use ELF weak linking tricks to find out if
795 this symbol exists (if it doesn't, then it's an earlier version).
796
797 The call returns a structure with four elements.  The first
798 three (C<major>, C<minor> and C<release>) are numbers and
799 correspond to the usual version triplet.  The fourth element
800 (C<extra>) is a string and is normally empty, but may be
801 used for distro-specific information.
802
803 To construct the original version string:
804 C<$major.$minor.$release$extra>
805
806 I<Note:> Don't use this call to test for availability
807 of features.  Distro backports makes this unreliable.  Use
808 C<guestfs_available> instead.");
809
810   ("set_selinux", (RErr, [Bool "selinux"]), -1, [FishAlias "selinux"],
811    [InitNone, Always, TestOutputTrue (
812       [["set_selinux"; "true"];
813        ["get_selinux"]])],
814    "set SELinux enabled or disabled at appliance boot",
815    "\
816 This sets the selinux flag that is passed to the appliance
817 at boot time.  The default is C<selinux=0> (disabled).
818
819 Note that if SELinux is enabled, it is always in
820 Permissive mode (C<enforcing=0>).
821
822 For more information on the architecture of libguestfs,
823 see L<guestfs(3)>.");
824
825   ("get_selinux", (RBool "selinux", []), -1, [],
826    [],
827    "get SELinux enabled flag",
828    "\
829 This returns the current setting of the selinux flag which
830 is passed to the appliance at boot time.  See C<guestfs_set_selinux>.
831
832 For more information on the architecture of libguestfs,
833 see L<guestfs(3)>.");
834
835   ("set_trace", (RErr, [Bool "trace"]), -1, [FishAlias "trace"],
836    [InitNone, Always, TestOutputFalse (
837       [["set_trace"; "false"];
838        ["get_trace"]])],
839    "enable or disable command traces",
840    "\
841 If the command trace flag is set to 1, then commands are
842 printed on stdout before they are executed in a format
843 which is very similar to the one used by guestfish.  In
844 other words, you can run a program with this enabled, and
845 you will get out a script which you can feed to guestfish
846 to perform the same set of actions.
847
848 If you want to trace C API calls into libguestfs (and
849 other libraries) then possibly a better way is to use
850 the external ltrace(1) command.
851
852 Command traces are disabled unless the environment variable
853 C<LIBGUESTFS_TRACE> is defined and set to C<1>.");
854
855   ("get_trace", (RBool "trace", []), -1, [],
856    [],
857    "get command trace enabled flag",
858    "\
859 Return the command trace flag.");
860
861   ("set_direct", (RErr, [Bool "direct"]), -1, [FishAlias "direct"],
862    [InitNone, Always, TestOutputFalse (
863       [["set_direct"; "false"];
864        ["get_direct"]])],
865    "enable or disable direct appliance mode",
866    "\
867 If the direct appliance mode flag is enabled, then stdin and
868 stdout are passed directly through to the appliance once it
869 is launched.
870
871 One consequence of this is that log messages aren't caught
872 by the library and handled by C<guestfs_set_log_message_callback>,
873 but go straight to stdout.
874
875 You probably don't want to use this unless you know what you
876 are doing.
877
878 The default is disabled.");
879
880   ("get_direct", (RBool "direct", []), -1, [],
881    [],
882    "get direct appliance mode flag",
883    "\
884 Return the direct appliance mode flag.");
885
886   ("set_recovery_proc", (RErr, [Bool "recoveryproc"]), -1, [FishAlias "recovery-proc"],
887    [InitNone, Always, TestOutputTrue (
888       [["set_recovery_proc"; "true"];
889        ["get_recovery_proc"]])],
890    "enable or disable the recovery process",
891    "\
892 If this is called with the parameter C<false> then
893 C<guestfs_launch> does not create a recovery process.  The
894 purpose of the recovery process is to stop runaway qemu
895 processes in the case where the main program aborts abruptly.
896
897 This only has any effect if called before C<guestfs_launch>,
898 and the default is true.
899
900 About the only time when you would want to disable this is
901 if the main process will fork itself into the background
902 (\"daemonize\" itself).  In this case the recovery process
903 thinks that the main program has disappeared and so kills
904 qemu, which is not very helpful.");
905
906   ("get_recovery_proc", (RBool "recoveryproc", []), -1, [],
907    [],
908    "get recovery process enabled flag",
909    "\
910 Return the recovery process enabled flag.");
911
912   ("add_drive_with_if", (RErr, [String "filename"; String "iface"]), -1, [],
913    [],
914    "add a drive specifying the QEMU block emulation to use",
915    "\
916 This is the same as C<guestfs_add_drive> but it allows you
917 to specify the QEMU interface emulation to use at run time.");
918
919   ("add_drive_ro_with_if", (RErr, [String "filename"; String "iface"]), -1, [],
920    [],
921    "add a drive read-only specifying the QEMU block emulation to use",
922    "\
923 This is the same as C<guestfs_add_drive_ro> but it allows you
924 to specify the QEMU interface emulation to use at run time.");
925
926 ]
927
928 (* daemon_functions are any functions which cause some action
929  * to take place in the daemon.
930  *)
931
932 let daemon_functions = [
933   ("mount", (RErr, [Device "device"; String "mountpoint"]), 1, [],
934    [InitEmpty, Always, TestOutput (
935       [["part_disk"; "/dev/sda"; "mbr"];
936        ["mkfs"; "ext2"; "/dev/sda1"];
937        ["mount"; "/dev/sda1"; "/"];
938        ["write_file"; "/new"; "new file contents"; "0"];
939        ["cat"; "/new"]], "new file contents")],
940    "mount a guest disk at a position in the filesystem",
941    "\
942 Mount a guest disk at a position in the filesystem.  Block devices
943 are named C</dev/sda>, C</dev/sdb> and so on, as they were added to
944 the guest.  If those block devices contain partitions, they will have
945 the usual names (eg. C</dev/sda1>).  Also LVM C</dev/VG/LV>-style
946 names can be used.
947
948 The rules are the same as for L<mount(2)>:  A filesystem must
949 first be mounted on C</> before others can be mounted.  Other
950 filesystems can only be mounted on directories which already
951 exist.
952
953 The mounted filesystem is writable, if we have sufficient permissions
954 on the underlying device.
955
956 The filesystem options C<sync> and C<noatime> are set with this
957 call, in order to improve reliability.");
958
959   ("sync", (RErr, []), 2, [],
960    [ InitEmpty, Always, TestRun [["sync"]]],
961    "sync disks, writes are flushed through to the disk image",
962    "\
963 This syncs the disk, so that any writes are flushed through to the
964 underlying disk image.
965
966 You should always call this if you have modified a disk image, before
967 closing the handle.");
968
969   ("touch", (RErr, [Pathname "path"]), 3, [],
970    [InitBasicFS, Always, TestOutputTrue (
971       [["touch"; "/new"];
972        ["exists"; "/new"]])],
973    "update file timestamps or create a new file",
974    "\
975 Touch acts like the L<touch(1)> command.  It can be used to
976 update the timestamps on a file, or, if the file does not exist,
977 to create a new zero-length file.");
978
979   ("cat", (RString "content", [Pathname "path"]), 4, [ProtocolLimitWarning],
980    [InitISOFS, Always, TestOutput (
981       [["cat"; "/known-2"]], "abcdef\n")],
982    "list the contents of a file",
983    "\
984 Return the contents of the file named C<path>.
985
986 Note that this function cannot correctly handle binary files
987 (specifically, files containing C<\\0> character which is treated
988 as end of string).  For those you need to use the C<guestfs_read_file>
989 or C<guestfs_download> functions which have a more complex interface.");
990
991   ("ll", (RString "listing", [Pathname "directory"]), 5, [],
992    [], (* XXX Tricky to test because it depends on the exact format
993         * of the 'ls -l' command, which changes between F10 and F11.
994         *)
995    "list the files in a directory (long format)",
996    "\
997 List the files in C<directory> (relative to the root directory,
998 there is no cwd) in the format of 'ls -la'.
999
1000 This command is mostly useful for interactive sessions.  It
1001 is I<not> intended that you try to parse the output string.");
1002
1003   ("ls", (RStringList "listing", [Pathname "directory"]), 6, [],
1004    [InitBasicFS, Always, TestOutputList (
1005       [["touch"; "/new"];
1006        ["touch"; "/newer"];
1007        ["touch"; "/newest"];
1008        ["ls"; "/"]], ["lost+found"; "new"; "newer"; "newest"])],
1009    "list the files in a directory",
1010    "\
1011 List the files in C<directory> (relative to the root directory,
1012 there is no cwd).  The '.' and '..' entries are not returned, but
1013 hidden files are shown.
1014
1015 This command is mostly useful for interactive sessions.  Programs
1016 should probably use C<guestfs_readdir> instead.");
1017
1018   ("list_devices", (RStringList "devices", []), 7, [],
1019    [InitEmpty, Always, TestOutputListOfDevices (
1020       [["list_devices"]], ["/dev/sda"; "/dev/sdb"; "/dev/sdc"; "/dev/sdd"])],
1021    "list the block devices",
1022    "\
1023 List all the block devices.
1024
1025 The full block device names are returned, eg. C</dev/sda>");
1026
1027   ("list_partitions", (RStringList "partitions", []), 8, [],
1028    [InitBasicFS, Always, TestOutputListOfDevices (
1029       [["list_partitions"]], ["/dev/sda1"]);
1030     InitEmpty, Always, TestOutputListOfDevices (
1031       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1032        ["list_partitions"]], ["/dev/sda1"; "/dev/sda2"; "/dev/sda3"])],
1033    "list the partitions",
1034    "\
1035 List all the partitions detected on all block devices.
1036
1037 The full partition device names are returned, eg. C</dev/sda1>
1038
1039 This does not return logical volumes.  For that you will need to
1040 call C<guestfs_lvs>.");
1041
1042   ("pvs", (RStringList "physvols", []), 9, [Optional "lvm2"],
1043    [InitBasicFSonLVM, Always, TestOutputListOfDevices (
1044       [["pvs"]], ["/dev/sda1"]);
1045     InitEmpty, Always, TestOutputListOfDevices (
1046       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1047        ["pvcreate"; "/dev/sda1"];
1048        ["pvcreate"; "/dev/sda2"];
1049        ["pvcreate"; "/dev/sda3"];
1050        ["pvs"]], ["/dev/sda1"; "/dev/sda2"; "/dev/sda3"])],
1051    "list the LVM physical volumes (PVs)",
1052    "\
1053 List all the physical volumes detected.  This is the equivalent
1054 of the L<pvs(8)> command.
1055
1056 This returns a list of just the device names that contain
1057 PVs (eg. C</dev/sda2>).
1058
1059 See also C<guestfs_pvs_full>.");
1060
1061   ("vgs", (RStringList "volgroups", []), 10, [Optional "lvm2"],
1062    [InitBasicFSonLVM, Always, TestOutputList (
1063       [["vgs"]], ["VG"]);
1064     InitEmpty, Always, TestOutputList (
1065       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1066        ["pvcreate"; "/dev/sda1"];
1067        ["pvcreate"; "/dev/sda2"];
1068        ["pvcreate"; "/dev/sda3"];
1069        ["vgcreate"; "VG1"; "/dev/sda1 /dev/sda2"];
1070        ["vgcreate"; "VG2"; "/dev/sda3"];
1071        ["vgs"]], ["VG1"; "VG2"])],
1072    "list the LVM volume groups (VGs)",
1073    "\
1074 List all the volumes groups detected.  This is the equivalent
1075 of the L<vgs(8)> command.
1076
1077 This returns a list of just the volume group names that were
1078 detected (eg. C<VolGroup00>).
1079
1080 See also C<guestfs_vgs_full>.");
1081
1082   ("lvs", (RStringList "logvols", []), 11, [Optional "lvm2"],
1083    [InitBasicFSonLVM, Always, TestOutputList (
1084       [["lvs"]], ["/dev/VG/LV"]);
1085     InitEmpty, Always, TestOutputList (
1086       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1087        ["pvcreate"; "/dev/sda1"];
1088        ["pvcreate"; "/dev/sda2"];
1089        ["pvcreate"; "/dev/sda3"];
1090        ["vgcreate"; "VG1"; "/dev/sda1 /dev/sda2"];
1091        ["vgcreate"; "VG2"; "/dev/sda3"];
1092        ["lvcreate"; "LV1"; "VG1"; "50"];
1093        ["lvcreate"; "LV2"; "VG1"; "50"];
1094        ["lvcreate"; "LV3"; "VG2"; "50"];
1095        ["lvs"]], ["/dev/VG1/LV1"; "/dev/VG1/LV2"; "/dev/VG2/LV3"])],
1096    "list the LVM logical volumes (LVs)",
1097    "\
1098 List all the logical volumes detected.  This is the equivalent
1099 of the L<lvs(8)> command.
1100
1101 This returns a list of the logical volume device names
1102 (eg. C</dev/VolGroup00/LogVol00>).
1103
1104 See also C<guestfs_lvs_full>.");
1105
1106   ("pvs_full", (RStructList ("physvols", "lvm_pv"), []), 12, [Optional "lvm2"],
1107    [], (* XXX how to test? *)
1108    "list the LVM physical volumes (PVs)",
1109    "\
1110 List all the physical volumes detected.  This is the equivalent
1111 of the L<pvs(8)> command.  The \"full\" version includes all fields.");
1112
1113   ("vgs_full", (RStructList ("volgroups", "lvm_vg"), []), 13, [Optional "lvm2"],
1114    [], (* XXX how to test? *)
1115    "list the LVM volume groups (VGs)",
1116    "\
1117 List all the volumes groups detected.  This is the equivalent
1118 of the L<vgs(8)> command.  The \"full\" version includes all fields.");
1119
1120   ("lvs_full", (RStructList ("logvols", "lvm_lv"), []), 14, [Optional "lvm2"],
1121    [], (* XXX how to test? *)
1122    "list the LVM logical volumes (LVs)",
1123    "\
1124 List all the logical volumes detected.  This is the equivalent
1125 of the L<lvs(8)> command.  The \"full\" version includes all fields.");
1126
1127   ("read_lines", (RStringList "lines", [Pathname "path"]), 15, [],
1128    [InitISOFS, Always, TestOutputList (
1129       [["read_lines"; "/known-4"]], ["abc"; "def"; "ghi"]);
1130     InitISOFS, Always, TestOutputList (
1131       [["read_lines"; "/empty"]], [])],
1132    "read file as lines",
1133    "\
1134 Return the contents of the file named C<path>.
1135
1136 The file contents are returned as a list of lines.  Trailing
1137 C<LF> and C<CRLF> character sequences are I<not> returned.
1138
1139 Note that this function cannot correctly handle binary files
1140 (specifically, files containing C<\\0> character which is treated
1141 as end of line).  For those you need to use the C<guestfs_read_file>
1142 function which has a more complex interface.");
1143
1144   ("aug_init", (RErr, [Pathname "root"; Int "flags"]), 16, [Optional "augeas"],
1145    [], (* XXX Augeas code needs tests. *)
1146    "create a new Augeas handle",
1147    "\
1148 Create a new Augeas handle for editing configuration files.
1149 If there was any previous Augeas handle associated with this
1150 guestfs session, then it is closed.
1151
1152 You must call this before using any other C<guestfs_aug_*>
1153 commands.
1154
1155 C<root> is the filesystem root.  C<root> must not be NULL,
1156 use C</> instead.
1157
1158 The flags are the same as the flags defined in
1159 E<lt>augeas.hE<gt>, the logical I<or> of the following
1160 integers:
1161
1162 =over 4
1163
1164 =item C<AUG_SAVE_BACKUP> = 1
1165
1166 Keep the original file with a C<.augsave> extension.
1167
1168 =item C<AUG_SAVE_NEWFILE> = 2
1169
1170 Save changes into a file with extension C<.augnew>, and
1171 do not overwrite original.  Overrides C<AUG_SAVE_BACKUP>.
1172
1173 =item C<AUG_TYPE_CHECK> = 4
1174
1175 Typecheck lenses (can be expensive).
1176
1177 =item C<AUG_NO_STDINC> = 8
1178
1179 Do not use standard load path for modules.
1180
1181 =item C<AUG_SAVE_NOOP> = 16
1182
1183 Make save a no-op, just record what would have been changed.
1184
1185 =item C<AUG_NO_LOAD> = 32
1186
1187 Do not load the tree in C<guestfs_aug_init>.
1188
1189 =back
1190
1191 To close the handle, you can call C<guestfs_aug_close>.
1192
1193 To find out more about Augeas, see L<http://augeas.net/>.");
1194
1195   ("aug_close", (RErr, []), 26, [Optional "augeas"],
1196    [], (* XXX Augeas code needs tests. *)
1197    "close the current Augeas handle",
1198    "\
1199 Close the current Augeas handle and free up any resources
1200 used by it.  After calling this, you have to call
1201 C<guestfs_aug_init> again before you can use any other
1202 Augeas functions.");
1203
1204   ("aug_defvar", (RInt "nrnodes", [String "name"; OptString "expr"]), 17, [Optional "augeas"],
1205    [], (* XXX Augeas code needs tests. *)
1206    "define an Augeas variable",
1207    "\
1208 Defines an Augeas variable C<name> whose value is the result
1209 of evaluating C<expr>.  If C<expr> is NULL, then C<name> is
1210 undefined.
1211
1212 On success this returns the number of nodes in C<expr>, or
1213 C<0> if C<expr> evaluates to something which is not a nodeset.");
1214
1215   ("aug_defnode", (RStruct ("nrnodescreated", "int_bool"), [String "name"; String "expr"; String "val"]), 18, [Optional "augeas"],
1216    [], (* XXX Augeas code needs tests. *)
1217    "define an Augeas node",
1218    "\
1219 Defines a variable C<name> whose value is the result of
1220 evaluating C<expr>.
1221
1222 If C<expr> evaluates to an empty nodeset, a node is created,
1223 equivalent to calling C<guestfs_aug_set> C<expr>, C<value>.
1224 C<name> will be the nodeset containing that single node.
1225
1226 On success this returns a pair containing the
1227 number of nodes in the nodeset, and a boolean flag
1228 if a node was created.");
1229
1230   ("aug_get", (RString "val", [String "augpath"]), 19, [Optional "augeas"],
1231    [], (* XXX Augeas code needs tests. *)
1232    "look up the value of an Augeas path",
1233    "\
1234 Look up the value associated with C<path>.  If C<path>
1235 matches exactly one node, the C<value> is returned.");
1236
1237   ("aug_set", (RErr, [String "augpath"; String "val"]), 20, [Optional "augeas"],
1238    [], (* XXX Augeas code needs tests. *)
1239    "set Augeas path to value",
1240    "\
1241 Set the value associated with C<path> to C<val>.
1242
1243 In the Augeas API, it is possible to clear a node by setting
1244 the value to NULL.  Due to an oversight in the libguestfs API
1245 you cannot do that with this call.  Instead you must use the
1246 C<guestfs_aug_clear> call.");
1247
1248   ("aug_insert", (RErr, [String "augpath"; String "label"; Bool "before"]), 21, [Optional "augeas"],
1249    [], (* XXX Augeas code needs tests. *)
1250    "insert a sibling Augeas node",
1251    "\
1252 Create a new sibling C<label> for C<path>, inserting it into
1253 the tree before or after C<path> (depending on the boolean
1254 flag C<before>).
1255
1256 C<path> must match exactly one existing node in the tree, and
1257 C<label> must be a label, ie. not contain C</>, C<*> or end
1258 with a bracketed index C<[N]>.");
1259
1260   ("aug_rm", (RInt "nrnodes", [String "augpath"]), 22, [Optional "augeas"],
1261    [], (* XXX Augeas code needs tests. *)
1262    "remove an Augeas path",
1263    "\
1264 Remove C<path> and all of its children.
1265
1266 On success this returns the number of entries which were removed.");
1267
1268   ("aug_mv", (RErr, [String "src"; String "dest"]), 23, [Optional "augeas"],
1269    [], (* XXX Augeas code needs tests. *)
1270    "move Augeas node",
1271    "\
1272 Move the node C<src> to C<dest>.  C<src> must match exactly
1273 one node.  C<dest> is overwritten if it exists.");
1274
1275   ("aug_match", (RStringList "matches", [String "augpath"]), 24, [Optional "augeas"],
1276    [], (* XXX Augeas code needs tests. *)
1277    "return Augeas nodes which match augpath",
1278    "\
1279 Returns a list of paths which match the path expression C<path>.
1280 The returned paths are sufficiently qualified so that they match
1281 exactly one node in the current tree.");
1282
1283   ("aug_save", (RErr, []), 25, [Optional "augeas"],
1284    [], (* XXX Augeas code needs tests. *)
1285    "write all pending Augeas changes to disk",
1286    "\
1287 This writes all pending changes to disk.
1288
1289 The flags which were passed to C<guestfs_aug_init> affect exactly
1290 how files are saved.");
1291
1292   ("aug_load", (RErr, []), 27, [Optional "augeas"],
1293    [], (* XXX Augeas code needs tests. *)
1294    "load files into the tree",
1295    "\
1296 Load files into the tree.
1297
1298 See C<aug_load> in the Augeas documentation for the full gory
1299 details.");
1300
1301   ("aug_ls", (RStringList "matches", [String "augpath"]), 28, [Optional "augeas"],
1302    [], (* XXX Augeas code needs tests. *)
1303    "list Augeas nodes under augpath",
1304    "\
1305 This is just a shortcut for listing C<guestfs_aug_match>
1306 C<path/*> and sorting the resulting nodes into alphabetical order.");
1307
1308   ("rm", (RErr, [Pathname "path"]), 29, [],
1309    [InitBasicFS, Always, TestRun
1310       [["touch"; "/new"];
1311        ["rm"; "/new"]];
1312     InitBasicFS, Always, TestLastFail
1313       [["rm"; "/new"]];
1314     InitBasicFS, Always, TestLastFail
1315       [["mkdir"; "/new"];
1316        ["rm"; "/new"]]],
1317    "remove a file",
1318    "\
1319 Remove the single file C<path>.");
1320
1321   ("rmdir", (RErr, [Pathname "path"]), 30, [],
1322    [InitBasicFS, Always, TestRun
1323       [["mkdir"; "/new"];
1324        ["rmdir"; "/new"]];
1325     InitBasicFS, Always, TestLastFail
1326       [["rmdir"; "/new"]];
1327     InitBasicFS, Always, TestLastFail
1328       [["touch"; "/new"];
1329        ["rmdir"; "/new"]]],
1330    "remove a directory",
1331    "\
1332 Remove the single directory C<path>.");
1333
1334   ("rm_rf", (RErr, [Pathname "path"]), 31, [],
1335    [InitBasicFS, Always, TestOutputFalse
1336       [["mkdir"; "/new"];
1337        ["mkdir"; "/new/foo"];
1338        ["touch"; "/new/foo/bar"];
1339        ["rm_rf"; "/new"];
1340        ["exists"; "/new"]]],
1341    "remove a file or directory recursively",
1342    "\
1343 Remove the file or directory C<path>, recursively removing the
1344 contents if its a directory.  This is like the C<rm -rf> shell
1345 command.");
1346
1347   ("mkdir", (RErr, [Pathname "path"]), 32, [],
1348    [InitBasicFS, Always, TestOutputTrue
1349       [["mkdir"; "/new"];
1350        ["is_dir"; "/new"]];
1351     InitBasicFS, Always, TestLastFail
1352       [["mkdir"; "/new/foo/bar"]]],
1353    "create a directory",
1354    "\
1355 Create a directory named C<path>.");
1356
1357   ("mkdir_p", (RErr, [Pathname "path"]), 33, [],
1358    [InitBasicFS, Always, TestOutputTrue
1359       [["mkdir_p"; "/new/foo/bar"];
1360        ["is_dir"; "/new/foo/bar"]];
1361     InitBasicFS, Always, TestOutputTrue
1362       [["mkdir_p"; "/new/foo/bar"];
1363        ["is_dir"; "/new/foo"]];
1364     InitBasicFS, Always, TestOutputTrue
1365       [["mkdir_p"; "/new/foo/bar"];
1366        ["is_dir"; "/new"]];
1367     (* Regression tests for RHBZ#503133: *)
1368     InitBasicFS, Always, TestRun
1369       [["mkdir"; "/new"];
1370        ["mkdir_p"; "/new"]];
1371     InitBasicFS, Always, TestLastFail
1372       [["touch"; "/new"];
1373        ["mkdir_p"; "/new"]]],
1374    "create a directory and parents",
1375    "\
1376 Create a directory named C<path>, creating any parent directories
1377 as necessary.  This is like the C<mkdir -p> shell command.");
1378
1379   ("chmod", (RErr, [Int "mode"; Pathname "path"]), 34, [],
1380    [], (* XXX Need stat command to test *)
1381    "change file mode",
1382    "\
1383 Change the mode (permissions) of C<path> to C<mode>.  Only
1384 numeric modes are supported.
1385
1386 I<Note>: When using this command from guestfish, C<mode>
1387 by default would be decimal, unless you prefix it with
1388 C<0> to get octal, ie. use C<0700> not C<700>.");
1389
1390   ("chown", (RErr, [Int "owner"; Int "group"; Pathname "path"]), 35, [],
1391    [], (* XXX Need stat command to test *)
1392    "change file owner and group",
1393    "\
1394 Change the file owner to C<owner> and group to C<group>.
1395
1396 Only numeric uid and gid are supported.  If you want to use
1397 names, you will need to locate and parse the password file
1398 yourself (Augeas support makes this relatively easy).");
1399
1400   ("exists", (RBool "existsflag", [Pathname "path"]), 36, [],
1401    [InitISOFS, Always, TestOutputTrue (
1402       [["exists"; "/empty"]]);
1403     InitISOFS, Always, TestOutputTrue (
1404       [["exists"; "/directory"]])],
1405    "test if file or directory exists",
1406    "\
1407 This returns C<true> if and only if there is a file, directory
1408 (or anything) with the given C<path> name.
1409
1410 See also C<guestfs_is_file>, C<guestfs_is_dir>, C<guestfs_stat>.");
1411
1412   ("is_file", (RBool "fileflag", [Pathname "path"]), 37, [],
1413    [InitISOFS, Always, TestOutputTrue (
1414       [["is_file"; "/known-1"]]);
1415     InitISOFS, Always, TestOutputFalse (
1416       [["is_file"; "/directory"]])],
1417    "test if file exists",
1418    "\
1419 This returns C<true> if and only if there is a file
1420 with the given C<path> name.  Note that it returns false for
1421 other objects like directories.
1422
1423 See also C<guestfs_stat>.");
1424
1425   ("is_dir", (RBool "dirflag", [Pathname "path"]), 38, [],
1426    [InitISOFS, Always, TestOutputFalse (
1427       [["is_dir"; "/known-3"]]);
1428     InitISOFS, Always, TestOutputTrue (
1429       [["is_dir"; "/directory"]])],
1430    "test if file exists",
1431    "\
1432 This returns C<true> if and only if there is a directory
1433 with the given C<path> name.  Note that it returns false for
1434 other objects like files.
1435
1436 See also C<guestfs_stat>.");
1437
1438   ("pvcreate", (RErr, [Device "device"]), 39, [Optional "lvm2"],
1439    [InitEmpty, Always, TestOutputListOfDevices (
1440       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1441        ["pvcreate"; "/dev/sda1"];
1442        ["pvcreate"; "/dev/sda2"];
1443        ["pvcreate"; "/dev/sda3"];
1444        ["pvs"]], ["/dev/sda1"; "/dev/sda2"; "/dev/sda3"])],
1445    "create an LVM physical volume",
1446    "\
1447 This creates an LVM physical volume on the named C<device>,
1448 where C<device> should usually be a partition name such
1449 as C</dev/sda1>.");
1450
1451   ("vgcreate", (RErr, [String "volgroup"; DeviceList "physvols"]), 40, [Optional "lvm2"],
1452    [InitEmpty, Always, TestOutputList (
1453       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1454        ["pvcreate"; "/dev/sda1"];
1455        ["pvcreate"; "/dev/sda2"];
1456        ["pvcreate"; "/dev/sda3"];
1457        ["vgcreate"; "VG1"; "/dev/sda1 /dev/sda2"];
1458        ["vgcreate"; "VG2"; "/dev/sda3"];
1459        ["vgs"]], ["VG1"; "VG2"])],
1460    "create an LVM volume group",
1461    "\
1462 This creates an LVM volume group called C<volgroup>
1463 from the non-empty list of physical volumes C<physvols>.");
1464
1465   ("lvcreate", (RErr, [String "logvol"; String "volgroup"; Int "mbytes"]), 41, [Optional "lvm2"],
1466    [InitEmpty, Always, TestOutputList (
1467       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1468        ["pvcreate"; "/dev/sda1"];
1469        ["pvcreate"; "/dev/sda2"];
1470        ["pvcreate"; "/dev/sda3"];
1471        ["vgcreate"; "VG1"; "/dev/sda1 /dev/sda2"];
1472        ["vgcreate"; "VG2"; "/dev/sda3"];
1473        ["lvcreate"; "LV1"; "VG1"; "50"];
1474        ["lvcreate"; "LV2"; "VG1"; "50"];
1475        ["lvcreate"; "LV3"; "VG2"; "50"];
1476        ["lvcreate"; "LV4"; "VG2"; "50"];
1477        ["lvcreate"; "LV5"; "VG2"; "50"];
1478        ["lvs"]],
1479       ["/dev/VG1/LV1"; "/dev/VG1/LV2";
1480        "/dev/VG2/LV3"; "/dev/VG2/LV4"; "/dev/VG2/LV5"])],
1481    "create an LVM logical volume",
1482    "\
1483 This creates an LVM logical volume called C<logvol>
1484 on the volume group C<volgroup>, with C<size> megabytes.");
1485
1486   ("mkfs", (RErr, [String "fstype"; Device "device"]), 42, [],
1487    [InitEmpty, Always, TestOutput (
1488       [["part_disk"; "/dev/sda"; "mbr"];
1489        ["mkfs"; "ext2"; "/dev/sda1"];
1490        ["mount_options"; ""; "/dev/sda1"; "/"];
1491        ["write_file"; "/new"; "new file contents"; "0"];
1492        ["cat"; "/new"]], "new file contents")],
1493    "make a filesystem",
1494    "\
1495 This creates a filesystem on C<device> (usually a partition
1496 or LVM logical volume).  The filesystem type is C<fstype>, for
1497 example C<ext3>.");
1498
1499   ("sfdisk", (RErr, [Device "device";
1500                      Int "cyls"; Int "heads"; Int "sectors";
1501                      StringList "lines"]), 43, [DangerWillRobinson],
1502    [],
1503    "create partitions on a block device",
1504    "\
1505 This is a direct interface to the L<sfdisk(8)> program for creating
1506 partitions on block devices.
1507
1508 C<device> should be a block device, for example C</dev/sda>.
1509
1510 C<cyls>, C<heads> and C<sectors> are the number of cylinders, heads
1511 and sectors on the device, which are passed directly to sfdisk as
1512 the I<-C>, I<-H> and I<-S> parameters.  If you pass C<0> for any
1513 of these, then the corresponding parameter is omitted.  Usually for
1514 'large' disks, you can just pass C<0> for these, but for small
1515 (floppy-sized) disks, sfdisk (or rather, the kernel) cannot work
1516 out the right geometry and you will need to tell it.
1517
1518 C<lines> is a list of lines that we feed to C<sfdisk>.  For more
1519 information refer to the L<sfdisk(8)> manpage.
1520
1521 To create a single partition occupying the whole disk, you would
1522 pass C<lines> as a single element list, when the single element being
1523 the string C<,> (comma).
1524
1525 See also: C<guestfs_sfdisk_l>, C<guestfs_sfdisk_N>,
1526 C<guestfs_part_init>");
1527
1528   ("write_file", (RErr, [Pathname "path"; String "content"; Int "size"]), 44, [ProtocolLimitWarning],
1529    [InitBasicFS, Always, TestOutput (
1530       [["write_file"; "/new"; "new file contents"; "0"];
1531        ["cat"; "/new"]], "new file contents");
1532     InitBasicFS, Always, TestOutput (
1533       [["write_file"; "/new"; "\nnew file contents\n"; "0"];
1534        ["cat"; "/new"]], "\nnew file contents\n");
1535     InitBasicFS, Always, TestOutput (
1536       [["write_file"; "/new"; "\n\n"; "0"];
1537        ["cat"; "/new"]], "\n\n");
1538     InitBasicFS, Always, TestOutput (
1539       [["write_file"; "/new"; ""; "0"];
1540        ["cat"; "/new"]], "");
1541     InitBasicFS, Always, TestOutput (
1542       [["write_file"; "/new"; "\n\n\n"; "0"];
1543        ["cat"; "/new"]], "\n\n\n");
1544     InitBasicFS, Always, TestOutput (
1545       [["write_file"; "/new"; "\n"; "0"];
1546        ["cat"; "/new"]], "\n")],
1547    "create a file",
1548    "\
1549 This call creates a file called C<path>.  The contents of the
1550 file is the string C<content> (which can contain any 8 bit data),
1551 with length C<size>.
1552
1553 As a special case, if C<size> is C<0>
1554 then the length is calculated using C<strlen> (so in this case
1555 the content cannot contain embedded ASCII NULs).
1556
1557 I<NB.> Owing to a bug, writing content containing ASCII NUL
1558 characters does I<not> work, even if the length is specified.
1559 We hope to resolve this bug in a future version.  In the meantime
1560 use C<guestfs_upload>.");
1561
1562   ("umount", (RErr, [String "pathordevice"]), 45, [FishAlias "unmount"],
1563    [InitEmpty, Always, TestOutputListOfDevices (
1564       [["part_disk"; "/dev/sda"; "mbr"];
1565        ["mkfs"; "ext2"; "/dev/sda1"];
1566        ["mount_options"; ""; "/dev/sda1"; "/"];
1567        ["mounts"]], ["/dev/sda1"]);
1568     InitEmpty, Always, TestOutputList (
1569       [["part_disk"; "/dev/sda"; "mbr"];
1570        ["mkfs"; "ext2"; "/dev/sda1"];
1571        ["mount_options"; ""; "/dev/sda1"; "/"];
1572        ["umount"; "/"];
1573        ["mounts"]], [])],
1574    "unmount a filesystem",
1575    "\
1576 This unmounts the given filesystem.  The filesystem may be
1577 specified either by its mountpoint (path) or the device which
1578 contains the filesystem.");
1579
1580   ("mounts", (RStringList "devices", []), 46, [],
1581    [InitBasicFS, Always, TestOutputListOfDevices (
1582       [["mounts"]], ["/dev/sda1"])],
1583    "show mounted filesystems",
1584    "\
1585 This returns the list of currently mounted filesystems.  It returns
1586 the list of devices (eg. C</dev/sda1>, C</dev/VG/LV>).
1587
1588 Some internal mounts are not shown.
1589
1590 See also: C<guestfs_mountpoints>");
1591
1592   ("umount_all", (RErr, []), 47, [FishAlias "unmount-all"],
1593    [InitBasicFS, Always, TestOutputList (
1594       [["umount_all"];
1595        ["mounts"]], []);
1596     (* check that umount_all can unmount nested mounts correctly: *)
1597     InitEmpty, Always, TestOutputList (
1598       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1599        ["mkfs"; "ext2"; "/dev/sda1"];
1600        ["mkfs"; "ext2"; "/dev/sda2"];
1601        ["mkfs"; "ext2"; "/dev/sda3"];
1602        ["mount_options"; ""; "/dev/sda1"; "/"];
1603        ["mkdir"; "/mp1"];
1604        ["mount_options"; ""; "/dev/sda2"; "/mp1"];
1605        ["mkdir"; "/mp1/mp2"];
1606        ["mount_options"; ""; "/dev/sda3"; "/mp1/mp2"];
1607        ["mkdir"; "/mp1/mp2/mp3"];
1608        ["umount_all"];
1609        ["mounts"]], [])],
1610    "unmount all filesystems",
1611    "\
1612 This unmounts all mounted filesystems.
1613
1614 Some internal mounts are not unmounted by this call.");
1615
1616   ("lvm_remove_all", (RErr, []), 48, [DangerWillRobinson; Optional "lvm2"],
1617    [],
1618    "remove all LVM LVs, VGs and PVs",
1619    "\
1620 This command removes all LVM logical volumes, volume groups
1621 and physical volumes.");
1622
1623   ("file", (RString "description", [Dev_or_Path "path"]), 49, [],
1624    [InitISOFS, Always, TestOutput (
1625       [["file"; "/empty"]], "empty");
1626     InitISOFS, Always, TestOutput (
1627       [["file"; "/known-1"]], "ASCII text");
1628     InitISOFS, Always, TestLastFail (
1629       [["file"; "/notexists"]])],
1630    "determine file type",
1631    "\
1632 This call uses the standard L<file(1)> command to determine
1633 the type or contents of the file.  This also works on devices,
1634 for example to find out whether a partition contains a filesystem.
1635
1636 This call will also transparently look inside various types
1637 of compressed file.
1638
1639 The exact command which runs is C<file -zbsL path>.  Note in
1640 particular that the filename is not prepended to the output
1641 (the C<-b> option).");
1642
1643   ("command", (RString "output", [StringList "arguments"]), 50, [ProtocolLimitWarning],
1644    [InitBasicFS, Always, TestOutput (
1645       [["upload"; "test-command"; "/test-command"];
1646        ["chmod"; "0o755"; "/test-command"];
1647        ["command"; "/test-command 1"]], "Result1");
1648     InitBasicFS, Always, TestOutput (
1649       [["upload"; "test-command"; "/test-command"];
1650        ["chmod"; "0o755"; "/test-command"];
1651        ["command"; "/test-command 2"]], "Result2\n");
1652     InitBasicFS, Always, TestOutput (
1653       [["upload"; "test-command"; "/test-command"];
1654        ["chmod"; "0o755"; "/test-command"];
1655        ["command"; "/test-command 3"]], "\nResult3");
1656     InitBasicFS, Always, TestOutput (
1657       [["upload"; "test-command"; "/test-command"];
1658        ["chmod"; "0o755"; "/test-command"];
1659        ["command"; "/test-command 4"]], "\nResult4\n");
1660     InitBasicFS, Always, TestOutput (
1661       [["upload"; "test-command"; "/test-command"];
1662        ["chmod"; "0o755"; "/test-command"];
1663        ["command"; "/test-command 5"]], "\nResult5\n\n");
1664     InitBasicFS, Always, TestOutput (
1665       [["upload"; "test-command"; "/test-command"];
1666        ["chmod"; "0o755"; "/test-command"];
1667        ["command"; "/test-command 6"]], "\n\nResult6\n\n");
1668     InitBasicFS, Always, TestOutput (
1669       [["upload"; "test-command"; "/test-command"];
1670        ["chmod"; "0o755"; "/test-command"];
1671        ["command"; "/test-command 7"]], "");
1672     InitBasicFS, Always, TestOutput (
1673       [["upload"; "test-command"; "/test-command"];
1674        ["chmod"; "0o755"; "/test-command"];
1675        ["command"; "/test-command 8"]], "\n");
1676     InitBasicFS, Always, TestOutput (
1677       [["upload"; "test-command"; "/test-command"];
1678        ["chmod"; "0o755"; "/test-command"];
1679        ["command"; "/test-command 9"]], "\n\n");
1680     InitBasicFS, Always, TestOutput (
1681       [["upload"; "test-command"; "/test-command"];
1682        ["chmod"; "0o755"; "/test-command"];
1683        ["command"; "/test-command 10"]], "Result10-1\nResult10-2\n");
1684     InitBasicFS, Always, TestOutput (
1685       [["upload"; "test-command"; "/test-command"];
1686        ["chmod"; "0o755"; "/test-command"];
1687        ["command"; "/test-command 11"]], "Result11-1\nResult11-2");
1688     InitBasicFS, Always, TestLastFail (
1689       [["upload"; "test-command"; "/test-command"];
1690        ["chmod"; "0o755"; "/test-command"];
1691        ["command"; "/test-command"]])],
1692    "run a command from the guest filesystem",
1693    "\
1694 This call runs a command from the guest filesystem.  The
1695 filesystem must be mounted, and must contain a compatible
1696 operating system (ie. something Linux, with the same
1697 or compatible processor architecture).
1698
1699 The single parameter is an argv-style list of arguments.
1700 The first element is the name of the program to run.
1701 Subsequent elements are parameters.  The list must be
1702 non-empty (ie. must contain a program name).  Note that
1703 the command runs directly, and is I<not> invoked via
1704 the shell (see C<guestfs_sh>).
1705
1706 The return value is anything printed to I<stdout> by
1707 the command.
1708
1709 If the command returns a non-zero exit status, then
1710 this function returns an error message.  The error message
1711 string is the content of I<stderr> from the command.
1712
1713 The C<$PATH> environment variable will contain at least
1714 C</usr/bin> and C</bin>.  If you require a program from
1715 another location, you should provide the full path in the
1716 first parameter.
1717
1718 Shared libraries and data files required by the program
1719 must be available on filesystems which are mounted in the
1720 correct places.  It is the caller's responsibility to ensure
1721 all filesystems that are needed are mounted at the right
1722 locations.");
1723
1724   ("command_lines", (RStringList "lines", [StringList "arguments"]), 51, [ProtocolLimitWarning],
1725    [InitBasicFS, Always, TestOutputList (
1726       [["upload"; "test-command"; "/test-command"];
1727        ["chmod"; "0o755"; "/test-command"];
1728        ["command_lines"; "/test-command 1"]], ["Result1"]);
1729     InitBasicFS, Always, TestOutputList (
1730       [["upload"; "test-command"; "/test-command"];
1731        ["chmod"; "0o755"; "/test-command"];
1732        ["command_lines"; "/test-command 2"]], ["Result2"]);
1733     InitBasicFS, Always, TestOutputList (
1734       [["upload"; "test-command"; "/test-command"];
1735        ["chmod"; "0o755"; "/test-command"];
1736        ["command_lines"; "/test-command 3"]], ["";"Result3"]);
1737     InitBasicFS, Always, TestOutputList (
1738       [["upload"; "test-command"; "/test-command"];
1739        ["chmod"; "0o755"; "/test-command"];
1740        ["command_lines"; "/test-command 4"]], ["";"Result4"]);
1741     InitBasicFS, Always, TestOutputList (
1742       [["upload"; "test-command"; "/test-command"];
1743        ["chmod"; "0o755"; "/test-command"];
1744        ["command_lines"; "/test-command 5"]], ["";"Result5";""]);
1745     InitBasicFS, Always, TestOutputList (
1746       [["upload"; "test-command"; "/test-command"];
1747        ["chmod"; "0o755"; "/test-command"];
1748        ["command_lines"; "/test-command 6"]], ["";"";"Result6";""]);
1749     InitBasicFS, Always, TestOutputList (
1750       [["upload"; "test-command"; "/test-command"];
1751        ["chmod"; "0o755"; "/test-command"];
1752        ["command_lines"; "/test-command 7"]], []);
1753     InitBasicFS, Always, TestOutputList (
1754       [["upload"; "test-command"; "/test-command"];
1755        ["chmod"; "0o755"; "/test-command"];
1756        ["command_lines"; "/test-command 8"]], [""]);
1757     InitBasicFS, Always, TestOutputList (
1758       [["upload"; "test-command"; "/test-command"];
1759        ["chmod"; "0o755"; "/test-command"];
1760        ["command_lines"; "/test-command 9"]], ["";""]);
1761     InitBasicFS, Always, TestOutputList (
1762       [["upload"; "test-command"; "/test-command"];
1763        ["chmod"; "0o755"; "/test-command"];
1764        ["command_lines"; "/test-command 10"]], ["Result10-1";"Result10-2"]);
1765     InitBasicFS, Always, TestOutputList (
1766       [["upload"; "test-command"; "/test-command"];
1767        ["chmod"; "0o755"; "/test-command"];
1768        ["command_lines"; "/test-command 11"]], ["Result11-1";"Result11-2"])],
1769    "run a command, returning lines",
1770    "\
1771 This is the same as C<guestfs_command>, but splits the
1772 result into a list of lines.
1773
1774 See also: C<guestfs_sh_lines>");
1775
1776   ("stat", (RStruct ("statbuf", "stat"), [Pathname "path"]), 52, [],
1777    [InitISOFS, Always, TestOutputStruct (
1778       [["stat"; "/empty"]], [CompareWithInt ("size", 0)])],
1779    "get file information",
1780    "\
1781 Returns file information for the given C<path>.
1782
1783 This is the same as the C<stat(2)> system call.");
1784
1785   ("lstat", (RStruct ("statbuf", "stat"), [Pathname "path"]), 53, [],
1786    [InitISOFS, Always, TestOutputStruct (
1787       [["lstat"; "/empty"]], [CompareWithInt ("size", 0)])],
1788    "get file information for a symbolic link",
1789    "\
1790 Returns file information for the given C<path>.
1791
1792 This is the same as C<guestfs_stat> except that if C<path>
1793 is a symbolic link, then the link is stat-ed, not the file it
1794 refers to.
1795
1796 This is the same as the C<lstat(2)> system call.");
1797
1798   ("statvfs", (RStruct ("statbuf", "statvfs"), [Pathname "path"]), 54, [],
1799    [InitISOFS, Always, TestOutputStruct (
1800       [["statvfs"; "/"]], [CompareWithInt ("namemax", 255)])],
1801    "get file system statistics",
1802    "\
1803 Returns file system statistics for any mounted file system.
1804 C<path> should be a file or directory in the mounted file system
1805 (typically it is the mount point itself, but it doesn't need to be).
1806
1807 This is the same as the C<statvfs(2)> system call.");
1808
1809   ("tune2fs_l", (RHashtable "superblock", [Device "device"]), 55, [],
1810    [], (* XXX test *)
1811    "get ext2/ext3/ext4 superblock details",
1812    "\
1813 This returns the contents of the ext2, ext3 or ext4 filesystem
1814 superblock on C<device>.
1815
1816 It is the same as running C<tune2fs -l device>.  See L<tune2fs(8)>
1817 manpage for more details.  The list of fields returned isn't
1818 clearly defined, and depends on both the version of C<tune2fs>
1819 that libguestfs was built against, and the filesystem itself.");
1820
1821   ("blockdev_setro", (RErr, [Device "device"]), 56, [],
1822    [InitEmpty, Always, TestOutputTrue (
1823       [["blockdev_setro"; "/dev/sda"];
1824        ["blockdev_getro"; "/dev/sda"]])],
1825    "set block device to read-only",
1826    "\
1827 Sets the block device named C<device> to read-only.
1828
1829 This uses the L<blockdev(8)> command.");
1830
1831   ("blockdev_setrw", (RErr, [Device "device"]), 57, [],
1832    [InitEmpty, Always, TestOutputFalse (
1833       [["blockdev_setrw"; "/dev/sda"];
1834        ["blockdev_getro"; "/dev/sda"]])],
1835    "set block device to read-write",
1836    "\
1837 Sets the block device named C<device> to read-write.
1838
1839 This uses the L<blockdev(8)> command.");
1840
1841   ("blockdev_getro", (RBool "ro", [Device "device"]), 58, [],
1842    [InitEmpty, Always, TestOutputTrue (
1843       [["blockdev_setro"; "/dev/sda"];
1844        ["blockdev_getro"; "/dev/sda"]])],
1845    "is block device set to read-only",
1846    "\
1847 Returns a boolean indicating if the block device is read-only
1848 (true if read-only, false if not).
1849
1850 This uses the L<blockdev(8)> command.");
1851
1852   ("blockdev_getss", (RInt "sectorsize", [Device "device"]), 59, [],
1853    [InitEmpty, Always, TestOutputInt (
1854       [["blockdev_getss"; "/dev/sda"]], 512)],
1855    "get sectorsize of block device",
1856    "\
1857 This returns the size of sectors on a block device.
1858 Usually 512, but can be larger for modern devices.
1859
1860 (Note, this is not the size in sectors, use C<guestfs_blockdev_getsz>
1861 for that).
1862
1863 This uses the L<blockdev(8)> command.");
1864
1865   ("blockdev_getbsz", (RInt "blocksize", [Device "device"]), 60, [],
1866    [InitEmpty, Always, TestOutputInt (
1867       [["blockdev_getbsz"; "/dev/sda"]], 4096)],
1868    "get blocksize of block device",
1869    "\
1870 This returns the block size of a device.
1871
1872 (Note this is different from both I<size in blocks> and
1873 I<filesystem block size>).
1874
1875 This uses the L<blockdev(8)> command.");
1876
1877   ("blockdev_setbsz", (RErr, [Device "device"; Int "blocksize"]), 61, [],
1878    [], (* XXX test *)
1879    "set blocksize of block device",
1880    "\
1881 This sets the block size of a device.
1882
1883 (Note this is different from both I<size in blocks> and
1884 I<filesystem block size>).
1885
1886 This uses the L<blockdev(8)> command.");
1887
1888   ("blockdev_getsz", (RInt64 "sizeinsectors", [Device "device"]), 62, [],
1889    [InitEmpty, Always, TestOutputInt (
1890       [["blockdev_getsz"; "/dev/sda"]], 1024000)],
1891    "get total size of device in 512-byte sectors",
1892    "\
1893 This returns the size of the device in units of 512-byte sectors
1894 (even if the sectorsize isn't 512 bytes ... weird).
1895
1896 See also C<guestfs_blockdev_getss> for the real sector size of
1897 the device, and C<guestfs_blockdev_getsize64> for the more
1898 useful I<size in bytes>.
1899
1900 This uses the L<blockdev(8)> command.");
1901
1902   ("blockdev_getsize64", (RInt64 "sizeinbytes", [Device "device"]), 63, [],
1903    [InitEmpty, Always, TestOutputInt (
1904       [["blockdev_getsize64"; "/dev/sda"]], 524288000)],
1905    "get total size of device in bytes",
1906    "\
1907 This returns the size of the device in bytes.
1908
1909 See also C<guestfs_blockdev_getsz>.
1910
1911 This uses the L<blockdev(8)> command.");
1912
1913   ("blockdev_flushbufs", (RErr, [Device "device"]), 64, [],
1914    [InitEmpty, Always, TestRun
1915       [["blockdev_flushbufs"; "/dev/sda"]]],
1916    "flush device buffers",
1917    "\
1918 This tells the kernel to flush internal buffers associated
1919 with C<device>.
1920
1921 This uses the L<blockdev(8)> command.");
1922
1923   ("blockdev_rereadpt", (RErr, [Device "device"]), 65, [],
1924    [InitEmpty, Always, TestRun
1925       [["blockdev_rereadpt"; "/dev/sda"]]],
1926    "reread partition table",
1927    "\
1928 Reread the partition table on C<device>.
1929
1930 This uses the L<blockdev(8)> command.");
1931
1932   ("upload", (RErr, [FileIn "filename"; Dev_or_Path "remotefilename"]), 66, [],
1933    [InitBasicFS, Always, TestOutput (
1934       (* Pick a file from cwd which isn't likely to change. *)
1935       [["upload"; "../COPYING.LIB"; "/COPYING.LIB"];
1936        ["checksum"; "md5"; "/COPYING.LIB"]],
1937       Digest.to_hex (Digest.file "COPYING.LIB"))],
1938    "upload a file from the local machine",
1939    "\
1940 Upload local file C<filename> to C<remotefilename> on the
1941 filesystem.
1942
1943 C<filename> can also be a named pipe.
1944
1945 See also C<guestfs_download>.");
1946
1947   ("download", (RErr, [Dev_or_Path "remotefilename"; FileOut "filename"]), 67, [],
1948    [InitBasicFS, Always, TestOutput (
1949       (* Pick a file from cwd which isn't likely to change. *)
1950       [["upload"; "../COPYING.LIB"; "/COPYING.LIB"];
1951        ["download"; "/COPYING.LIB"; "testdownload.tmp"];
1952        ["upload"; "testdownload.tmp"; "/upload"];
1953        ["checksum"; "md5"; "/upload"]],
1954       Digest.to_hex (Digest.file "COPYING.LIB"))],
1955    "download a file to the local machine",
1956    "\
1957 Download file C<remotefilename> and save it as C<filename>
1958 on the local machine.
1959
1960 C<filename> can also be a named pipe.
1961
1962 See also C<guestfs_upload>, C<guestfs_cat>.");
1963
1964   ("checksum", (RString "checksum", [String "csumtype"; Pathname "path"]), 68, [],
1965    [InitISOFS, Always, TestOutput (
1966       [["checksum"; "crc"; "/known-3"]], "2891671662");
1967     InitISOFS, Always, TestLastFail (
1968       [["checksum"; "crc"; "/notexists"]]);
1969     InitISOFS, Always, TestOutput (
1970       [["checksum"; "md5"; "/known-3"]], "46d6ca27ee07cdc6fa99c2e138cc522c");
1971     InitISOFS, Always, TestOutput (
1972       [["checksum"; "sha1"; "/known-3"]], "b7ebccc3ee418311091c3eda0a45b83c0a770f15");
1973     InitISOFS, Always, TestOutput (
1974       [["checksum"; "sha224"; "/known-3"]], "d2cd1774b28f3659c14116be0a6dc2bb5c4b350ce9cd5defac707741");
1975     InitISOFS, Always, TestOutput (
1976       [["checksum"; "sha256"; "/known-3"]], "75bb71b90cd20cb13f86d2bea8dad63ac7194e7517c3b52b8d06ff52d3487d30");
1977     InitISOFS, Always, TestOutput (
1978       [["checksum"; "sha384"; "/known-3"]], "5fa7883430f357b5d7b7271d3a1d2872b51d73cba72731de6863d3dea55f30646af2799bef44d5ea776a5ec7941ac640");
1979     InitISOFS, Always, TestOutput (
1980       [["checksum"; "sha512"; "/known-3"]], "2794062c328c6b216dca90443b7f7134c5f40e56bd0ed7853123275a09982a6f992e6ca682f9d2fba34a4c5e870d8fe077694ff831e3032a004ee077e00603f6")],
1981    "compute MD5, SHAx or CRC checksum of file",
1982    "\
1983 This call computes the MD5, SHAx or CRC checksum of the
1984 file named C<path>.
1985
1986 The type of checksum to compute is given by the C<csumtype>
1987 parameter which must have one of the following values:
1988
1989 =over 4
1990
1991 =item C<crc>
1992
1993 Compute the cyclic redundancy check (CRC) specified by POSIX
1994 for the C<cksum> command.
1995
1996 =item C<md5>
1997
1998 Compute the MD5 hash (using the C<md5sum> program).
1999
2000 =item C<sha1>
2001
2002 Compute the SHA1 hash (using the C<sha1sum> program).
2003
2004 =item C<sha224>
2005
2006 Compute the SHA224 hash (using the C<sha224sum> program).
2007
2008 =item C<sha256>
2009
2010 Compute the SHA256 hash (using the C<sha256sum> program).
2011
2012 =item C<sha384>
2013
2014 Compute the SHA384 hash (using the C<sha384sum> program).
2015
2016 =item C<sha512>
2017
2018 Compute the SHA512 hash (using the C<sha512sum> program).
2019
2020 =back
2021
2022 The checksum is returned as a printable string.");
2023
2024   ("tar_in", (RErr, [FileIn "tarfile"; String "directory"]), 69, [],
2025    [InitBasicFS, Always, TestOutput (
2026       [["tar_in"; "../images/helloworld.tar"; "/"];
2027        ["cat"; "/hello"]], "hello\n")],
2028    "unpack tarfile to directory",
2029    "\
2030 This command uploads and unpacks local file C<tarfile> (an
2031 I<uncompressed> tar file) into C<directory>.
2032
2033 To upload a compressed tarball, use C<guestfs_tgz_in>
2034 or C<guestfs_txz_in>.");
2035
2036   ("tar_out", (RErr, [String "directory"; FileOut "tarfile"]), 70, [],
2037    [],
2038    "pack directory into tarfile",
2039    "\
2040 This command packs the contents of C<directory> and downloads
2041 it to local file C<tarfile>.
2042
2043 To download a compressed tarball, use C<guestfs_tgz_out>
2044 or C<guestfs_txz_out>.");
2045
2046   ("tgz_in", (RErr, [FileIn "tarball"; String "directory"]), 71, [],
2047    [InitBasicFS, Always, TestOutput (
2048       [["tgz_in"; "../images/helloworld.tar.gz"; "/"];
2049        ["cat"; "/hello"]], "hello\n")],
2050    "unpack compressed tarball to directory",
2051    "\
2052 This command uploads and unpacks local file C<tarball> (a
2053 I<gzip compressed> tar file) into C<directory>.
2054
2055 To upload an uncompressed tarball, use C<guestfs_tar_in>.");
2056
2057   ("tgz_out", (RErr, [Pathname "directory"; FileOut "tarball"]), 72, [],
2058    [],
2059    "pack directory into compressed tarball",
2060    "\
2061 This command packs the contents of C<directory> and downloads
2062 it to local file C<tarball>.
2063
2064 To download an uncompressed tarball, use C<guestfs_tar_out>.");
2065
2066   ("mount_ro", (RErr, [Device "device"; String "mountpoint"]), 73, [],
2067    [InitBasicFS, Always, TestLastFail (
2068       [["umount"; "/"];
2069        ["mount_ro"; "/dev/sda1"; "/"];
2070        ["touch"; "/new"]]);
2071     InitBasicFS, Always, TestOutput (
2072       [["write_file"; "/new"; "data"; "0"];
2073        ["umount"; "/"];
2074        ["mount_ro"; "/dev/sda1"; "/"];
2075        ["cat"; "/new"]], "data")],
2076    "mount a guest disk, read-only",
2077    "\
2078 This is the same as the C<guestfs_mount> command, but it
2079 mounts the filesystem with the read-only (I<-o ro>) flag.");
2080
2081   ("mount_options", (RErr, [String "options"; Device "device"; String "mountpoint"]), 74, [],
2082    [],
2083    "mount a guest disk with mount options",
2084    "\
2085 This is the same as the C<guestfs_mount> command, but it
2086 allows you to set the mount options as for the
2087 L<mount(8)> I<-o> flag.");
2088
2089   ("mount_vfs", (RErr, [String "options"; String "vfstype"; Device "device"; String "mountpoint"]), 75, [],
2090    [],
2091    "mount a guest disk with mount options and vfstype",
2092    "\
2093 This is the same as the C<guestfs_mount> command, but it
2094 allows you to set both the mount options and the vfstype
2095 as for the L<mount(8)> I<-o> and I<-t> flags.");
2096
2097   ("debug", (RString "result", [String "subcmd"; StringList "extraargs"]), 76, [],
2098    [],
2099    "debugging and internals",
2100    "\
2101 The C<guestfs_debug> command exposes some internals of
2102 C<guestfsd> (the guestfs daemon) that runs inside the
2103 qemu subprocess.
2104
2105 There is no comprehensive help for this command.  You have
2106 to look at the file C<daemon/debug.c> in the libguestfs source
2107 to find out what you can do.");
2108
2109   ("lvremove", (RErr, [Device "device"]), 77, [Optional "lvm2"],
2110    [InitEmpty, Always, TestOutputList (
2111       [["part_disk"; "/dev/sda"; "mbr"];
2112        ["pvcreate"; "/dev/sda1"];
2113        ["vgcreate"; "VG"; "/dev/sda1"];
2114        ["lvcreate"; "LV1"; "VG"; "50"];
2115        ["lvcreate"; "LV2"; "VG"; "50"];
2116        ["lvremove"; "/dev/VG/LV1"];
2117        ["lvs"]], ["/dev/VG/LV2"]);
2118     InitEmpty, Always, TestOutputList (
2119       [["part_disk"; "/dev/sda"; "mbr"];
2120        ["pvcreate"; "/dev/sda1"];
2121        ["vgcreate"; "VG"; "/dev/sda1"];
2122        ["lvcreate"; "LV1"; "VG"; "50"];
2123        ["lvcreate"; "LV2"; "VG"; "50"];
2124        ["lvremove"; "/dev/VG"];
2125        ["lvs"]], []);
2126     InitEmpty, Always, TestOutputList (
2127       [["part_disk"; "/dev/sda"; "mbr"];
2128        ["pvcreate"; "/dev/sda1"];
2129        ["vgcreate"; "VG"; "/dev/sda1"];
2130        ["lvcreate"; "LV1"; "VG"; "50"];
2131        ["lvcreate"; "LV2"; "VG"; "50"];
2132        ["lvremove"; "/dev/VG"];
2133        ["vgs"]], ["VG"])],
2134    "remove an LVM logical volume",
2135    "\
2136 Remove an LVM logical volume C<device>, where C<device> is
2137 the path to the LV, such as C</dev/VG/LV>.
2138
2139 You can also remove all LVs in a volume group by specifying
2140 the VG name, C</dev/VG>.");
2141
2142   ("vgremove", (RErr, [String "vgname"]), 78, [Optional "lvm2"],
2143    [InitEmpty, Always, TestOutputList (
2144       [["part_disk"; "/dev/sda"; "mbr"];
2145        ["pvcreate"; "/dev/sda1"];
2146        ["vgcreate"; "VG"; "/dev/sda1"];
2147        ["lvcreate"; "LV1"; "VG"; "50"];
2148        ["lvcreate"; "LV2"; "VG"; "50"];
2149        ["vgremove"; "VG"];
2150        ["lvs"]], []);
2151     InitEmpty, Always, TestOutputList (
2152       [["part_disk"; "/dev/sda"; "mbr"];
2153        ["pvcreate"; "/dev/sda1"];
2154        ["vgcreate"; "VG"; "/dev/sda1"];
2155        ["lvcreate"; "LV1"; "VG"; "50"];
2156        ["lvcreate"; "LV2"; "VG"; "50"];
2157        ["vgremove"; "VG"];
2158        ["vgs"]], [])],
2159    "remove an LVM volume group",
2160    "\
2161 Remove an LVM volume group C<vgname>, (for example C<VG>).
2162
2163 This also forcibly removes all logical volumes in the volume
2164 group (if any).");
2165
2166   ("pvremove", (RErr, [Device "device"]), 79, [Optional "lvm2"],
2167    [InitEmpty, Always, TestOutputListOfDevices (
2168       [["part_disk"; "/dev/sda"; "mbr"];
2169        ["pvcreate"; "/dev/sda1"];
2170        ["vgcreate"; "VG"; "/dev/sda1"];
2171        ["lvcreate"; "LV1"; "VG"; "50"];
2172        ["lvcreate"; "LV2"; "VG"; "50"];
2173        ["vgremove"; "VG"];
2174        ["pvremove"; "/dev/sda1"];
2175        ["lvs"]], []);
2176     InitEmpty, Always, TestOutputListOfDevices (
2177       [["part_disk"; "/dev/sda"; "mbr"];
2178        ["pvcreate"; "/dev/sda1"];
2179        ["vgcreate"; "VG"; "/dev/sda1"];
2180        ["lvcreate"; "LV1"; "VG"; "50"];
2181        ["lvcreate"; "LV2"; "VG"; "50"];
2182        ["vgremove"; "VG"];
2183        ["pvremove"; "/dev/sda1"];
2184        ["vgs"]], []);
2185     InitEmpty, Always, TestOutputListOfDevices (
2186       [["part_disk"; "/dev/sda"; "mbr"];
2187        ["pvcreate"; "/dev/sda1"];
2188        ["vgcreate"; "VG"; "/dev/sda1"];
2189        ["lvcreate"; "LV1"; "VG"; "50"];
2190        ["lvcreate"; "LV2"; "VG"; "50"];
2191        ["vgremove"; "VG"];
2192        ["pvremove"; "/dev/sda1"];
2193        ["pvs"]], [])],
2194    "remove an LVM physical volume",
2195    "\
2196 This wipes a physical volume C<device> so that LVM will no longer
2197 recognise it.
2198
2199 The implementation uses the C<pvremove> command which refuses to
2200 wipe physical volumes that contain any volume groups, so you have
2201 to remove those first.");
2202
2203   ("set_e2label", (RErr, [Device "device"; String "label"]), 80, [],
2204    [InitBasicFS, Always, TestOutput (
2205       [["set_e2label"; "/dev/sda1"; "testlabel"];
2206        ["get_e2label"; "/dev/sda1"]], "testlabel")],
2207    "set the ext2/3/4 filesystem label",
2208    "\
2209 This sets the ext2/3/4 filesystem label of the filesystem on
2210 C<device> to C<label>.  Filesystem labels are limited to
2211 16 characters.
2212
2213 You can use either C<guestfs_tune2fs_l> or C<guestfs_get_e2label>
2214 to return the existing label on a filesystem.");
2215
2216   ("get_e2label", (RString "label", [Device "device"]), 81, [],
2217    [],
2218    "get the ext2/3/4 filesystem label",
2219    "\
2220 This returns the ext2/3/4 filesystem label of the filesystem on
2221 C<device>.");
2222
2223   ("set_e2uuid", (RErr, [Device "device"; String "uuid"]), 82, [],
2224    (let uuid = uuidgen () in
2225     [InitBasicFS, Always, TestOutput (
2226        [["set_e2uuid"; "/dev/sda1"; uuid];
2227         ["get_e2uuid"; "/dev/sda1"]], uuid);
2228      InitBasicFS, Always, TestOutput (
2229        [["set_e2uuid"; "/dev/sda1"; "clear"];
2230         ["get_e2uuid"; "/dev/sda1"]], "");
2231      (* We can't predict what UUIDs will be, so just check the commands run. *)
2232      InitBasicFS, Always, TestRun (
2233        [["set_e2uuid"; "/dev/sda1"; "random"]]);
2234      InitBasicFS, Always, TestRun (
2235        [["set_e2uuid"; "/dev/sda1"; "time"]])]),
2236    "set the ext2/3/4 filesystem UUID",
2237    "\
2238 This sets the ext2/3/4 filesystem UUID of the filesystem on
2239 C<device> to C<uuid>.  The format of the UUID and alternatives
2240 such as C<clear>, C<random> and C<time> are described in the
2241 L<tune2fs(8)> manpage.
2242
2243 You can use either C<guestfs_tune2fs_l> or C<guestfs_get_e2uuid>
2244 to return the existing UUID of a filesystem.");
2245
2246   ("get_e2uuid", (RString "uuid", [Device "device"]), 83, [],
2247    [],
2248    "get the ext2/3/4 filesystem UUID",
2249    "\
2250 This returns the ext2/3/4 filesystem UUID of the filesystem on
2251 C<device>.");
2252
2253   ("fsck", (RInt "status", [String "fstype"; Device "device"]), 84, [],
2254    [InitBasicFS, Always, TestOutputInt (
2255       [["umount"; "/dev/sda1"];
2256        ["fsck"; "ext2"; "/dev/sda1"]], 0);
2257     InitBasicFS, Always, TestOutputInt (
2258       [["umount"; "/dev/sda1"];
2259        ["zero"; "/dev/sda1"];
2260        ["fsck"; "ext2"; "/dev/sda1"]], 8)],
2261    "run the filesystem checker",
2262    "\
2263 This runs the filesystem checker (fsck) on C<device> which
2264 should have filesystem type C<fstype>.
2265
2266 The returned integer is the status.  See L<fsck(8)> for the
2267 list of status codes from C<fsck>.
2268
2269 Notes:
2270
2271 =over 4
2272
2273 =item *
2274
2275 Multiple status codes can be summed together.
2276
2277 =item *
2278
2279 A non-zero return code can mean \"success\", for example if
2280 errors have been corrected on the filesystem.
2281
2282 =item *
2283
2284 Checking or repairing NTFS volumes is not supported
2285 (by linux-ntfs).
2286
2287 =back
2288
2289 This command is entirely equivalent to running C<fsck -a -t fstype device>.");
2290
2291   ("zero", (RErr, [Device "device"]), 85, [],
2292    [InitBasicFS, Always, TestOutput (
2293       [["umount"; "/dev/sda1"];
2294        ["zero"; "/dev/sda1"];
2295        ["file"; "/dev/sda1"]], "data")],
2296    "write zeroes to the device",
2297    "\
2298 This command writes zeroes over the first few blocks of C<device>.
2299
2300 How many blocks are zeroed isn't specified (but it's I<not> enough
2301 to securely wipe the device).  It should be sufficient to remove
2302 any partition tables, filesystem superblocks and so on.
2303
2304 See also: C<guestfs_zero_device>, C<guestfs_scrub_device>.");
2305
2306   ("grub_install", (RErr, [Pathname "root"; Device "device"]), 86, [],
2307    (* Test disabled because grub-install incompatible with virtio-blk driver.
2308     * See also: https://bugzilla.redhat.com/show_bug.cgi?id=479760
2309     *)
2310    [InitBasicFS, Disabled, TestOutputTrue (
2311       [["grub_install"; "/"; "/dev/sda1"];
2312        ["is_dir"; "/boot"]])],
2313    "install GRUB",
2314    "\
2315 This command installs GRUB (the Grand Unified Bootloader) on
2316 C<device>, with the root directory being C<root>.");
2317
2318   ("cp", (RErr, [Pathname "src"; Pathname "dest"]), 87, [],
2319    [InitBasicFS, Always, TestOutput (
2320       [["write_file"; "/old"; "file content"; "0"];
2321        ["cp"; "/old"; "/new"];
2322        ["cat"; "/new"]], "file content");
2323     InitBasicFS, Always, TestOutputTrue (
2324       [["write_file"; "/old"; "file content"; "0"];
2325        ["cp"; "/old"; "/new"];
2326        ["is_file"; "/old"]]);
2327     InitBasicFS, Always, TestOutput (
2328       [["write_file"; "/old"; "file content"; "0"];
2329        ["mkdir"; "/dir"];
2330        ["cp"; "/old"; "/dir/new"];
2331        ["cat"; "/dir/new"]], "file content")],
2332    "copy a file",
2333    "\
2334 This copies a file from C<src> to C<dest> where C<dest> is
2335 either a destination filename or destination directory.");
2336
2337   ("cp_a", (RErr, [Pathname "src"; Pathname "dest"]), 88, [],
2338    [InitBasicFS, Always, TestOutput (
2339       [["mkdir"; "/olddir"];
2340        ["mkdir"; "/newdir"];
2341        ["write_file"; "/olddir/file"; "file content"; "0"];
2342        ["cp_a"; "/olddir"; "/newdir"];
2343        ["cat"; "/newdir/olddir/file"]], "file content")],
2344    "copy a file or directory recursively",
2345    "\
2346 This copies a file or directory from C<src> to C<dest>
2347 recursively using the C<cp -a> command.");
2348
2349   ("mv", (RErr, [Pathname "src"; Pathname "dest"]), 89, [],
2350    [InitBasicFS, Always, TestOutput (
2351       [["write_file"; "/old"; "file content"; "0"];
2352        ["mv"; "/old"; "/new"];
2353        ["cat"; "/new"]], "file content");
2354     InitBasicFS, Always, TestOutputFalse (
2355       [["write_file"; "/old"; "file content"; "0"];
2356        ["mv"; "/old"; "/new"];
2357        ["is_file"; "/old"]])],
2358    "move a file",
2359    "\
2360 This moves a file from C<src> to C<dest> where C<dest> is
2361 either a destination filename or destination directory.");
2362
2363   ("drop_caches", (RErr, [Int "whattodrop"]), 90, [],
2364    [InitEmpty, Always, TestRun (
2365       [["drop_caches"; "3"]])],
2366    "drop kernel page cache, dentries and inodes",
2367    "\
2368 This instructs the guest kernel to drop its page cache,
2369 and/or dentries and inode caches.  The parameter C<whattodrop>
2370 tells the kernel what precisely to drop, see
2371 L<http://linux-mm.org/Drop_Caches>
2372
2373 Setting C<whattodrop> to 3 should drop everything.
2374
2375 This automatically calls L<sync(2)> before the operation,
2376 so that the maximum guest memory is freed.");
2377
2378   ("dmesg", (RString "kmsgs", []), 91, [],
2379    [InitEmpty, Always, TestRun (
2380       [["dmesg"]])],
2381    "return kernel messages",
2382    "\
2383 This returns the kernel messages (C<dmesg> output) from
2384 the guest kernel.  This is sometimes useful for extended
2385 debugging of problems.
2386
2387 Another way to get the same information is to enable
2388 verbose messages with C<guestfs_set_verbose> or by setting
2389 the environment variable C<LIBGUESTFS_DEBUG=1> before
2390 running the program.");
2391
2392   ("ping_daemon", (RErr, []), 92, [],
2393    [InitEmpty, Always, TestRun (
2394       [["ping_daemon"]])],
2395    "ping the guest daemon",
2396    "\
2397 This is a test probe into the guestfs daemon running inside
2398 the qemu subprocess.  Calling this function checks that the
2399 daemon responds to the ping message, without affecting the daemon
2400 or attached block device(s) in any other way.");
2401
2402   ("equal", (RBool "equality", [Pathname "file1"; Pathname "file2"]), 93, [],
2403    [InitBasicFS, Always, TestOutputTrue (
2404       [["write_file"; "/file1"; "contents of a file"; "0"];
2405        ["cp"; "/file1"; "/file2"];
2406        ["equal"; "/file1"; "/file2"]]);
2407     InitBasicFS, Always, TestOutputFalse (
2408       [["write_file"; "/file1"; "contents of a file"; "0"];
2409        ["write_file"; "/file2"; "contents of another file"; "0"];
2410        ["equal"; "/file1"; "/file2"]]);
2411     InitBasicFS, Always, TestLastFail (
2412       [["equal"; "/file1"; "/file2"]])],
2413    "test if two files have equal contents",
2414    "\
2415 This compares the two files C<file1> and C<file2> and returns
2416 true if their content is exactly equal, or false otherwise.
2417
2418 The external L<cmp(1)> program is used for the comparison.");
2419
2420   ("strings", (RStringList "stringsout", [Pathname "path"]), 94, [ProtocolLimitWarning],
2421    [InitISOFS, Always, TestOutputList (
2422       [["strings"; "/known-5"]], ["abcdefghi"; "jklmnopqr"]);
2423     InitISOFS, Always, TestOutputList (
2424       [["strings"; "/empty"]], [])],
2425    "print the printable strings in a file",
2426    "\
2427 This runs the L<strings(1)> command on a file and returns
2428 the list of printable strings found.");
2429
2430   ("strings_e", (RStringList "stringsout", [String "encoding"; Pathname "path"]), 95, [ProtocolLimitWarning],
2431    [InitISOFS, Always, TestOutputList (
2432       [["strings_e"; "b"; "/known-5"]], []);
2433     InitBasicFS, Disabled, TestOutputList (
2434       [["write_file"; "/new"; "\000h\000e\000l\000l\000o\000\n\000w\000o\000r\000l\000d\000\n"; "24"];
2435        ["strings_e"; "b"; "/new"]], ["hello"; "world"])],
2436    "print the printable strings in a file",
2437    "\
2438 This is like the C<guestfs_strings> command, but allows you to
2439 specify the encoding.
2440
2441 See the L<strings(1)> manpage for the full list of encodings.
2442
2443 Commonly useful encodings are C<l> (lower case L) which will
2444 show strings inside Windows/x86 files.
2445
2446 The returned strings are transcoded to UTF-8.");
2447
2448   ("hexdump", (RString "dump", [Pathname "path"]), 96, [ProtocolLimitWarning],
2449    [InitISOFS, Always, TestOutput (
2450       [["hexdump"; "/known-4"]], "00000000  61 62 63 0a 64 65 66 0a  67 68 69                 |abc.def.ghi|\n0000000b\n");
2451     (* Test for RHBZ#501888c2 regression which caused large hexdump
2452      * commands to segfault.
2453      *)
2454     InitISOFS, Always, TestRun (
2455       [["hexdump"; "/100krandom"]])],
2456    "dump a file in hexadecimal",
2457    "\
2458 This runs C<hexdump -C> on the given C<path>.  The result is
2459 the human-readable, canonical hex dump of the file.");
2460
2461   ("zerofree", (RErr, [Device "device"]), 97, [Optional "zerofree"],
2462    [InitNone, Always, TestOutput (
2463       [["part_disk"; "/dev/sda"; "mbr"];
2464        ["mkfs"; "ext3"; "/dev/sda1"];
2465        ["mount_options"; ""; "/dev/sda1"; "/"];
2466        ["write_file"; "/new"; "test file"; "0"];
2467        ["umount"; "/dev/sda1"];
2468        ["zerofree"; "/dev/sda1"];
2469        ["mount_options"; ""; "/dev/sda1"; "/"];
2470        ["cat"; "/new"]], "test file")],
2471    "zero unused inodes and disk blocks on ext2/3 filesystem",
2472    "\
2473 This runs the I<zerofree> program on C<device>.  This program
2474 claims to zero unused inodes and disk blocks on an ext2/3
2475 filesystem, thus making it possible to compress the filesystem
2476 more effectively.
2477
2478 You should B<not> run this program if the filesystem is
2479 mounted.
2480
2481 It is possible that using this program can damage the filesystem
2482 or data on the filesystem.");
2483
2484   ("pvresize", (RErr, [Device "device"]), 98, [Optional "lvm2"],
2485    [],
2486    "resize an LVM physical volume",
2487    "\
2488 This resizes (expands or shrinks) an existing LVM physical
2489 volume to match the new size of the underlying device.");
2490
2491   ("sfdisk_N", (RErr, [Device "device"; Int "partnum";
2492                        Int "cyls"; Int "heads"; Int "sectors";
2493                        String "line"]), 99, [DangerWillRobinson],
2494    [],
2495    "modify a single partition on a block device",
2496    "\
2497 This runs L<sfdisk(8)> option to modify just the single
2498 partition C<n> (note: C<n> counts from 1).
2499
2500 For other parameters, see C<guestfs_sfdisk>.  You should usually
2501 pass C<0> for the cyls/heads/sectors parameters.
2502
2503 See also: C<guestfs_part_add>");
2504
2505   ("sfdisk_l", (RString "partitions", [Device "device"]), 100, [],
2506    [],
2507    "display the partition table",
2508    "\
2509 This displays the partition table on C<device>, in the
2510 human-readable output of the L<sfdisk(8)> command.  It is
2511 not intended to be parsed.
2512
2513 See also: C<guestfs_part_list>");
2514
2515   ("sfdisk_kernel_geometry", (RString "partitions", [Device "device"]), 101, [],
2516    [],
2517    "display the kernel geometry",
2518    "\
2519 This displays the kernel's idea of the geometry of C<device>.
2520
2521 The result is in human-readable format, and not designed to
2522 be parsed.");
2523
2524   ("sfdisk_disk_geometry", (RString "partitions", [Device "device"]), 102, [],
2525    [],
2526    "display the disk geometry from the partition table",
2527    "\
2528 This displays the disk geometry of C<device> read from the
2529 partition table.  Especially in the case where the underlying
2530 block device has been resized, this can be different from the
2531 kernel's idea of the geometry (see C<guestfs_sfdisk_kernel_geometry>).
2532
2533 The result is in human-readable format, and not designed to
2534 be parsed.");
2535
2536   ("vg_activate_all", (RErr, [Bool "activate"]), 103, [Optional "lvm2"],
2537    [],
2538    "activate or deactivate all volume groups",
2539    "\
2540 This command activates or (if C<activate> is false) deactivates
2541 all logical volumes in all volume groups.
2542 If activated, then they are made known to the
2543 kernel, ie. they appear as C</dev/mapper> devices.  If deactivated,
2544 then those devices disappear.
2545
2546 This command is the same as running C<vgchange -a y|n>");
2547
2548   ("vg_activate", (RErr, [Bool "activate"; StringList "volgroups"]), 104, [Optional "lvm2"],
2549    [],
2550    "activate or deactivate some volume groups",
2551    "\
2552 This command activates or (if C<activate> is false) deactivates
2553 all logical volumes in the listed volume groups C<volgroups>.
2554 If activated, then they are made known to the
2555 kernel, ie. they appear as C</dev/mapper> devices.  If deactivated,
2556 then those devices disappear.
2557
2558 This command is the same as running C<vgchange -a y|n volgroups...>
2559
2560 Note that if C<volgroups> is an empty list then B<all> volume groups
2561 are activated or deactivated.");
2562
2563   ("lvresize", (RErr, [Device "device"; Int "mbytes"]), 105, [Optional "lvm2"],
2564    [InitNone, Always, TestOutput (
2565       [["part_disk"; "/dev/sda"; "mbr"];
2566        ["pvcreate"; "/dev/sda1"];
2567        ["vgcreate"; "VG"; "/dev/sda1"];
2568        ["lvcreate"; "LV"; "VG"; "10"];
2569        ["mkfs"; "ext2"; "/dev/VG/LV"];
2570        ["mount_options"; ""; "/dev/VG/LV"; "/"];
2571        ["write_file"; "/new"; "test content"; "0"];
2572        ["umount"; "/"];
2573        ["lvresize"; "/dev/VG/LV"; "20"];
2574        ["e2fsck_f"; "/dev/VG/LV"];
2575        ["resize2fs"; "/dev/VG/LV"];
2576        ["mount_options"; ""; "/dev/VG/LV"; "/"];
2577        ["cat"; "/new"]], "test content")],
2578    "resize an LVM logical volume",
2579    "\
2580 This resizes (expands or shrinks) an existing LVM logical
2581 volume to C<mbytes>.  When reducing, data in the reduced part
2582 is lost.");
2583
2584   ("resize2fs", (RErr, [Device "device"]), 106, [],
2585    [], (* lvresize tests this *)
2586    "resize an ext2/ext3 filesystem",
2587    "\
2588 This resizes an ext2 or ext3 filesystem to match the size of
2589 the underlying device.
2590
2591 I<Note:> It is sometimes required that you run C<guestfs_e2fsck_f>
2592 on the C<device> before calling this command.  For unknown reasons
2593 C<resize2fs> sometimes gives an error about this and sometimes not.
2594 In any case, it is always safe to call C<guestfs_e2fsck_f> before
2595 calling this function.");
2596
2597   ("find", (RStringList "names", [Pathname "directory"]), 107, [ProtocolLimitWarning],
2598    [InitBasicFS, Always, TestOutputList (
2599       [["find"; "/"]], ["lost+found"]);
2600     InitBasicFS, Always, TestOutputList (
2601       [["touch"; "/a"];
2602        ["mkdir"; "/b"];
2603        ["touch"; "/b/c"];
2604        ["find"; "/"]], ["a"; "b"; "b/c"; "lost+found"]);
2605     InitBasicFS, Always, TestOutputList (
2606       [["mkdir_p"; "/a/b/c"];
2607        ["touch"; "/a/b/c/d"];
2608        ["find"; "/a/b/"]], ["c"; "c/d"])],
2609    "find all files and directories",
2610    "\
2611 This command lists out all files and directories, recursively,
2612 starting at C<directory>.  It is essentially equivalent to
2613 running the shell command C<find directory -print> but some
2614 post-processing happens on the output, described below.
2615
2616 This returns a list of strings I<without any prefix>.  Thus
2617 if the directory structure was:
2618
2619  /tmp/a
2620  /tmp/b
2621  /tmp/c/d
2622
2623 then the returned list from C<guestfs_find> C</tmp> would be
2624 4 elements:
2625
2626  a
2627  b
2628  c
2629  c/d
2630
2631 If C<directory> is not a directory, then this command returns
2632 an error.
2633
2634 The returned list is sorted.
2635
2636 See also C<guestfs_find0>.");
2637
2638   ("e2fsck_f", (RErr, [Device "device"]), 108, [],
2639    [], (* lvresize tests this *)
2640    "check an ext2/ext3 filesystem",
2641    "\
2642 This runs C<e2fsck -p -f device>, ie. runs the ext2/ext3
2643 filesystem checker on C<device>, noninteractively (C<-p>),
2644 even if the filesystem appears to be clean (C<-f>).
2645
2646 This command is only needed because of C<guestfs_resize2fs>
2647 (q.v.).  Normally you should use C<guestfs_fsck>.");
2648
2649   ("sleep", (RErr, [Int "secs"]), 109, [],
2650    [InitNone, Always, TestRun (
2651       [["sleep"; "1"]])],
2652    "sleep for some seconds",
2653    "\
2654 Sleep for C<secs> seconds.");
2655
2656   ("ntfs_3g_probe", (RInt "status", [Bool "rw"; Device "device"]), 110, [Optional "ntfs3g"],
2657    [InitNone, Always, TestOutputInt (
2658       [["part_disk"; "/dev/sda"; "mbr"];
2659        ["mkfs"; "ntfs"; "/dev/sda1"];
2660        ["ntfs_3g_probe"; "true"; "/dev/sda1"]], 0);
2661     InitNone, Always, TestOutputInt (
2662       [["part_disk"; "/dev/sda"; "mbr"];
2663        ["mkfs"; "ext2"; "/dev/sda1"];
2664        ["ntfs_3g_probe"; "true"; "/dev/sda1"]], 12)],
2665    "probe NTFS volume",
2666    "\
2667 This command runs the L<ntfs-3g.probe(8)> command which probes
2668 an NTFS C<device> for mountability.  (Not all NTFS volumes can
2669 be mounted read-write, and some cannot be mounted at all).
2670
2671 C<rw> is a boolean flag.  Set it to true if you want to test
2672 if the volume can be mounted read-write.  Set it to false if
2673 you want to test if the volume can be mounted read-only.
2674
2675 The return value is an integer which C<0> if the operation
2676 would succeed, or some non-zero value documented in the
2677 L<ntfs-3g.probe(8)> manual page.");
2678
2679   ("sh", (RString "output", [String "command"]), 111, [],
2680    [], (* XXX needs tests *)
2681    "run a command via the shell",
2682    "\
2683 This call runs a command from the guest filesystem via the
2684 guest's C</bin/sh>.
2685
2686 This is like C<guestfs_command>, but passes the command to:
2687
2688  /bin/sh -c \"command\"
2689
2690 Depending on the guest's shell, this usually results in
2691 wildcards being expanded, shell expressions being interpolated
2692 and so on.
2693
2694 All the provisos about C<guestfs_command> apply to this call.");
2695
2696   ("sh_lines", (RStringList "lines", [String "command"]), 112, [],
2697    [], (* XXX needs tests *)
2698    "run a command via the shell returning lines",
2699    "\
2700 This is the same as C<guestfs_sh>, but splits the result
2701 into a list of lines.
2702
2703 See also: C<guestfs_command_lines>");
2704
2705   ("glob_expand", (RStringList "paths", [Pathname "pattern"]), 113, [],
2706    (* Use Pathname here, and hence ABS_PATH (pattern,... in generated
2707     * code in stubs.c, since all valid glob patterns must start with "/".
2708     * There is no concept of "cwd" in libguestfs, hence no "."-relative names.
2709     *)
2710    [InitBasicFS, Always, TestOutputList (
2711       [["mkdir_p"; "/a/b/c"];
2712        ["touch"; "/a/b/c/d"];
2713        ["touch"; "/a/b/c/e"];
2714        ["glob_expand"; "/a/b/c/*"]], ["/a/b/c/d"; "/a/b/c/e"]);
2715     InitBasicFS, Always, TestOutputList (
2716       [["mkdir_p"; "/a/b/c"];
2717        ["touch"; "/a/b/c/d"];
2718        ["touch"; "/a/b/c/e"];
2719        ["glob_expand"; "/a/*/c/*"]], ["/a/b/c/d"; "/a/b/c/e"]);
2720     InitBasicFS, Always, TestOutputList (
2721       [["mkdir_p"; "/a/b/c"];
2722        ["touch"; "/a/b/c/d"];
2723        ["touch"; "/a/b/c/e"];
2724        ["glob_expand"; "/a/*/x/*"]], [])],
2725    "expand a wildcard path",
2726    "\
2727 This command searches for all the pathnames matching
2728 C<pattern> according to the wildcard expansion rules
2729 used by the shell.
2730
2731 If no paths match, then this returns an empty list
2732 (note: not an error).
2733
2734 It is just a wrapper around the C L<glob(3)> function
2735 with flags C<GLOB_MARK|GLOB_BRACE>.
2736 See that manual page for more details.");
2737
2738   ("scrub_device", (RErr, [Device "device"]), 114, [DangerWillRobinson; Optional "scrub"],
2739    [InitNone, Always, TestRun ( (* use /dev/sdc because it's smaller *)
2740       [["scrub_device"; "/dev/sdc"]])],
2741    "scrub (securely wipe) a device",
2742    "\
2743 This command writes patterns over C<device> to make data retrieval
2744 more difficult.
2745
2746 It is an interface to the L<scrub(1)> program.  See that
2747 manual page for more details.");
2748
2749   ("scrub_file", (RErr, [Pathname "file"]), 115, [Optional "scrub"],
2750    [InitBasicFS, Always, TestRun (
2751       [["write_file"; "/file"; "content"; "0"];
2752        ["scrub_file"; "/file"]])],
2753    "scrub (securely wipe) a file",
2754    "\
2755 This command writes patterns over a file to make data retrieval
2756 more difficult.
2757
2758 The file is I<removed> after scrubbing.
2759
2760 It is an interface to the L<scrub(1)> program.  See that
2761 manual page for more details.");
2762
2763   ("scrub_freespace", (RErr, [Pathname "dir"]), 116, [Optional "scrub"],
2764    [], (* XXX needs testing *)
2765    "scrub (securely wipe) free space",
2766    "\
2767 This command creates the directory C<dir> and then fills it
2768 with files until the filesystem is full, and scrubs the files
2769 as for C<guestfs_scrub_file>, and deletes them.
2770 The intention is to scrub any free space on the partition
2771 containing C<dir>.
2772
2773 It is an interface to the L<scrub(1)> program.  See that
2774 manual page for more details.");
2775
2776   ("mkdtemp", (RString "dir", [Pathname "template"]), 117, [],
2777    [InitBasicFS, Always, TestRun (
2778       [["mkdir"; "/tmp"];
2779        ["mkdtemp"; "/tmp/tmpXXXXXX"]])],
2780    "create a temporary directory",
2781    "\
2782 This command creates a temporary directory.  The
2783 C<template> parameter should be a full pathname for the
2784 temporary directory name with the final six characters being
2785 \"XXXXXX\".
2786
2787 For example: \"/tmp/myprogXXXXXX\" or \"/Temp/myprogXXXXXX\",
2788 the second one being suitable for Windows filesystems.
2789
2790 The name of the temporary directory that was created
2791 is returned.
2792
2793 The temporary directory is created with mode 0700
2794 and is owned by root.
2795
2796 The caller is responsible for deleting the temporary
2797 directory and its contents after use.
2798
2799 See also: L<mkdtemp(3)>");
2800
2801   ("wc_l", (RInt "lines", [Pathname "path"]), 118, [],
2802    [InitISOFS, Always, TestOutputInt (
2803       [["wc_l"; "/10klines"]], 10000)],
2804    "count lines in a file",
2805    "\
2806 This command counts the lines in a file, using the
2807 C<wc -l> external command.");
2808
2809   ("wc_w", (RInt "words", [Pathname "path"]), 119, [],
2810    [InitISOFS, Always, TestOutputInt (
2811       [["wc_w"; "/10klines"]], 10000)],
2812    "count words in a file",
2813    "\
2814 This command counts the words in a file, using the
2815 C<wc -w> external command.");
2816
2817   ("wc_c", (RInt "chars", [Pathname "path"]), 120, [],
2818    [InitISOFS, Always, TestOutputInt (
2819       [["wc_c"; "/100kallspaces"]], 102400)],
2820    "count characters in a file",
2821    "\
2822 This command counts the characters in a file, using the
2823 C<wc -c> external command.");
2824
2825   ("head", (RStringList "lines", [Pathname "path"]), 121, [ProtocolLimitWarning],
2826    [InitISOFS, Always, TestOutputList (
2827       [["head"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz";"3abcdefghijklmnopqrstuvwxyz";"4abcdefghijklmnopqrstuvwxyz";"5abcdefghijklmnopqrstuvwxyz";"6abcdefghijklmnopqrstuvwxyz";"7abcdefghijklmnopqrstuvwxyz";"8abcdefghijklmnopqrstuvwxyz";"9abcdefghijklmnopqrstuvwxyz"])],
2828    "return first 10 lines of a file",
2829    "\
2830 This command returns up to the first 10 lines of a file as
2831 a list of strings.");
2832
2833   ("head_n", (RStringList "lines", [Int "nrlines"; Pathname "path"]), 122, [ProtocolLimitWarning],
2834    [InitISOFS, Always, TestOutputList (
2835       [["head_n"; "3"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz"]);
2836     InitISOFS, Always, TestOutputList (
2837       [["head_n"; "-9997"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz"]);
2838     InitISOFS, Always, TestOutputList (
2839       [["head_n"; "0"; "/10klines"]], [])],
2840    "return first N lines of a file",
2841    "\
2842 If the parameter C<nrlines> is a positive number, this returns the first
2843 C<nrlines> lines of the file C<path>.
2844
2845 If the parameter C<nrlines> is a negative number, this returns lines
2846 from the file C<path>, excluding the last C<nrlines> lines.
2847
2848 If the parameter C<nrlines> is zero, this returns an empty list.");
2849
2850   ("tail", (RStringList "lines", [Pathname "path"]), 123, [ProtocolLimitWarning],
2851    [InitISOFS, Always, TestOutputList (
2852       [["tail"; "/10klines"]], ["9990abcdefghijklmnopqrstuvwxyz";"9991abcdefghijklmnopqrstuvwxyz";"9992abcdefghijklmnopqrstuvwxyz";"9993abcdefghijklmnopqrstuvwxyz";"9994abcdefghijklmnopqrstuvwxyz";"9995abcdefghijklmnopqrstuvwxyz";"9996abcdefghijklmnopqrstuvwxyz";"9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"])],
2853    "return last 10 lines of a file",
2854    "\
2855 This command returns up to the last 10 lines of a file as
2856 a list of strings.");
2857
2858   ("tail_n", (RStringList "lines", [Int "nrlines"; Pathname "path"]), 124, [ProtocolLimitWarning],
2859    [InitISOFS, Always, TestOutputList (
2860       [["tail_n"; "3"; "/10klines"]], ["9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"]);
2861     InitISOFS, Always, TestOutputList (
2862       [["tail_n"; "-9998"; "/10klines"]], ["9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"]);
2863     InitISOFS, Always, TestOutputList (
2864       [["tail_n"; "0"; "/10klines"]], [])],
2865    "return last N lines of a file",
2866    "\
2867 If the parameter C<nrlines> is a positive number, this returns the last
2868 C<nrlines> lines of the file C<path>.
2869
2870 If the parameter C<nrlines> is a negative number, this returns lines
2871 from the file C<path>, starting with the C<-nrlines>th line.
2872
2873 If the parameter C<nrlines> is zero, this returns an empty list.");
2874
2875   ("df", (RString "output", []), 125, [],
2876    [], (* XXX Tricky to test because it depends on the exact format
2877         * of the 'df' command and other imponderables.
2878         *)
2879    "report file system disk space usage",
2880    "\
2881 This command runs the C<df> command to report disk space used.
2882
2883 This command is mostly useful for interactive sessions.  It
2884 is I<not> intended that you try to parse the output string.
2885 Use C<statvfs> from programs.");
2886
2887   ("df_h", (RString "output", []), 126, [],
2888    [], (* XXX Tricky to test because it depends on the exact format
2889         * of the 'df' command and other imponderables.
2890         *)
2891    "report file system disk space usage (human readable)",
2892    "\
2893 This command runs the C<df -h> command to report disk space used
2894 in human-readable format.
2895
2896 This command is mostly useful for interactive sessions.  It
2897 is I<not> intended that you try to parse the output string.
2898 Use C<statvfs> from programs.");
2899
2900   ("du", (RInt64 "sizekb", [Pathname "path"]), 127, [],
2901    [InitISOFS, Always, TestOutputInt (
2902       [["du"; "/directory"]], 2 (* ISO fs blocksize is 2K *))],
2903    "estimate file space usage",
2904    "\
2905 This command runs the C<du -s> command to estimate file space
2906 usage for C<path>.
2907
2908 C<path> can be a file or a directory.  If C<path> is a directory
2909 then the estimate includes the contents of the directory and all
2910 subdirectories (recursively).
2911
2912 The result is the estimated size in I<kilobytes>
2913 (ie. units of 1024 bytes).");
2914
2915   ("initrd_list", (RStringList "filenames", [Pathname "path"]), 128, [],
2916    [InitISOFS, Always, TestOutputList (
2917       [["initrd_list"; "/initrd"]], ["empty";"known-1";"known-2";"known-3";"known-4"; "known-5"])],
2918    "list files in an initrd",
2919    "\
2920 This command lists out files contained in an initrd.
2921
2922 The files are listed without any initial C</> character.  The
2923 files are listed in the order they appear (not necessarily
2924 alphabetical).  Directory names are listed as separate items.
2925
2926 Old Linux kernels (2.4 and earlier) used a compressed ext2
2927 filesystem as initrd.  We I<only> support the newer initramfs
2928 format (compressed cpio files).");
2929
2930   ("mount_loop", (RErr, [Pathname "file"; Pathname "mountpoint"]), 129, [],
2931    [],
2932    "mount a file using the loop device",
2933    "\
2934 This command lets you mount C<file> (a filesystem image
2935 in a file) on a mount point.  It is entirely equivalent to
2936 the command C<mount -o loop file mountpoint>.");
2937
2938   ("mkswap", (RErr, [Device "device"]), 130, [],
2939    [InitEmpty, Always, TestRun (
2940       [["part_disk"; "/dev/sda"; "mbr"];
2941        ["mkswap"; "/dev/sda1"]])],
2942    "create a swap partition",
2943    "\
2944 Create a swap partition on C<device>.");
2945
2946   ("mkswap_L", (RErr, [String "label"; Device "device"]), 131, [],
2947    [InitEmpty, Always, TestRun (
2948       [["part_disk"; "/dev/sda"; "mbr"];
2949        ["mkswap_L"; "hello"; "/dev/sda1"]])],
2950    "create a swap partition with a label",
2951    "\
2952 Create a swap partition on C<device> with label C<label>.
2953
2954 Note that you cannot attach a swap label to a block device
2955 (eg. C</dev/sda>), just to a partition.  This appears to be
2956 a limitation of the kernel or swap tools.");
2957
2958   ("mkswap_U", (RErr, [String "uuid"; Device "device"]), 132, [Optional "linuxfsuuid"],
2959    (let uuid = uuidgen () in
2960     [InitEmpty, Always, TestRun (
2961        [["part_disk"; "/dev/sda"; "mbr"];
2962         ["mkswap_U"; uuid; "/dev/sda1"]])]),
2963    "create a swap partition with an explicit UUID",
2964    "\
2965 Create a swap partition on C<device> with UUID C<uuid>.");
2966
2967   ("mknod", (RErr, [Int "mode"; Int "devmajor"; Int "devminor"; Pathname "path"]), 133, [Optional "mknod"],
2968    [InitBasicFS, Always, TestOutputStruct (
2969       [["mknod"; "0o10777"; "0"; "0"; "/node"];
2970        (* NB: default umask 022 means 0777 -> 0755 in these tests *)
2971        ["stat"; "/node"]], [CompareWithInt ("mode", 0o10755)]);
2972     InitBasicFS, Always, TestOutputStruct (
2973       [["mknod"; "0o60777"; "66"; "99"; "/node"];
2974        ["stat"; "/node"]], [CompareWithInt ("mode", 0o60755)])],
2975    "make block, character or FIFO devices",
2976    "\
2977 This call creates block or character special devices, or
2978 named pipes (FIFOs).
2979
2980 The C<mode> parameter should be the mode, using the standard
2981 constants.  C<devmajor> and C<devminor> are the
2982 device major and minor numbers, only used when creating block
2983 and character special devices.");
2984
2985   ("mkfifo", (RErr, [Int "mode"; Pathname "path"]), 134, [Optional "mknod"],
2986    [InitBasicFS, Always, TestOutputStruct (
2987       [["mkfifo"; "0o777"; "/node"];
2988        ["stat"; "/node"]], [CompareWithInt ("mode", 0o10755)])],
2989    "make FIFO (named pipe)",
2990    "\
2991 This call creates a FIFO (named pipe) called C<path> with
2992 mode C<mode>.  It is just a convenient wrapper around
2993 C<guestfs_mknod>.");
2994
2995   ("mknod_b", (RErr, [Int "mode"; Int "devmajor"; Int "devminor"; Pathname "path"]), 135, [Optional "mknod"],
2996    [InitBasicFS, Always, TestOutputStruct (
2997       [["mknod_b"; "0o777"; "99"; "66"; "/node"];
2998        ["stat"; "/node"]], [CompareWithInt ("mode", 0o60755)])],
2999    "make block device node",
3000    "\
3001 This call creates a block device node called C<path> with
3002 mode C<mode> and device major/minor C<devmajor> and C<devminor>.
3003 It is just a convenient wrapper around C<guestfs_mknod>.");
3004
3005   ("mknod_c", (RErr, [Int "mode"; Int "devmajor"; Int "devminor"; Pathname "path"]), 136, [Optional "mknod"],
3006    [InitBasicFS, Always, TestOutputStruct (
3007       [["mknod_c"; "0o777"; "99"; "66"; "/node"];
3008        ["stat"; "/node"]], [CompareWithInt ("mode", 0o20755)])],
3009    "make char device node",
3010    "\
3011 This call creates a char device node called C<path> with
3012 mode C<mode> and device major/minor C<devmajor> and C<devminor>.
3013 It is just a convenient wrapper around C<guestfs_mknod>.");
3014
3015   ("umask", (RInt "oldmask", [Int "mask"]), 137, [],
3016    [], (* XXX umask is one of those stateful things that we should
3017         * reset between each test.
3018         *)
3019    "set file mode creation mask (umask)",
3020    "\
3021 This function sets the mask used for creating new files and
3022 device nodes to C<mask & 0777>.
3023
3024 Typical umask values would be C<022> which creates new files
3025 with permissions like \"-rw-r--r--\" or \"-rwxr-xr-x\", and
3026 C<002> which creates new files with permissions like
3027 \"-rw-rw-r--\" or \"-rwxrwxr-x\".
3028
3029 The default umask is C<022>.  This is important because it
3030 means that directories and device nodes will be created with
3031 C<0644> or C<0755> mode even if you specify C<0777>.
3032
3033 See also L<umask(2)>, C<guestfs_mknod>, C<guestfs_mkdir>.
3034
3035 This call returns the previous umask.");
3036
3037   ("readdir", (RStructList ("entries", "dirent"), [Pathname "dir"]), 138, [],
3038    [],
3039    "read directories entries",
3040    "\
3041 This returns the list of directory entries in directory C<dir>.
3042
3043 All entries in the directory are returned, including C<.> and
3044 C<..>.  The entries are I<not> sorted, but returned in the same
3045 order as the underlying filesystem.
3046
3047 Also this call returns basic file type information about each
3048 file.  The C<ftyp> field will contain one of the following characters:
3049
3050 =over 4
3051
3052 =item 'b'
3053
3054 Block special
3055
3056 =item 'c'
3057
3058 Char special
3059
3060 =item 'd'
3061
3062 Directory
3063
3064 =item 'f'
3065
3066 FIFO (named pipe)
3067
3068 =item 'l'
3069
3070 Symbolic link
3071
3072 =item 'r'
3073
3074 Regular file
3075
3076 =item 's'
3077
3078 Socket
3079
3080 =item 'u'
3081
3082 Unknown file type
3083
3084 =item '?'
3085
3086 The L<readdir(3)> returned a C<d_type> field with an
3087 unexpected value
3088
3089 =back
3090
3091 This function is primarily intended for use by programs.  To
3092 get a simple list of names, use C<guestfs_ls>.  To get a printable
3093 directory for human consumption, use C<guestfs_ll>.");
3094
3095   ("sfdiskM", (RErr, [Device "device"; StringList "lines"]), 139, [DangerWillRobinson],
3096    [],
3097    "create partitions on a block device",
3098    "\
3099 This is a simplified interface to the C<guestfs_sfdisk>
3100 command, where partition sizes are specified in megabytes
3101 only (rounded to the nearest cylinder) and you don't need
3102 to specify the cyls, heads and sectors parameters which
3103 were rarely if ever used anyway.
3104
3105 See also: C<guestfs_sfdisk>, the L<sfdisk(8)> manpage
3106 and C<guestfs_part_disk>");
3107
3108   ("zfile", (RString "description", [String "meth"; Pathname "path"]), 140, [DeprecatedBy "file"],
3109    [],
3110    "determine file type inside a compressed file",
3111    "\
3112 This command runs C<file> after first decompressing C<path>
3113 using C<method>.
3114
3115 C<method> must be one of C<gzip>, C<compress> or C<bzip2>.
3116
3117 Since 1.0.63, use C<guestfs_file> instead which can now
3118 process compressed files.");
3119
3120   ("getxattrs", (RStructList ("xattrs", "xattr"), [Pathname "path"]), 141, [Optional "linuxxattrs"],
3121    [],
3122    "list extended attributes of a file or directory",
3123    "\
3124 This call lists the extended attributes of the file or directory
3125 C<path>.
3126
3127 At the system call level, this is a combination of the
3128 L<listxattr(2)> and L<getxattr(2)> calls.
3129
3130 See also: C<guestfs_lgetxattrs>, L<attr(5)>.");
3131
3132   ("lgetxattrs", (RStructList ("xattrs", "xattr"), [Pathname "path"]), 142, [Optional "linuxxattrs"],
3133    [],
3134    "list extended attributes of a file or directory",
3135    "\
3136 This is the same as C<guestfs_getxattrs>, but if C<path>
3137 is a symbolic link, then it returns the extended attributes
3138 of the link itself.");
3139
3140   ("setxattr", (RErr, [String "xattr";
3141                        String "val"; Int "vallen"; (* will be BufferIn *)
3142                        Pathname "path"]), 143, [Optional "linuxxattrs"],
3143    [],
3144    "set extended attribute of a file or directory",
3145    "\
3146 This call sets the extended attribute named C<xattr>
3147 of the file C<path> to the value C<val> (of length C<vallen>).
3148 The value is arbitrary 8 bit data.
3149
3150 See also: C<guestfs_lsetxattr>, L<attr(5)>.");
3151
3152   ("lsetxattr", (RErr, [String "xattr";
3153                         String "val"; Int "vallen"; (* will be BufferIn *)
3154                         Pathname "path"]), 144, [Optional "linuxxattrs"],
3155    [],
3156    "set extended attribute of a file or directory",
3157    "\
3158 This is the same as C<guestfs_setxattr>, but if C<path>
3159 is a symbolic link, then it sets an extended attribute
3160 of the link itself.");
3161
3162   ("removexattr", (RErr, [String "xattr"; Pathname "path"]), 145, [Optional "linuxxattrs"],
3163    [],
3164    "remove extended attribute of a file or directory",
3165    "\
3166 This call removes the extended attribute named C<xattr>
3167 of the file C<path>.
3168
3169 See also: C<guestfs_lremovexattr>, L<attr(5)>.");
3170
3171   ("lremovexattr", (RErr, [String "xattr"; Pathname "path"]), 146, [Optional "linuxxattrs"],
3172    [],
3173    "remove extended attribute of a file or directory",
3174    "\
3175 This is the same as C<guestfs_removexattr>, but if C<path>
3176 is a symbolic link, then it removes an extended attribute
3177 of the link itself.");
3178
3179   ("mountpoints", (RHashtable "mps", []), 147, [],
3180    [],
3181    "show mountpoints",
3182    "\
3183 This call is similar to C<guestfs_mounts>.  That call returns
3184 a list of devices.  This one returns a hash table (map) of
3185 device name to directory where the device is mounted.");
3186
3187   ("mkmountpoint", (RErr, [String "exemptpath"]), 148, [],
3188    (* This is a special case: while you would expect a parameter
3189     * of type "Pathname", that doesn't work, because it implies
3190     * NEED_ROOT in the generated calling code in stubs.c, and
3191     * this function cannot use NEED_ROOT.
3192     *)
3193    [],
3194    "create a mountpoint",
3195    "\
3196 C<guestfs_mkmountpoint> and C<guestfs_rmmountpoint> are
3197 specialized calls that can be used to create extra mountpoints
3198 before mounting the first filesystem.
3199
3200 These calls are I<only> necessary in some very limited circumstances,
3201 mainly the case where you want to mount a mix of unrelated and/or
3202 read-only filesystems together.
3203
3204 For example, live CDs often contain a \"Russian doll\" nest of
3205 filesystems, an ISO outer layer, with a squashfs image inside, with
3206 an ext2/3 image inside that.  You can unpack this as follows
3207 in guestfish:
3208
3209  add-ro Fedora-11-i686-Live.iso
3210  run
3211  mkmountpoint /cd
3212  mkmountpoint /squash
3213  mkmountpoint /ext3
3214  mount /dev/sda /cd
3215  mount-loop /cd/LiveOS/squashfs.img /squash
3216  mount-loop /squash/LiveOS/ext3fs.img /ext3
3217
3218 The inner filesystem is now unpacked under the /ext3 mountpoint.");
3219
3220   ("rmmountpoint", (RErr, [String "exemptpath"]), 149, [],
3221    [],
3222    "remove a mountpoint",
3223    "\
3224 This calls removes a mountpoint that was previously created
3225 with C<guestfs_mkmountpoint>.  See C<guestfs_mkmountpoint>
3226 for full details.");
3227
3228   ("read_file", (RBufferOut "content", [Pathname "path"]), 150, [ProtocolLimitWarning],
3229    [InitISOFS, Always, TestOutputBuffer (
3230       [["read_file"; "/known-4"]], "abc\ndef\nghi")],
3231    "read a file",
3232    "\
3233 This calls returns the contents of the file C<path> as a
3234 buffer.
3235
3236 Unlike C<guestfs_cat>, this function can correctly
3237 handle files that contain embedded ASCII NUL characters.
3238 However unlike C<guestfs_download>, this function is limited
3239 in the total size of file that can be handled.");
3240
3241   ("grep", (RStringList "lines", [String "regex"; Pathname "path"]), 151, [ProtocolLimitWarning],
3242    [InitISOFS, Always, TestOutputList (
3243       [["grep"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"]);
3244     InitISOFS, Always, TestOutputList (
3245       [["grep"; "nomatch"; "/test-grep.txt"]], [])],
3246    "return lines matching a pattern",
3247    "\
3248 This calls the external C<grep> program and returns the
3249 matching lines.");
3250
3251   ("egrep", (RStringList "lines", [String "regex"; Pathname "path"]), 152, [ProtocolLimitWarning],
3252    [InitISOFS, Always, TestOutputList (
3253       [["egrep"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"])],
3254    "return lines matching a pattern",
3255    "\
3256 This calls the external C<egrep> program and returns the
3257 matching lines.");
3258
3259   ("fgrep", (RStringList "lines", [String "pattern"; Pathname "path"]), 153, [ProtocolLimitWarning],
3260    [InitISOFS, Always, TestOutputList (
3261       [["fgrep"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"])],
3262    "return lines matching a pattern",
3263    "\
3264 This calls the external C<fgrep> program and returns the
3265 matching lines.");
3266
3267   ("grepi", (RStringList "lines", [String "regex"; Pathname "path"]), 154, [ProtocolLimitWarning],
3268    [InitISOFS, Always, TestOutputList (
3269       [["grepi"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"; "ABC"])],
3270    "return lines matching a pattern",
3271    "\
3272 This calls the external C<grep -i> program and returns the
3273 matching lines.");
3274
3275   ("egrepi", (RStringList "lines", [String "regex"; Pathname "path"]), 155, [ProtocolLimitWarning],
3276    [InitISOFS, Always, TestOutputList (
3277       [["egrepi"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"; "ABC"])],
3278    "return lines matching a pattern",
3279    "\
3280 This calls the external C<egrep -i> program and returns the
3281 matching lines.");
3282
3283   ("fgrepi", (RStringList "lines", [String "pattern"; Pathname "path"]), 156, [ProtocolLimitWarning],
3284    [InitISOFS, Always, TestOutputList (
3285       [["fgrepi"; "abc"; "/test-grep.txt"]], ["abc"; "abc123"; "ABC"])],
3286    "return lines matching a pattern",
3287    "\
3288 This calls the external C<fgrep -i> program and returns the
3289 matching lines.");
3290
3291   ("zgrep", (RStringList "lines", [String "regex"; Pathname "path"]), 157, [ProtocolLimitWarning],
3292    [InitISOFS, Always, TestOutputList (
3293       [["zgrep"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"])],
3294    "return lines matching a pattern",
3295    "\
3296 This calls the external C<zgrep> program and returns the
3297 matching lines.");
3298
3299   ("zegrep", (RStringList "lines", [String "regex"; Pathname "path"]), 158, [ProtocolLimitWarning],
3300    [InitISOFS, Always, TestOutputList (
3301       [["zegrep"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"])],
3302    "return lines matching a pattern",
3303    "\
3304 This calls the external C<zegrep> program and returns the
3305 matching lines.");
3306
3307   ("zfgrep", (RStringList "lines", [String "pattern"; Pathname "path"]), 159, [ProtocolLimitWarning],
3308    [InitISOFS, Always, TestOutputList (
3309       [["zfgrep"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"])],
3310    "return lines matching a pattern",
3311    "\
3312 This calls the external C<zfgrep> program and returns the
3313 matching lines.");
3314
3315   ("zgrepi", (RStringList "lines", [String "regex"; Pathname "path"]), 160, [ProtocolLimitWarning],
3316    [InitISOFS, Always, TestOutputList (
3317       [["zgrepi"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"; "ABC"])],
3318    "return lines matching a pattern",
3319    "\
3320 This calls the external C<zgrep -i> program and returns the
3321 matching lines.");
3322
3323   ("zegrepi", (RStringList "lines", [String "regex"; Pathname "path"]), 161, [ProtocolLimitWarning],
3324    [InitISOFS, Always, TestOutputList (
3325       [["zegrepi"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"; "ABC"])],
3326    "return lines matching a pattern",
3327    "\
3328 This calls the external C<zegrep -i> program and returns the
3329 matching lines.");
3330
3331   ("zfgrepi", (RStringList "lines", [String "pattern"; Pathname "path"]), 162, [ProtocolLimitWarning],
3332    [InitISOFS, Always, TestOutputList (
3333       [["zfgrepi"; "abc"; "/test-grep.txt.gz"]], ["abc"; "abc123"; "ABC"])],
3334    "return lines matching a pattern",
3335    "\
3336 This calls the external C<zfgrep -i> program and returns the
3337 matching lines.");
3338
3339   ("realpath", (RString "rpath", [Pathname "path"]), 163, [Optional "realpath"],
3340    [InitISOFS, Always, TestOutput (
3341       [["realpath"; "/../directory"]], "/directory")],
3342    "canonicalized absolute pathname",
3343    "\
3344 Return the canonicalized absolute pathname of C<path>.  The
3345 returned path has no C<.>, C<..> or symbolic link path elements.");
3346
3347   ("ln", (RErr, [String "target"; Pathname "linkname"]), 164, [],
3348    [InitBasicFS, Always, TestOutputStruct (
3349       [["touch"; "/a"];
3350        ["ln"; "/a"; "/b"];
3351        ["stat"; "/b"]], [CompareWithInt ("nlink", 2)])],
3352    "create a hard link",
3353    "\
3354 This command creates a hard link using the C<ln> command.");
3355
3356   ("ln_f", (RErr, [String "target"; Pathname "linkname"]), 165, [],
3357    [InitBasicFS, Always, TestOutputStruct (
3358       [["touch"; "/a"];
3359        ["touch"; "/b"];
3360        ["ln_f"; "/a"; "/b"];
3361        ["stat"; "/b"]], [CompareWithInt ("nlink", 2)])],
3362    "create a hard link",
3363    "\
3364 This command creates a hard link using the C<ln -f> command.
3365 The C<-f> option removes the link (C<linkname>) if it exists already.");
3366
3367   ("ln_s", (RErr, [String "target"; Pathname "linkname"]), 166, [],
3368    [InitBasicFS, Always, TestOutputStruct (
3369       [["touch"; "/a"];
3370        ["ln_s"; "a"; "/b"];
3371        ["lstat"; "/b"]], [CompareWithInt ("mode", 0o120777)])],
3372    "create a symbolic link",
3373    "\
3374 This command creates a symbolic link using the C<ln -s> command.");
3375
3376   ("ln_sf", (RErr, [String "target"; Pathname "linkname"]), 167, [],
3377    [InitBasicFS, Always, TestOutput (
3378       [["mkdir_p"; "/a/b"];
3379        ["touch"; "/a/b/c"];
3380        ["ln_sf"; "../d"; "/a/b/c"];
3381        ["readlink"; "/a/b/c"]], "../d")],
3382    "create a symbolic link",
3383    "\
3384 This command creates a symbolic link using the C<ln -sf> command,
3385 The C<-f> option removes the link (C<linkname>) if it exists already.");
3386
3387   ("readlink", (RString "link", [Pathname "path"]), 168, [],
3388    [] (* XXX tested above *),
3389    "read the target of a symbolic link",
3390    "\
3391 This command reads the target of a symbolic link.");
3392
3393   ("fallocate", (RErr, [Pathname "path"; Int "len"]), 169, [],
3394    [InitBasicFS, Always, TestOutputStruct (
3395       [["fallocate"; "/a"; "1000000"];
3396        ["stat"; "/a"]], [CompareWithInt ("size", 1_000_000)])],
3397    "preallocate a file in the guest filesystem",
3398    "\
3399 This command preallocates a file (containing zero bytes) named
3400 C<path> of size C<len> bytes.  If the file exists already, it
3401 is overwritten.
3402
3403 Do not confuse this with the guestfish-specific
3404 C<alloc> command which allocates a file in the host and
3405 attaches it as a device.");
3406
3407   ("swapon_device", (RErr, [Device "device"]), 170, [],
3408    [InitPartition, Always, TestRun (
3409       [["mkswap"; "/dev/sda1"];
3410        ["swapon_device"; "/dev/sda1"];
3411        ["swapoff_device"; "/dev/sda1"]])],
3412    "enable swap on device",
3413    "\
3414 This command enables the libguestfs appliance to use the
3415 swap device or partition named C<device>.  The increased
3416 memory is made available for all commands, for example
3417 those run using C<guestfs_command> or C<guestfs_sh>.
3418
3419 Note that you should not swap to existing guest swap
3420 partitions unless you know what you are doing.  They may
3421 contain hibernation information, or other information that
3422 the guest doesn't want you to trash.  You also risk leaking
3423 information about the host to the guest this way.  Instead,
3424 attach a new host device to the guest and swap on that.");
3425
3426   ("swapoff_device", (RErr, [Device "device"]), 171, [],
3427    [], (* XXX tested by swapon_device *)
3428    "disable swap on device",
3429    "\
3430 This command disables the libguestfs appliance swap
3431 device or partition named C<device>.
3432 See C<guestfs_swapon_device>.");
3433
3434   ("swapon_file", (RErr, [Pathname "file"]), 172, [],
3435    [InitBasicFS, Always, TestRun (
3436       [["fallocate"; "/swap"; "8388608"];
3437        ["mkswap_file"; "/swap"];
3438        ["swapon_file"; "/swap"];
3439        ["swapoff_file"; "/swap"]])],
3440    "enable swap on file",
3441    "\
3442 This command enables swap to a file.
3443 See C<guestfs_swapon_device> for other notes.");
3444
3445   ("swapoff_file", (RErr, [Pathname "file"]), 173, [],
3446    [], (* XXX tested by swapon_file *)
3447    "disable swap on file",
3448    "\
3449 This command disables the libguestfs appliance swap on file.");
3450
3451   ("swapon_label", (RErr, [String "label"]), 174, [],
3452    [InitEmpty, Always, TestRun (
3453       [["part_disk"; "/dev/sdb"; "mbr"];
3454        ["mkswap_L"; "swapit"; "/dev/sdb1"];
3455        ["swapon_label"; "swapit"];
3456        ["swapoff_label"; "swapit"];
3457        ["zero"; "/dev/sdb"];
3458        ["blockdev_rereadpt"; "/dev/sdb"]])],
3459    "enable swap on labeled swap partition",
3460    "\
3461 This command enables swap to a labeled swap partition.
3462 See C<guestfs_swapon_device> for other notes.");
3463
3464   ("swapoff_label", (RErr, [String "label"]), 175, [],
3465    [], (* XXX tested by swapon_label *)
3466    "disable swap on labeled swap partition",
3467    "\
3468 This command disables the libguestfs appliance swap on
3469 labeled swap partition.");
3470
3471   ("swapon_uuid", (RErr, [String "uuid"]), 176, [Optional "linuxfsuuid"],
3472    (let uuid = uuidgen () in
3473     [InitEmpty, Always, TestRun (
3474        [["mkswap_U"; uuid; "/dev/sdb"];
3475         ["swapon_uuid"; uuid];
3476         ["swapoff_uuid"; uuid]])]),
3477    "enable swap on swap partition by UUID",
3478    "\
3479 This command enables swap to a swap partition with the given UUID.
3480 See C<guestfs_swapon_device> for other notes.");
3481
3482   ("swapoff_uuid", (RErr, [String "uuid"]), 177, [Optional "linuxfsuuid"],
3483    [], (* XXX tested by swapon_uuid *)
3484    "disable swap on swap partition by UUID",
3485    "\
3486 This command disables the libguestfs appliance swap partition
3487 with the given UUID.");
3488
3489   ("mkswap_file", (RErr, [Pathname "path"]), 178, [],
3490    [InitBasicFS, Always, TestRun (
3491       [["fallocate"; "/swap"; "8388608"];
3492        ["mkswap_file"; "/swap"]])],
3493    "create a swap file",
3494    "\
3495 Create a swap file.
3496
3497 This command just writes a swap file signature to an existing
3498 file.  To create the file itself, use something like C<guestfs_fallocate>.");
3499
3500   ("inotify_init", (RErr, [Int "maxevents"]), 179, [Optional "inotify"],
3501    [InitISOFS, Always, TestRun (
3502       [["inotify_init"; "0"]])],
3503    "create an inotify handle",
3504    "\
3505 This command creates a new inotify handle.
3506 The inotify subsystem can be used to notify events which happen to
3507 objects in the guest filesystem.
3508
3509 C<maxevents> is the maximum number of events which will be
3510 queued up between calls to C<guestfs_inotify_read> or
3511 C<guestfs_inotify_files>.
3512 If this is passed as C<0>, then the kernel (or previously set)
3513 default is used.  For Linux 2.6.29 the default was 16384 events.
3514 Beyond this limit, the kernel throws away events, but records
3515 the fact that it threw them away by setting a flag
3516 C<IN_Q_OVERFLOW> in the returned structure list (see
3517 C<guestfs_inotify_read>).
3518
3519 Before any events are generated, you have to add some
3520 watches to the internal watch list.  See:
3521 C<guestfs_inotify_add_watch>,
3522 C<guestfs_inotify_rm_watch> and
3523 C<guestfs_inotify_watch_all>.
3524
3525 Queued up events should be read periodically by calling
3526 C<guestfs_inotify_read>
3527 (or C<guestfs_inotify_files> which is just a helpful
3528 wrapper around C<guestfs_inotify_read>).  If you don't
3529 read the events out often enough then you risk the internal
3530 queue overflowing.
3531
3532 The handle should be closed after use by calling
3533 C<guestfs_inotify_close>.  This also removes any
3534 watches automatically.
3535
3536 See also L<inotify(7)> for an overview of the inotify interface
3537 as exposed by the Linux kernel, which is roughly what we expose
3538 via libguestfs.  Note that there is one global inotify handle
3539 per libguestfs instance.");
3540
3541   ("inotify_add_watch", (RInt64 "wd", [Pathname "path"; Int "mask"]), 180, [Optional "inotify"],
3542    [InitBasicFS, Always, TestOutputList (
3543       [["inotify_init"; "0"];
3544        ["inotify_add_watch"; "/"; "1073741823"];
3545        ["touch"; "/a"];
3546        ["touch"; "/b"];
3547        ["inotify_files"]], ["a"; "b"])],
3548    "add an inotify watch",
3549    "\
3550 Watch C<path> for the events listed in C<mask>.
3551
3552 Note that if C<path> is a directory then events within that
3553 directory are watched, but this does I<not> happen recursively
3554 (in subdirectories).
3555
3556 Note for non-C or non-Linux callers: the inotify events are
3557 defined by the Linux kernel ABI and are listed in
3558 C</usr/include/sys/inotify.h>.");
3559
3560   ("inotify_rm_watch", (RErr, [Int(*XXX64*) "wd"]), 181, [Optional "inotify"],
3561    [],
3562    "remove an inotify watch",
3563    "\
3564 Remove a previously defined inotify watch.
3565 See C<guestfs_inotify_add_watch>.");
3566
3567   ("inotify_read", (RStructList ("events", "inotify_event"), []), 182, [Optional "inotify"],
3568    [],
3569    "return list of inotify events",
3570    "\
3571 Return the complete queue of events that have happened
3572 since the previous read call.
3573
3574 If no events have happened, this returns an empty list.
3575
3576 I<Note>: In order to make sure that all events have been
3577 read, you must call this function repeatedly until it
3578 returns an empty list.  The reason is that the call will
3579 read events up to the maximum appliance-to-host message
3580 size and leave remaining events in the queue.");
3581
3582   ("inotify_files", (RStringList "paths", []), 183, [Optional "inotify"],
3583    [],
3584    "return list of watched files that had events",
3585    "\
3586 This function is a helpful wrapper around C<guestfs_inotify_read>
3587 which just returns a list of pathnames of objects that were
3588 touched.  The returned pathnames are sorted and deduplicated.");
3589
3590   ("inotify_close", (RErr, []), 184, [Optional "inotify"],
3591    [],
3592    "close the inotify handle",
3593    "\
3594 This closes the inotify handle which was previously
3595 opened by inotify_init.  It removes all watches, throws
3596 away any pending events, and deallocates all resources.");
3597
3598   ("setcon", (RErr, [String "context"]), 185, [Optional "selinux"],
3599    [],
3600    "set SELinux security context",
3601    "\
3602 This sets the SELinux security context of the daemon
3603 to the string C<context>.
3604
3605 See the documentation about SELINUX in L<guestfs(3)>.");
3606
3607   ("getcon", (RString "context", []), 186, [Optional "selinux"],
3608    [],
3609    "get SELinux security context",
3610    "\
3611 This gets the SELinux security context of the daemon.
3612
3613 See the documentation about SELINUX in L<guestfs(3)>,
3614 and C<guestfs_setcon>");
3615
3616   ("mkfs_b", (RErr, [String "fstype"; Int "blocksize"; Device "device"]), 187, [],
3617    [InitEmpty, Always, TestOutput (
3618       [["part_disk"; "/dev/sda"; "mbr"];
3619        ["mkfs_b"; "ext2"; "4096"; "/dev/sda1"];
3620        ["mount_options"; ""; "/dev/sda1"; "/"];
3621        ["write_file"; "/new"; "new file contents"; "0"];
3622        ["cat"; "/new"]], "new file contents")],
3623    "make a filesystem with block size",
3624    "\
3625 This call is similar to C<guestfs_mkfs>, but it allows you to
3626 control the block size of the resulting filesystem.  Supported
3627 block sizes depend on the filesystem type, but typically they
3628 are C<1024>, C<2048> or C<4096> only.");
3629
3630   ("mke2journal", (RErr, [Int "blocksize"; Device "device"]), 188, [],
3631    [InitEmpty, Always, TestOutput (
3632       [["sfdiskM"; "/dev/sda"; ",100 ,"];
3633        ["mke2journal"; "4096"; "/dev/sda1"];
3634        ["mke2fs_J"; "ext2"; "4096"; "/dev/sda2"; "/dev/sda1"];
3635        ["mount_options"; ""; "/dev/sda2"; "/"];
3636        ["write_file"; "/new"; "new file contents"; "0"];
3637        ["cat"; "/new"]], "new file contents")],
3638    "make ext2/3/4 external journal",
3639    "\
3640 This creates an ext2 external journal on C<device>.  It is equivalent
3641 to the command:
3642
3643  mke2fs -O journal_dev -b blocksize device");
3644
3645   ("mke2journal_L", (RErr, [Int "blocksize"; String "label"; Device "device"]), 189, [],
3646    [InitEmpty, Always, TestOutput (
3647       [["sfdiskM"; "/dev/sda"; ",100 ,"];
3648        ["mke2journal_L"; "4096"; "JOURNAL"; "/dev/sda1"];
3649        ["mke2fs_JL"; "ext2"; "4096"; "/dev/sda2"; "JOURNAL"];
3650        ["mount_options"; ""; "/dev/sda2"; "/"];
3651        ["write_file"; "/new"; "new file contents"; "0"];
3652        ["cat"; "/new"]], "new file contents")],
3653    "make ext2/3/4 external journal with label",
3654    "\
3655 This creates an ext2 external journal on C<device> with label C<label>.");
3656
3657   ("mke2journal_U", (RErr, [Int "blocksize"; String "uuid"; Device "device"]), 190, [Optional "linuxfsuuid"],
3658    (let uuid = uuidgen () in
3659     [InitEmpty, Always, TestOutput (
3660        [["sfdiskM"; "/dev/sda"; ",100 ,"];
3661         ["mke2journal_U"; "4096"; uuid; "/dev/sda1"];
3662         ["mke2fs_JU"; "ext2"; "4096"; "/dev/sda2"; uuid];
3663         ["mount_options"; ""; "/dev/sda2"; "/"];
3664         ["write_file"; "/new"; "new file contents"; "0"];
3665         ["cat"; "/new"]], "new file contents")]),
3666    "make ext2/3/4 external journal with UUID",
3667    "\
3668 This creates an ext2 external journal on C<device> with UUID C<uuid>.");
3669
3670   ("mke2fs_J", (RErr, [String "fstype"; Int "blocksize"; Device "device"; Device "journal"]), 191, [],
3671    [],
3672    "make ext2/3/4 filesystem with external journal",
3673    "\
3674 This creates an ext2/3/4 filesystem on C<device> with
3675 an external journal on C<journal>.  It is equivalent
3676 to the command:
3677
3678  mke2fs -t fstype -b blocksize -J device=<journal> <device>
3679
3680 See also C<guestfs_mke2journal>.");
3681
3682   ("mke2fs_JL", (RErr, [String "fstype"; Int "blocksize"; Device "device"; String "label"]), 192, [],
3683    [],
3684    "make ext2/3/4 filesystem with external journal",
3685    "\
3686 This creates an ext2/3/4 filesystem on C<device> with
3687 an external journal on the journal labeled C<label>.
3688
3689 See also C<guestfs_mke2journal_L>.");
3690
3691   ("mke2fs_JU", (RErr, [String "fstype"; Int "blocksize"; Device "device"; String "uuid"]), 193, [Optional "linuxfsuuid"],
3692    [],
3693    "make ext2/3/4 filesystem with external journal",
3694    "\
3695 This creates an ext2/3/4 filesystem on C<device> with
3696 an external journal on the journal with UUID C<uuid>.
3697
3698 See also C<guestfs_mke2journal_U>.");
3699
3700   ("modprobe", (RErr, [String "modulename"]), 194, [Optional "linuxmodules"],
3701    [InitNone, Always, TestRun [["modprobe"; "fat"]]],
3702    "load a kernel module",
3703    "\
3704 This loads a kernel module in the appliance.
3705
3706 The kernel module must have been whitelisted when libguestfs
3707 was built (see C<appliance/kmod.whitelist.in> in the source).");
3708
3709   ("echo_daemon", (RString "output", [StringList "words"]), 195, [],
3710    [InitNone, Always, TestOutput (
3711       [["echo_daemon"; "This is a test"]], "This is a test"
3712     )],
3713    "echo arguments back to the client",
3714    "\
3715 This command concatenate the list of C<words> passed with single spaces between
3716 them and returns the resulting string.
3717
3718 You can use this command to test the connection through to the daemon.
3719
3720 See also C<guestfs_ping_daemon>.");
3721
3722   ("find0", (RErr, [Pathname "directory"; FileOut "files"]), 196, [],
3723    [], (* There is a regression test for this. *)
3724    "find all files and directories, returning NUL-separated list",
3725    "\
3726 This command lists out all files and directories, recursively,
3727 starting at C<directory>, placing the resulting list in the
3728 external file called C<files>.
3729
3730 This command works the same way as C<guestfs_find> with the
3731 following exceptions:
3732
3733 =over 4
3734
3735 =item *
3736
3737 The resulting list is written to an external file.
3738
3739 =item *
3740
3741 Items (filenames) in the result are separated
3742 by C<\\0> characters.  See L<find(1)> option I<-print0>.
3743
3744 =item *
3745
3746 This command is not limited in the number of names that it
3747 can return.
3748
3749 =item *
3750
3751 The result list is not sorted.
3752
3753 =back");
3754
3755   ("case_sensitive_path", (RString "rpath", [Pathname "path"]), 197, [],
3756    [InitISOFS, Always, TestOutput (
3757       [["case_sensitive_path"; "/DIRECTORY"]], "/directory");
3758     InitISOFS, Always, TestOutput (
3759       [["case_sensitive_path"; "/DIRECTORY/"]], "/directory");
3760     InitISOFS, Always, TestOutput (
3761       [["case_sensitive_path"; "/Known-1"]], "/known-1");
3762     InitISOFS, Always, TestLastFail (
3763       [["case_sensitive_path"; "/Known-1/"]]);
3764     InitBasicFS, Always, TestOutput (
3765       [["mkdir"; "/a"];
3766        ["mkdir"; "/a/bbb"];
3767        ["touch"; "/a/bbb/c"];
3768        ["case_sensitive_path"; "/A/bbB/C"]], "/a/bbb/c");
3769     InitBasicFS, Always, TestOutput (
3770       [["mkdir"; "/a"];
3771        ["mkdir"; "/a/bbb"];
3772        ["touch"; "/a/bbb/c"];
3773        ["case_sensitive_path"; "/A////bbB/C"]], "/a/bbb/c");
3774     InitBasicFS, Always, TestLastFail (
3775       [["mkdir"; "/a"];
3776        ["mkdir"; "/a/bbb"];
3777        ["touch"; "/a/bbb/c"];
3778        ["case_sensitive_path"; "/A/bbb/../bbb/C"]])],
3779    "return true path on case-insensitive filesystem",
3780    "\
3781 This can be used to resolve case insensitive paths on
3782 a filesystem which is case sensitive.  The use case is
3783 to resolve paths which you have read from Windows configuration
3784 files or the Windows Registry, to the true path.
3785
3786 The command handles a peculiarity of the Linux ntfs-3g
3787 filesystem driver (and probably others), which is that although
3788 the underlying filesystem is case-insensitive, the driver
3789 exports the filesystem to Linux as case-sensitive.
3790
3791 One consequence of this is that special directories such
3792 as C<c:\\windows> may appear as C</WINDOWS> or C</windows>
3793 (or other things) depending on the precise details of how
3794 they were created.  In Windows itself this would not be
3795 a problem.
3796
3797 Bug or feature?  You decide:
3798 L<http://www.tuxera.com/community/ntfs-3g-faq/#posixfilenames1>
3799
3800 This function resolves the true case of each element in the
3801 path and returns the case-sensitive path.
3802
3803 Thus C<guestfs_case_sensitive_path> (\"/Windows/System32\")
3804 might return C<\"/WINDOWS/system32\"> (the exact return value
3805 would depend on details of how the directories were originally
3806 created under Windows).
3807
3808 I<Note>:
3809 This function does not handle drive names, backslashes etc.
3810
3811 See also C<guestfs_realpath>.");
3812
3813   ("vfs_type", (RString "fstype", [Device "device"]), 198, [],
3814    [InitBasicFS, Always, TestOutput (
3815       [["vfs_type"; "/dev/sda1"]], "ext2")],
3816    "get the Linux VFS type corresponding to a mounted device",
3817    "\
3818 This command gets the block device type corresponding to
3819 a mounted device called C<device>.
3820
3821 Usually the result is the name of the Linux VFS module that
3822 is used to mount this device (probably determined automatically
3823 if you used the C<guestfs_mount> call).");
3824
3825   ("truncate", (RErr, [Pathname "path"]), 199, [],
3826    [InitBasicFS, Always, TestOutputStruct (
3827       [["write_file"; "/test"; "some stuff so size is not zero"; "0"];
3828        ["truncate"; "/test"];
3829        ["stat"; "/test"]], [CompareWithInt ("size", 0)])],
3830    "truncate a file to zero size",
3831    "\
3832 This command truncates C<path> to a zero-length file.  The
3833 file must exist already.");
3834
3835   ("truncate_size", (RErr, [Pathname "path"; Int64 "size"]), 200, [],
3836    [InitBasicFS, Always, TestOutputStruct (
3837       [["touch"; "/test"];
3838        ["truncate_size"; "/test"; "1000"];
3839        ["stat"; "/test"]], [CompareWithInt ("size", 1000)])],
3840    "truncate a file to a particular size",
3841    "\
3842 This command truncates C<path> to size C<size> bytes.  The file
3843 must exist already.  If the file is smaller than C<size> then
3844 the file is extended to the required size with null bytes.");
3845
3846   ("utimens", (RErr, [Pathname "path"; Int64 "atsecs"; Int64 "atnsecs"; Int64 "mtsecs"; Int64 "mtnsecs"]), 201, [],
3847    [InitBasicFS, Always, TestOutputStruct (
3848       [["touch"; "/test"];
3849        ["utimens"; "/test"; "12345"; "67890"; "9876"; "5432"];
3850        ["stat"; "/test"]], [CompareWithInt ("mtime", 9876)])],
3851    "set timestamp of a file with nanosecond precision",
3852    "\
3853 This command sets the timestamps of a file with nanosecond
3854 precision.
3855
3856 C<atsecs, atnsecs> are the last access time (atime) in secs and
3857 nanoseconds from the epoch.
3858
3859 C<mtsecs, mtnsecs> are the last modification time (mtime) in
3860 secs and nanoseconds from the epoch.
3861
3862 If the C<*nsecs> field contains the special value C<-1> then
3863 the corresponding timestamp is set to the current time.  (The
3864 C<*secs> field is ignored in this case).
3865
3866 If the C<*nsecs> field contains the special value C<-2> then
3867 the corresponding timestamp is left unchanged.  (The
3868 C<*secs> field is ignored in this case).");
3869
3870   ("mkdir_mode", (RErr, [Pathname "path"; Int "mode"]), 202, [],
3871    [InitBasicFS, Always, TestOutputStruct (
3872       [["mkdir_mode"; "/test"; "0o111"];
3873        ["stat"; "/test"]], [CompareWithInt ("mode", 0o40111)])],
3874    "create a directory with a particular mode",
3875    "\
3876 This command creates a directory, setting the initial permissions
3877 of the directory to C<mode>.  See also C<guestfs_mkdir>.");
3878
3879   ("lchown", (RErr, [Int "owner"; Int "group"; Pathname "path"]), 203, [],
3880    [], (* XXX *)
3881    "change file owner and group",
3882    "\
3883 Change the file owner to C<owner> and group to C<group>.
3884 This is like C<guestfs_chown> but if C<path> is a symlink then
3885 the link itself is changed, not the target.
3886
3887 Only numeric uid and gid are supported.  If you want to use
3888 names, you will need to locate and parse the password file
3889 yourself (Augeas support makes this relatively easy).");
3890
3891   ("lstatlist", (RStructList ("statbufs", "stat"), [Pathname "path"; StringList "names"]), 204, [],
3892    [], (* XXX *)
3893    "lstat on multiple files",
3894    "\
3895 This call allows you to perform the C<guestfs_lstat> operation
3896 on multiple files, where all files are in the directory C<path>.
3897 C<names> is the list of files from this directory.
3898
3899 On return you get a list of stat structs, with a one-to-one
3900 correspondence to the C<names> list.  If any name did not exist
3901 or could not be lstat'd, then the C<ino> field of that structure
3902 is set to C<-1>.
3903
3904 This call is intended for programs that want to efficiently
3905 list a directory contents without making many round-trips.
3906 See also C<guestfs_lxattrlist> for a similarly efficient call
3907 for getting extended attributes.  Very long directory listings
3908 might cause the protocol message size to be exceeded, causing
3909 this call to fail.  The caller must split up such requests
3910 into smaller groups of names.");
3911
3912   ("lxattrlist", (RStructList ("xattrs", "xattr"), [Pathname "path"; StringList "names"]), 205, [Optional "linuxxattrs"],
3913    [], (* XXX *)
3914    "lgetxattr on multiple files",
3915    "\
3916 This call allows you to get the extended attributes
3917 of multiple files, where all files are in the directory C<path>.
3918 C<names> is the list of files from this directory.
3919
3920 On return you get a flat list of xattr structs which must be
3921 interpreted sequentially.  The first xattr struct always has a zero-length
3922 C<attrname>.  C<attrval> in this struct is zero-length
3923 to indicate there was an error doing C<lgetxattr> for this
3924 file, I<or> is a C string which is a decimal number
3925 (the number of following attributes for this file, which could
3926 be C<\"0\">).  Then after the first xattr struct are the
3927 zero or more attributes for the first named file.
3928 This repeats for the second and subsequent files.
3929
3930 This call is intended for programs that want to efficiently
3931 list a directory contents without making many round-trips.
3932 See also C<guestfs_lstatlist> for a similarly efficient call
3933 for getting standard stats.  Very long directory listings
3934 might cause the protocol message size to be exceeded, causing
3935 this call to fail.  The caller must split up such requests
3936 into smaller groups of names.");
3937
3938   ("readlinklist", (RStringList "links", [Pathname "path"; StringList "names"]), 206, [],
3939    [], (* XXX *)
3940    "readlink on multiple files",
3941    "\
3942 This call allows you to do a C<readlink> operation
3943 on multiple files, where all files are in the directory C<path>.
3944 C<names> is the list of files from this directory.
3945
3946 On return you get a list of strings, with a one-to-one
3947 correspondence to the C<names> list.  Each string is the
3948 value of the symbol link.
3949
3950 If the C<readlink(2)> operation fails on any name, then
3951 the corresponding result string is the empty string C<\"\">.
3952 However the whole operation is completed even if there
3953 were C<readlink(2)> errors, and so you can call this
3954 function with names where you don't know if they are
3955 symbolic links already (albeit slightly less efficient).
3956
3957 This call is intended for programs that want to efficiently
3958 list a directory contents without making many round-trips.
3959 Very long directory listings might cause the protocol
3960 message size to be exceeded, causing
3961 this call to fail.  The caller must split up such requests
3962 into smaller groups of names.");
3963
3964   ("pread", (RBufferOut "content", [Pathname "path"; Int "count"; Int64 "offset"]), 207, [ProtocolLimitWarning],
3965    [InitISOFS, Always, TestOutputBuffer (
3966       [["pread"; "/known-4"; "1"; "3"]], "\n");
3967     InitISOFS, Always, TestOutputBuffer (
3968       [["pread"; "/empty"; "0"; "100"]], "")],
3969    "read part of a file",
3970    "\
3971 This command lets you read part of a file.  It reads C<count>
3972 bytes of the file, starting at C<offset>, from file C<path>.
3973
3974 This may read fewer bytes than requested.  For further details
3975 see the L<pread(2)> system call.");
3976
3977   ("part_init", (RErr, [Device "device"; String "parttype"]), 208, [],
3978    [InitEmpty, Always, TestRun (
3979       [["part_init"; "/dev/sda"; "gpt"]])],
3980    "create an empty partition table",
3981    "\
3982 This creates an empty partition table on C<device> of one of the
3983 partition types listed below.  Usually C<parttype> should be
3984 either C<msdos> or C<gpt> (for large disks).
3985
3986 Initially there are no partitions.  Following this, you should
3987 call C<guestfs_part_add> for each partition required.
3988
3989 Possible values for C<parttype> are:
3990
3991 =over 4
3992
3993 =item B<efi> | B<gpt>
3994
3995 Intel EFI / GPT partition table.
3996
3997 This is recommended for >= 2 TB partitions that will be accessed
3998 from Linux and Intel-based Mac OS X.  It also has limited backwards
3999 compatibility with the C<mbr> format.
4000
4001 =item B<mbr> | B<msdos>
4002
4003 The standard PC \"Master Boot Record\" (MBR) format used
4004 by MS-DOS and Windows.  This partition type will B<only> work
4005 for device sizes up to 2 TB.  For large disks we recommend
4006 using C<gpt>.
4007
4008 =back
4009
4010 Other partition table types that may work but are not
4011 supported include:
4012
4013 =over 4
4014
4015 =item B<aix>
4016
4017 AIX disk labels.
4018
4019 =item B<amiga> | B<rdb>
4020
4021 Amiga \"Rigid Disk Block\" format.
4022
4023 =item B<bsd>
4024
4025 BSD disk labels.
4026
4027 =item B<dasd>
4028
4029 DASD, used on IBM mainframes.
4030
4031 =item B<dvh>
4032
4033 MIPS/SGI volumes.
4034
4035 =item B<mac>
4036
4037 Old Mac partition format.  Modern Macs use C<gpt>.
4038
4039 =item B<pc98>
4040
4041 NEC PC-98 format, common in Japan apparently.
4042
4043 =item B<sun>
4044
4045 Sun disk labels.
4046
4047 =back");
4048
4049   ("part_add", (RErr, [Device "device"; String "prlogex"; Int64 "startsect"; Int64 "endsect"]), 209, [],
4050    [InitEmpty, Always, TestRun (
4051       [["part_init"; "/dev/sda"; "mbr"];
4052        ["part_add"; "/dev/sda"; "primary"; "1"; "-1"]]);
4053     InitEmpty, Always, TestRun (
4054       [["part_init"; "/dev/sda"; "gpt"];
4055        ["part_add"; "/dev/sda"; "primary"; "34"; "127"];
4056        ["part_add"; "/dev/sda"; "primary"; "128"; "-34"]]);
4057     InitEmpty, Always, TestRun (
4058       [["part_init"; "/dev/sda"; "mbr"];
4059        ["part_add"; "/dev/sda"; "primary"; "32"; "127"];
4060        ["part_add"; "/dev/sda"; "primary"; "128"; "255"];
4061        ["part_add"; "/dev/sda"; "primary"; "256"; "511"];
4062        ["part_add"; "/dev/sda"; "primary"; "512"; "-1"]])],
4063    "add a partition to the device",
4064    "\
4065 This command adds a partition to C<device>.  If there is no partition
4066 table on the device, call C<guestfs_part_init> first.
4067
4068 The C<prlogex> parameter is the type of partition.  Normally you
4069 should pass C<p> or C<primary> here, but MBR partition tables also
4070 support C<l> (or C<logical>) and C<e> (or C<extended>) partition
4071 types.
4072
4073 C<startsect> and C<endsect> are the start and end of the partition
4074 in I<sectors>.  C<endsect> may be negative, which means it counts
4075 backwards from the end of the disk (C<-1> is the last sector).
4076
4077 Creating a partition which covers the whole disk is not so easy.
4078 Use C<guestfs_part_disk> to do that.");
4079
4080   ("part_disk", (RErr, [Device "device"; String "parttype"]), 210, [DangerWillRobinson],
4081    [InitEmpty, Always, TestRun (
4082       [["part_disk"; "/dev/sda"; "mbr"]]);
4083     InitEmpty, Always, TestRun (
4084       [["part_disk"; "/dev/sda"; "gpt"]])],
4085    "partition whole disk with a single primary partition",
4086    "\
4087 This command is simply a combination of C<guestfs_part_init>
4088 followed by C<guestfs_part_add> to create a single primary partition
4089 covering the whole disk.
4090
4091 C<parttype> is the partition table type, usually C<mbr> or C<gpt>,
4092 but other possible values are described in C<guestfs_part_init>.");
4093
4094   ("part_set_bootable", (RErr, [Device "device"; Int "partnum"; Bool "bootable"]), 211, [],
4095    [InitEmpty, Always, TestRun (
4096       [["part_disk"; "/dev/sda"; "mbr"];
4097        ["part_set_bootable"; "/dev/sda"; "1"; "true"]])],
4098    "make a partition bootable",
4099    "\
4100 This sets the bootable flag on partition numbered C<partnum> on
4101 device C<device>.  Note that partitions are numbered from 1.
4102
4103 The bootable flag is used by some operating systems (notably
4104 Windows) to determine which partition to boot from.  It is by
4105 no means universally recognized.");
4106
4107   ("part_set_name", (RErr, [Device "device"; Int "partnum"; String "name"]), 212, [],
4108    [InitEmpty, Always, TestRun (
4109       [["part_disk"; "/dev/sda"; "gpt"];
4110        ["part_set_name"; "/dev/sda"; "1"; "thepartname"]])],
4111    "set partition name",
4112    "\
4113 This sets the partition name on partition numbered C<partnum> on
4114 device C<device>.  Note that partitions are numbered from 1.
4115
4116 The partition name can only be set on certain types of partition
4117 table.  This works on C<gpt> but not on C<mbr> partitions.");
4118
4119   ("part_list", (RStructList ("partitions", "partition"), [Device "device"]), 213, [],
4120    [], (* XXX Add a regression test for this. *)
4121    "list partitions on a device",
4122    "\
4123 This command parses the partition table on C<device> and
4124 returns the list of partitions found.
4125
4126 The fields in the returned structure are:
4127
4128 =over 4
4129
4130 =item B<part_num>
4131
4132 Partition number, counting from 1.
4133
4134 =item B<part_start>
4135
4136 Start of the partition I<in bytes>.  To get sectors you have to
4137 divide by the device's sector size, see C<guestfs_blockdev_getss>.
4138
4139 =item B<part_end>
4140
4141 End of the partition in bytes.
4142
4143 =item B<part_size>
4144
4145 Size of the partition in bytes.
4146
4147 =back");
4148
4149   ("part_get_parttype", (RString "parttype", [Device "device"]), 214, [],
4150    [InitEmpty, Always, TestOutput (
4151       [["part_disk"; "/dev/sda"; "gpt"];
4152        ["part_get_parttype"; "/dev/sda"]], "gpt")],
4153    "get the partition table type",
4154    "\
4155 This command examines the partition table on C<device> and
4156 returns the partition table type (format) being used.
4157
4158 Common return values include: C<msdos> (a DOS/Windows style MBR
4159 partition table), C<gpt> (a GPT/EFI-style partition table).  Other
4160 values are possible, although unusual.  See C<guestfs_part_init>
4161 for a full list.");
4162
4163   ("fill", (RErr, [Int "c"; Int "len"; Pathname "path"]), 215, [],
4164    [InitBasicFS, Always, TestOutputBuffer (
4165       [["fill"; "0x63"; "10"; "/test"];
4166        ["read_file"; "/test"]], "cccccccccc")],
4167    "fill a file with octets",
4168    "\
4169 This command creates a new file called C<path>.  The initial
4170 content of the file is C<len> octets of C<c>, where C<c>
4171 must be a number in the range C<[0..255]>.
4172
4173 To fill a file with zero bytes (sparsely), it is
4174 much more efficient to use C<guestfs_truncate_size>.");
4175
4176   ("available", (RErr, [StringList "groups"]), 216, [],
4177    [InitNone, Always, TestRun [["available"; ""]]],
4178    "test availability of some parts of the API",
4179    "\
4180 This command is used to check the availability of some
4181 groups of functionality in the appliance, which not all builds of
4182 the libguestfs appliance will be able to provide.
4183
4184 The libguestfs groups, and the functions that those
4185 groups correspond to, are listed in L<guestfs(3)/AVAILABILITY>.
4186
4187 The argument C<groups> is a list of group names, eg:
4188 C<[\"inotify\", \"augeas\"]> would check for the availability of
4189 the Linux inotify functions and Augeas (configuration file
4190 editing) functions.
4191
4192 The command returns no error if I<all> requested groups are available.
4193
4194 It fails with an error if one or more of the requested
4195 groups is unavailable in the appliance.
4196
4197 If an unknown group name is included in the
4198 list of groups then an error is always returned.
4199
4200 I<Notes:>
4201
4202 =over 4
4203
4204 =item *
4205
4206 You must call C<guestfs_launch> before calling this function.
4207
4208 The reason is because we don't know what groups are
4209 supported by the appliance/daemon until it is running and can
4210 be queried.
4211
4212 =item *
4213
4214 If a group of functions is available, this does not necessarily
4215 mean that they will work.  You still have to check for errors
4216 when calling individual API functions even if they are
4217 available.
4218
4219 =item *
4220
4221 It is usually the job of distro packagers to build
4222 complete functionality into the libguestfs appliance.
4223 Upstream libguestfs, if built from source with all
4224 requirements satisfied, will support everything.
4225
4226 =item *
4227
4228 This call was added in version C<1.0.80>.  In previous
4229 versions of libguestfs all you could do would be to speculatively
4230 execute a command to find out if the daemon implemented it.
4231 See also C<guestfs_version>.
4232
4233 =back");
4234
4235   ("dd", (RErr, [Dev_or_Path "src"; Dev_or_Path "dest"]), 217, [],
4236    [InitBasicFS, Always, TestOutputBuffer (
4237       [["write_file"; "/src"; "hello, world"; "0"];
4238        ["dd"; "/src"; "/dest"];
4239        ["read_file"; "/dest"]], "hello, world")],
4240    "copy from source to destination using dd",
4241    "\
4242 This command copies from one source device or file C<src>
4243 to another destination device or file C<dest>.  Normally you
4244 would use this to copy to or from a device or partition, for
4245 example to duplicate a filesystem.
4246
4247 If the destination is a device, it must be as large or larger
4248 than the source file or device, otherwise the copy will fail.
4249 This command cannot do partial copies (see C<guestfs_copy_size>).");
4250
4251   ("filesize", (RInt64 "size", [Pathname "file"]), 218, [],
4252    [InitBasicFS, Always, TestOutputInt (
4253       [["write_file"; "/file"; "hello, world"; "0"];
4254        ["filesize"; "/file"]], 12)],
4255    "return the size of the file in bytes",
4256    "\
4257 This command returns the size of C<file> in bytes.
4258
4259 To get other stats about a file, use C<guestfs_stat>, C<guestfs_lstat>,
4260 C<guestfs_is_dir>, C<guestfs_is_file> etc.
4261 To get the size of block devices, use C<guestfs_blockdev_getsize64>.");
4262
4263   ("lvrename", (RErr, [String "logvol"; String "newlogvol"]), 219, [],
4264    [InitBasicFSonLVM, Always, TestOutputList (
4265       [["lvrename"; "/dev/VG/LV"; "/dev/VG/LV2"];
4266        ["lvs"]], ["/dev/VG/LV2"])],
4267    "rename an LVM logical volume",
4268    "\
4269 Rename a logical volume C<logvol> with the new name C<newlogvol>.");
4270
4271   ("vgrename", (RErr, [String "volgroup"; String "newvolgroup"]), 220, [],
4272    [InitBasicFSonLVM, Always, TestOutputList (
4273       [["umount"; "/"];
4274        ["vg_activate"; "false"; "VG"];
4275        ["vgrename"; "VG"; "VG2"];
4276        ["vg_activate"; "true"; "VG2"];
4277        ["mount_options"; ""; "/dev/VG2/LV"; "/"];
4278        ["vgs"]], ["VG2"])],
4279    "rename an LVM volume group",
4280    "\
4281 Rename a volume group C<volgroup> with the new name C<newvolgroup>.");
4282
4283   ("initrd_cat", (RBufferOut "content", [Pathname "initrdpath"; String "filename"]), 221, [ProtocolLimitWarning],
4284    [InitISOFS, Always, TestOutputBuffer (
4285       [["initrd_cat"; "/initrd"; "known-4"]], "abc\ndef\nghi")],
4286    "list the contents of a single file in an initrd",
4287    "\
4288 This command unpacks the file C<filename> from the initrd file
4289 called C<initrdpath>.  The filename must be given I<without> the
4290 initial C</> character.
4291
4292 For example, in guestfish you could use the following command
4293 to examine the boot script (usually called C</init>)
4294 contained in a Linux initrd or initramfs image:
4295
4296  initrd-cat /boot/initrd-<version>.img init
4297
4298 See also C<guestfs_initrd_list>.");
4299
4300   ("pvuuid", (RString "uuid", [Device "device"]), 222, [],
4301    [],
4302    "get the UUID of a physical volume",
4303    "\
4304 This command returns the UUID of the LVM PV C<device>.");
4305
4306   ("vguuid", (RString "uuid", [String "vgname"]), 223, [],
4307    [],
4308    "get the UUID of a volume group",
4309    "\
4310 This command returns the UUID of the LVM VG named C<vgname>.");
4311
4312   ("lvuuid", (RString "uuid", [Device "device"]), 224, [],
4313    [],
4314    "get the UUID of a logical volume",
4315    "\
4316 This command returns the UUID of the LVM LV C<device>.");
4317
4318   ("vgpvuuids", (RStringList "uuids", [String "vgname"]), 225, [],
4319    [],
4320    "get the PV UUIDs containing the volume group",
4321    "\
4322 Given a VG called C<vgname>, this returns the UUIDs of all
4323 the physical volumes that this volume group resides on.
4324
4325 You can use this along with C<guestfs_pvs> and C<guestfs_pvuuid>
4326 calls to associate physical volumes and volume groups.
4327
4328 See also C<guestfs_vglvuuids>.");
4329
4330   ("vglvuuids", (RStringList "uuids", [String "vgname"]), 226, [],
4331    [],
4332    "get the LV UUIDs of all LVs in the volume group",
4333    "\
4334 Given a VG called C<vgname>, this returns the UUIDs of all
4335 the logical volumes created in this volume group.
4336
4337 You can use this along with C<guestfs_lvs> and C<guestfs_lvuuid>
4338 calls to associate logical volumes and volume groups.
4339
4340 See also C<guestfs_vgpvuuids>.");
4341
4342   ("copy_size", (RErr, [Dev_or_Path "src"; Dev_or_Path "dest"; Int64 "size"]), 227, [],
4343    [InitBasicFS, Always, TestOutputBuffer (
4344       [["write_file"; "/src"; "hello, world"; "0"];
4345        ["copy_size"; "/src"; "/dest"; "5"];
4346        ["read_file"; "/dest"]], "hello")],
4347    "copy size bytes from source to destination using dd",
4348    "\
4349 This command copies exactly C<size> bytes from one source device
4350 or file C<src> to another destination device or file C<dest>.
4351
4352 Note this will fail if the source is too short or if the destination
4353 is not large enough.");
4354
4355   ("zero_device", (RErr, [Device "device"]), 228, [DangerWillRobinson],
4356    [InitBasicFSonLVM, Always, TestRun (
4357       [["zero_device"; "/dev/VG/LV"]])],
4358    "write zeroes to an entire device",
4359    "\
4360 This command writes zeroes over the entire C<device>.  Compare
4361 with C<guestfs_zero> which just zeroes the first few blocks of
4362 a device.");
4363
4364   ("txz_in", (RErr, [FileIn "tarball"; String "directory"]), 229, [],
4365    [InitBasicFS, Always, TestOutput (
4366       [["txz_in"; "../images/helloworld.tar.xz"; "/"];
4367        ["cat"; "/hello"]], "hello\n")],
4368    "unpack compressed tarball to directory",
4369    "\
4370 This command uploads and unpacks local file C<tarball> (an
4371 I<xz compressed> tar file) into C<directory>.");
4372
4373   ("txz_out", (RErr, [Pathname "directory"; FileOut "tarball"]), 230, [],
4374    [],
4375    "pack directory into compressed tarball",
4376    "\
4377 This command packs the contents of C<directory> and downloads
4378 it to local file C<tarball> (as an xz compressed tar archive).");
4379
4380   ("ntfsresize", (RErr, [Device "device"]), 231, [Optional "ntfsprogs"],
4381    [],
4382    "resize an NTFS filesystem",
4383    "\
4384 This command resizes an NTFS filesystem, expanding or
4385 shrinking it to the size of the underlying device.
4386 See also L<ntfsresize(8)>.");
4387
4388   ("vgscan", (RErr, []), 232, [],
4389    [InitEmpty, Always, TestRun (
4390       [["vgscan"]])],
4391    "rescan for LVM physical volumes, volume groups and logical volumes",
4392    "\
4393 This rescans all block devices and rebuilds the list of LVM
4394 physical volumes, volume groups and logical volumes.");
4395
4396   ("part_del", (RErr, [Device "device"; Int "partnum"]), 233, [],
4397    [InitEmpty, Always, TestRun (
4398       [["part_init"; "/dev/sda"; "mbr"];
4399        ["part_add"; "/dev/sda"; "primary"; "1"; "-1"];
4400        ["part_del"; "/dev/sda"; "1"]])],
4401    "delete a partition",