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