Add DeprecatedBy flag to mark functions which are deprecated.
[libguestfs.git] / src / generator.ml
1 #!/usr/bin/env ocaml
2 (* libguestfs
3  * Copyright (C) 2009 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 below), and
25  * daemon/<somefile>.c to write the implementation.
26  *
27  * After editing this file, run it (./src/generator.ml) to regenerate all the
28  * output files.  Note that if you are using a separate build directory you
29  * must run generator.ml from the _source_ directory.
30  *
31  * IMPORTANT: This script should NOT print any warnings.  If it prints
32  * warnings, you should treat them as errors.
33  * [Need to add -warn-error to ocaml command line]
34  *)
35
36 #load "unix.cma";;
37 #load "str.cma";;
38
39 open Printf
40
41 type style = ret * args
42 and ret =
43     (* "RErr" as a return value means an int used as a simple error
44      * indication, ie. 0 or -1.
45      *)
46   | RErr
47
48     (* "RInt" as a return value means an int which is -1 for error
49      * or any value >= 0 on success.  Only use this for smallish
50      * positive ints (0 <= i < 2^30).
51      *)
52   | RInt of string
53
54     (* "RInt64" is the same as RInt, but is guaranteed to be able
55      * to return a full 64 bit value, _except_ that -1 means error
56      * (so -1 cannot be a valid, non-error return value).
57      *)
58   | RInt64 of string
59
60     (* "RBool" is a bool return value which can be true/false or
61      * -1 for error.
62      *)
63   | RBool of string
64
65     (* "RConstString" is a string that refers to a constant value.
66      * The return value must NOT be NULL (since NULL indicates
67      * an error).
68      *
69      * Try to avoid using this.  In particular you cannot use this
70      * for values returned from the daemon, because there is no
71      * thread-safe way to return them in the C API.
72      *)
73   | RConstString of string
74
75     (* "RConstOptString" is an even more broken version of
76      * "RConstString".  The returned string may be NULL and there
77      * is no way to return an error indication.  Avoid using this!
78      *)
79   | RConstOptString of string
80
81     (* "RString" is a returned string.  It must NOT be NULL, since
82      * a NULL return indicates an error.  The caller frees this.
83      *)
84   | RString of string
85
86     (* "RStringList" is a list of strings.  No string in the list
87      * can be NULL.  The caller frees the strings and the array.
88      *)
89   | RStringList of string
90
91     (* "RStruct" is a function which returns a single named structure
92      * or an error indication (in C, a struct, and in other languages
93      * with varying representations, but usually very efficient).  See
94      * after the function list below for the structures. 
95      *)
96   | RStruct of string * string          (* name of retval, name of struct *)
97
98     (* "RStructList" is a function which returns either a list/array
99      * of structures (could be zero-length), or an error indication.
100      *)
101   | RStructList of string * string      (* name of retval, name of struct *)
102
103     (* Key-value pairs of untyped strings.  Turns into a hashtable or
104      * dictionary in languages which support it.  DON'T use this as a
105      * general "bucket" for results.  Prefer a stronger typed return
106      * value if one is available, or write a custom struct.  Don't use
107      * this if the list could potentially be very long, since it is
108      * inefficient.  Keys should be unique.  NULLs are not permitted.
109      *)
110   | RHashtable of string
111
112     (* "RBufferOut" is handled almost exactly like RString, but
113      * it allows the string to contain arbitrary 8 bit data including
114      * ASCII NUL.  In the C API this causes an implicit extra parameter
115      * to be added of type <size_t *size_r>.  The extra parameter
116      * returns the actual size of the return buffer in bytes.
117      *
118      * Other programming languages support strings with arbitrary 8 bit
119      * data.
120      *
121      * At the RPC layer we have to use the opaque<> type instead of
122      * string<>.  Returned data is still limited to the max message
123      * size (ie. ~ 2 MB).
124      *)
125   | RBufferOut of string
126
127 and args = argt list    (* Function parameters, guestfs handle is implicit. *)
128
129     (* Note in future we should allow a "variable args" parameter as
130      * the final parameter, to allow commands like
131      *   chmod mode file [file(s)...]
132      * This is not implemented yet, but many commands (such as chmod)
133      * are currently defined with the argument order keeping this future
134      * possibility in mind.
135      *)
136 and argt =
137   | String of string    (* const char *name, cannot be NULL *)
138   | OptString of string (* const char *name, may be NULL *)
139   | StringList of string(* list of strings (each string cannot be NULL) *)
140   | Bool of string      (* boolean *)
141   | Int of string       (* int (smallish ints, signed, <= 31 bits) *)
142     (* These are treated as filenames (simple string parameters) in
143      * the C API and bindings.  But in the RPC protocol, we transfer
144      * the actual file content up to or down from the daemon.
145      * FileIn: local machine -> daemon (in request)
146      * FileOut: daemon -> local machine (in reply)
147      * In guestfish (only), the special name "-" means read from
148      * stdin or write to stdout.
149      *)
150   | FileIn of string
151   | FileOut of string
152 (* Not implemented:
153     (* Opaque buffer which can contain arbitrary 8 bit data.
154      * In the C API, this is expressed as <char *, int> pair.
155      * Most other languages have a string type which can contain
156      * ASCII NUL.  We use whatever type is appropriate for each
157      * language.
158      * Buffers are limited by the total message size.  To transfer
159      * large blocks of data, use FileIn/FileOut parameters instead.
160      * To return an arbitrary buffer, use RBufferOut.
161      *)
162   | BufferIn of string
163 *)
164
165 type flags =
166   | ProtocolLimitWarning  (* display warning about protocol size limits *)
167   | DangerWillRobinson    (* flags particularly dangerous commands *)
168   | FishAlias of string   (* provide an alias for this cmd in guestfish *)
169   | FishAction of string  (* call this function in guestfish *)
170   | NotInFish             (* do not export via guestfish *)
171   | NotInDocs             (* do not add this function to documentation *)
172   | DeprecatedBy of string (* function is deprecated, use .. instead *)
173
174 (* You can supply zero or as many tests as you want per API call.
175  *
176  * Note that the test environment has 3 block devices, of size 500MB,
177  * 50MB and 10MB (respectively /dev/sda, /dev/sdb, /dev/sdc), and
178  * a fourth squashfs block device with some known files on it (/dev/sdd).
179  *
180  * Note for partitioning purposes, the 500MB device has 1015 cylinders.
181  * Number of cylinders was 63 for IDE emulated disks with precisely
182  * the same size.  How exactly this is calculated is a mystery.
183  *
184  * The squashfs block device (/dev/sdd) comes from images/test.sqsh.
185  *
186  * To be able to run the tests in a reasonable amount of time,
187  * the virtual machine and block devices are reused between tests.
188  * So don't try testing kill_subprocess :-x
189  *
190  * Between each test we blockdev-setrw, umount-all, lvm-remove-all.
191  *
192  * Don't assume anything about the previous contents of the block
193  * devices.  Use 'Init*' to create some initial scenarios.
194  *
195  * You can add a prerequisite clause to any individual test.  This
196  * is a run-time check, which, if it fails, causes the test to be
197  * skipped.  Useful if testing a command which might not work on
198  * all variations of libguestfs builds.  A test that has prerequisite
199  * of 'Always' is run unconditionally.
200  *
201  * In addition, packagers can skip individual tests by setting the
202  * environment variables:     eg:
203  *   SKIP_TEST_<CMD>_<NUM>=1  SKIP_TEST_COMMAND_3=1  (skips test #3 of command)
204  *   SKIP_TEST_<CMD>=1        SKIP_TEST_ZEROFREE=1   (skips all zerofree tests)
205  *)
206 type tests = (test_init * test_prereq * test) list
207 and test =
208     (* Run the command sequence and just expect nothing to fail. *)
209   | TestRun of seq
210     (* Run the command sequence and expect the output of the final
211      * command to be the string.
212      *)
213   | TestOutput of seq * string
214     (* Run the command sequence and expect the output of the final
215      * command to be the list of strings.
216      *)
217   | TestOutputList of seq * string list
218     (* Run the command sequence and expect the output of the final
219      * command to be the list of block devices (could be either
220      * "/dev/sd.." or "/dev/hd.." form - we don't check the 5th
221      * character of each string).
222      *)
223   | TestOutputListOfDevices of seq * string list
224     (* Run the command sequence and expect the output of the final
225      * command to be the integer.
226      *)
227   | TestOutputInt of seq * int
228     (* Run the command sequence and expect the output of the final
229      * command to be <op> <int>, eg. ">=", "1".
230      *)
231   | TestOutputIntOp of seq * string * int
232     (* Run the command sequence and expect the output of the final
233      * command to be a true value (!= 0 or != NULL).
234      *)
235   | TestOutputTrue of seq
236     (* Run the command sequence and expect the output of the final
237      * command to be a false value (== 0 or == NULL, but not an error).
238      *)
239   | TestOutputFalse of seq
240     (* Run the command sequence and expect the output of the final
241      * command to be a list of the given length (but don't care about
242      * content).
243      *)
244   | TestOutputLength of seq * int
245     (* Run the command sequence and expect the output of the final
246      * command to be a structure.
247      *)
248   | TestOutputStruct of seq * test_field_compare list
249     (* Run the command sequence and expect the final command (only)
250      * to fail.
251      *)
252   | TestLastFail of seq
253
254 and test_field_compare =
255   | CompareWithInt of string * int
256   | CompareWithIntOp of string * string * int
257   | CompareWithString of string * string
258   | CompareFieldsIntEq of string * string
259   | CompareFieldsStrEq of string * string
260
261 (* Test prerequisites. *)
262 and test_prereq =
263     (* Test always runs. *)
264   | Always
265     (* Test is currently disabled - eg. it fails, or it tests some
266      * unimplemented feature.
267      *)
268   | Disabled
269     (* 'string' is some C code (a function body) that should return
270      * true or false.  The test will run if the code returns true.
271      *)
272   | If of string
273     (* As for 'If' but the test runs _unless_ the code returns true. *)
274   | Unless of string
275
276 (* Some initial scenarios for testing. *)
277 and test_init =
278     (* Do nothing, block devices could contain random stuff including
279      * LVM PVs, and some filesystems might be mounted.  This is usually
280      * a bad idea.
281      *)
282   | InitNone
283
284     (* Block devices are empty and no filesystems are mounted. *)
285   | InitEmpty
286
287     (* /dev/sda contains a single partition /dev/sda1, which is formatted
288      * as ext2, empty [except for lost+found] and mounted on /.
289      * /dev/sdb and /dev/sdc may have random content.
290      * No LVM.
291      *)
292   | InitBasicFS
293
294     (* /dev/sda:
295      *   /dev/sda1 (is a PV):
296      *     /dev/VG/LV (size 8MB):
297      *       formatted as ext2, empty [except for lost+found], mounted on /
298      * /dev/sdb and /dev/sdc may have random content.
299      *)
300   | InitBasicFSonLVM
301
302     (* /dev/sdd (the squashfs, see images/ directory in source)
303      * is mounted on /
304      *)
305   | InitSquashFS
306
307 (* Sequence of commands for testing. *)
308 and seq = cmd list
309 and cmd = string list
310
311 (* Note about long descriptions: When referring to another
312  * action, use the format C<guestfs_other> (ie. the full name of
313  * the C function).  This will be replaced as appropriate in other
314  * language bindings.
315  *
316  * Apart from that, long descriptions are just perldoc paragraphs.
317  *)
318
319 (* These test functions are used in the language binding tests. *)
320
321 let test_all_args = [
322   String "str";
323   OptString "optstr";
324   StringList "strlist";
325   Bool "b";
326   Int "integer";
327   FileIn "filein";
328   FileOut "fileout";
329 ]
330
331 let test_all_rets = [
332   (* except for RErr, which is tested thoroughly elsewhere *)
333   "test0rint",         RInt "valout";
334   "test0rint64",       RInt64 "valout";
335   "test0rbool",        RBool "valout";
336   "test0rconststring", RConstString "valout";
337   "test0rconstoptstring", RConstOptString "valout";
338   "test0rstring",      RString "valout";
339   "test0rstringlist",  RStringList "valout";
340   "test0rstruct",      RStruct ("valout", "lvm_pv");
341   "test0rstructlist",  RStructList ("valout", "lvm_pv");
342   "test0rhashtable",   RHashtable "valout";
343 ]
344
345 let test_functions = [
346   ("test0", (RErr, test_all_args), -1, [NotInFish; NotInDocs],
347    [],
348    "internal test function - do not use",
349    "\
350 This is an internal test function which is used to test whether
351 the automatically generated bindings can handle every possible
352 parameter type correctly.
353
354 It echos the contents of each parameter to stdout.
355
356 You probably don't want to call this function.");
357 ] @ List.flatten (
358   List.map (
359     fun (name, ret) ->
360       [(name, (ret, [String "val"]), -1, [NotInFish; NotInDocs],
361         [],
362         "internal test function - do not use",
363         "\
364 This is an internal test function which is used to test whether
365 the automatically generated bindings can handle every possible
366 return type correctly.
367
368 It converts string C<val> to the return type.
369
370 You probably don't want to call this function.");
371        (name ^ "err", (ret, []), -1, [NotInFish; NotInDocs],
372         [],
373         "internal test function - do not use",
374         "\
375 This is an internal test function which is used to test whether
376 the automatically generated bindings can handle every possible
377 return type correctly.
378
379 This function always returns an error.
380
381 You probably don't want to call this function.")]
382   ) test_all_rets
383 )
384
385 (* non_daemon_functions are any functions which don't get processed
386  * in the daemon, eg. functions for setting and getting local
387  * configuration values.
388  *)
389
390 let non_daemon_functions = test_functions @ [
391   ("launch", (RErr, []), -1, [FishAlias "run"; FishAction "launch"],
392    [],
393    "launch the qemu subprocess",
394    "\
395 Internally libguestfs is implemented by running a virtual machine
396 using L<qemu(1)>.
397
398 You should call this after configuring the handle
399 (eg. adding drives) but before performing any actions.");
400
401   ("wait_ready", (RErr, []), -1, [NotInFish],
402    [],
403    "wait until the qemu subprocess launches",
404    "\
405 Internally libguestfs is implemented by running a virtual machine
406 using L<qemu(1)>.
407
408 You should call this after C<guestfs_launch> to wait for the launch
409 to complete.");
410
411   ("kill_subprocess", (RErr, []), -1, [],
412    [],
413    "kill the qemu subprocess",
414    "\
415 This kills the qemu subprocess.  You should never need to call this.");
416
417   ("add_drive", (RErr, [String "filename"]), -1, [FishAlias "add"],
418    [],
419    "add an image to examine or modify",
420    "\
421 This function adds a virtual machine disk image C<filename> to the
422 guest.  The first time you call this function, the disk appears as IDE
423 disk 0 (C</dev/sda>) in the guest, the second time as C</dev/sdb>, and
424 so on.
425
426 You don't necessarily need to be root when using libguestfs.  However
427 you obviously do need sufficient permissions to access the filename
428 for whatever operations you want to perform (ie. read access if you
429 just want to read the image or write access if you want to modify the
430 image).
431
432 This is equivalent to the qemu parameter
433 C<-drive file=filename,cache=off,if=...>.
434
435 Note that this call checks for the existence of C<filename>.  This
436 stops you from specifying other types of drive which are supported
437 by qemu such as C<nbd:> and C<http:> URLs.  To specify those, use
438 the general C<guestfs_config> call instead.");
439
440   ("add_cdrom", (RErr, [String "filename"]), -1, [FishAlias "cdrom"],
441    [],
442    "add a CD-ROM disk image to examine",
443    "\
444 This function adds a virtual CD-ROM disk image to the guest.
445
446 This is equivalent to the qemu parameter C<-cdrom filename>.
447
448 Note that this call checks for the existence of C<filename>.  This
449 stops you from specifying other types of drive which are supported
450 by qemu such as C<nbd:> and C<http:> URLs.  To specify those, use
451 the general C<guestfs_config> call instead.");
452
453   ("add_drive_ro", (RErr, [String "filename"]), -1, [FishAlias "add-ro"],
454    [],
455    "add a drive in snapshot mode (read-only)",
456    "\
457 This adds a drive in snapshot mode, making it effectively
458 read-only.
459
460 Note that writes to the device are allowed, and will be seen for
461 the duration of the guestfs handle, but they are written
462 to a temporary file which is discarded as soon as the guestfs
463 handle is closed.  We don't currently have any method to enable
464 changes to be committed, although qemu can support this.
465
466 This is equivalent to the qemu parameter
467 C<-drive file=filename,snapshot=on,if=...>.
468
469 Note that this call checks for the existence of C<filename>.  This
470 stops you from specifying other types of drive which are supported
471 by qemu such as C<nbd:> and C<http:> URLs.  To specify those, use
472 the general C<guestfs_config> call instead.");
473
474   ("config", (RErr, [String "qemuparam"; OptString "qemuvalue"]), -1, [],
475    [],
476    "add qemu parameters",
477    "\
478 This can be used to add arbitrary qemu command line parameters
479 of the form C<-param value>.  Actually it's not quite arbitrary - we
480 prevent you from setting some parameters which would interfere with
481 parameters that we use.
482
483 The first character of C<param> string must be a C<-> (dash).
484
485 C<value> can be NULL.");
486
487   ("set_qemu", (RErr, [String "qemu"]), -1, [FishAlias "qemu"],
488    [],
489    "set the qemu binary",
490    "\
491 Set the qemu binary that we will use.
492
493 The default is chosen when the library was compiled by the
494 configure script.
495
496 You can also override this by setting the C<LIBGUESTFS_QEMU>
497 environment variable.
498
499 Setting C<qemu> to C<NULL> restores the default qemu binary.");
500
501   ("get_qemu", (RConstString "qemu", []), -1, [],
502    [InitNone, Always, TestRun (
503       [["get_qemu"]])],
504    "get the qemu binary",
505    "\
506 Return the current qemu binary.
507
508 This is always non-NULL.  If it wasn't set already, then this will
509 return the default qemu binary name.");
510
511   ("set_path", (RErr, [String "path"]), -1, [FishAlias "path"],
512    [],
513    "set the search path",
514    "\
515 Set the path that libguestfs searches for kernel and initrd.img.
516
517 The default is C<$libdir/guestfs> unless overridden by setting
518 C<LIBGUESTFS_PATH> environment variable.
519
520 Setting C<path> to C<NULL> restores the default path.");
521
522   ("get_path", (RConstString "path", []), -1, [],
523    [InitNone, Always, TestRun (
524       [["get_path"]])],
525    "get the search path",
526    "\
527 Return the current search path.
528
529 This is always non-NULL.  If it wasn't set already, then this will
530 return the default path.");
531
532   ("set_append", (RErr, [OptString "append"]), -1, [FishAlias "append"],
533    [],
534    "add options to kernel command line",
535    "\
536 This function is used to add additional options to the
537 guest kernel command line.
538
539 The default is C<NULL> unless overridden by setting
540 C<LIBGUESTFS_APPEND> environment variable.
541
542 Setting C<append> to C<NULL> means I<no> additional options
543 are passed (libguestfs always adds a few of its own).");
544
545   ("get_append", (RConstOptString "append", []), -1, [],
546    (* This cannot be tested with the current framework.  The
547     * function can return NULL in normal operations, which the
548     * test framework interprets as an error.
549     *)
550    [],
551    "get the additional kernel options",
552    "\
553 Return the additional kernel options which are added to the
554 guest kernel command line.
555
556 If C<NULL> then no options are added.");
557
558   ("set_autosync", (RErr, [Bool "autosync"]), -1, [FishAlias "autosync"],
559    [],
560    "set autosync mode",
561    "\
562 If C<autosync> is true, this enables autosync.  Libguestfs will make a
563 best effort attempt to run C<guestfs_umount_all> followed by
564 C<guestfs_sync> when the handle is closed
565 (also if the program exits without closing handles).
566
567 This is disabled by default (except in guestfish where it is
568 enabled by default).");
569
570   ("get_autosync", (RBool "autosync", []), -1, [],
571    [InitNone, Always, TestRun (
572       [["get_autosync"]])],
573    "get autosync mode",
574    "\
575 Get the autosync flag.");
576
577   ("set_verbose", (RErr, [Bool "verbose"]), -1, [FishAlias "verbose"],
578    [],
579    "set verbose mode",
580    "\
581 If C<verbose> is true, this turns on verbose messages (to C<stderr>).
582
583 Verbose messages are disabled unless the environment variable
584 C<LIBGUESTFS_DEBUG> is defined and set to C<1>.");
585
586   ("get_verbose", (RBool "verbose", []), -1, [],
587    [],
588    "get verbose mode",
589    "\
590 This returns the verbose messages flag.");
591
592   ("is_ready", (RBool "ready", []), -1, [],
593    [InitNone, Always, TestOutputTrue (
594       [["is_ready"]])],
595    "is ready to accept commands",
596    "\
597 This returns true iff this handle is ready to accept commands
598 (in the C<READY> state).
599
600 For more information on states, see L<guestfs(3)>.");
601
602   ("is_config", (RBool "config", []), -1, [],
603    [InitNone, Always, TestOutputFalse (
604       [["is_config"]])],
605    "is in configuration state",
606    "\
607 This returns true iff this handle is being configured
608 (in the C<CONFIG> state).
609
610 For more information on states, see L<guestfs(3)>.");
611
612   ("is_launching", (RBool "launching", []), -1, [],
613    [InitNone, Always, TestOutputFalse (
614       [["is_launching"]])],
615    "is launching subprocess",
616    "\
617 This returns true iff this handle is launching the subprocess
618 (in the C<LAUNCHING> state).
619
620 For more information on states, see L<guestfs(3)>.");
621
622   ("is_busy", (RBool "busy", []), -1, [],
623    [InitNone, Always, TestOutputFalse (
624       [["is_busy"]])],
625    "is busy processing a command",
626    "\
627 This returns true iff this handle is busy processing a command
628 (in the C<BUSY> state).
629
630 For more information on states, see L<guestfs(3)>.");
631
632   ("get_state", (RInt "state", []), -1, [],
633    [],
634    "get the current state",
635    "\
636 This returns the current state as an opaque integer.  This is
637 only useful for printing debug and internal error messages.
638
639 For more information on states, see L<guestfs(3)>.");
640
641   ("set_busy", (RErr, []), -1, [NotInFish],
642    [],
643    "set state to busy",
644    "\
645 This sets the state to C<BUSY>.  This is only used when implementing
646 actions using the low-level API.
647
648 For more information on states, see L<guestfs(3)>.");
649
650   ("set_ready", (RErr, []), -1, [NotInFish],
651    [],
652    "set state to ready",
653    "\
654 This sets the state to C<READY>.  This is only used when implementing
655 actions using the low-level API.
656
657 For more information on states, see L<guestfs(3)>.");
658
659   ("end_busy", (RErr, []), -1, [NotInFish],
660    [],
661    "leave the busy state",
662    "\
663 This sets the state to C<READY>, or if in C<CONFIG> then it leaves the
664 state as is.  This is only used when implementing
665 actions using the low-level API.
666
667 For more information on states, see L<guestfs(3)>.");
668
669   ("set_memsize", (RErr, [Int "memsize"]), -1, [FishAlias "memsize"],
670    [InitNone, Always, TestOutputInt (
671       [["set_memsize"; "500"];
672        ["get_memsize"]], 500)],
673    "set memory allocated to the qemu subprocess",
674    "\
675 This sets the memory size in megabytes allocated to the
676 qemu subprocess.  This only has any effect if called before
677 C<guestfs_launch>.
678
679 You can also change this by setting the environment
680 variable C<LIBGUESTFS_MEMSIZE> before the handle is
681 created.
682
683 For more information on the architecture of libguestfs,
684 see L<guestfs(3)>.");
685
686   ("get_memsize", (RInt "memsize", []), -1, [],
687    [InitNone, Always, TestOutputIntOp (
688       [["get_memsize"]], ">=", 256)],
689    "get memory allocated to the qemu subprocess",
690    "\
691 This gets the memory size in megabytes allocated to the
692 qemu subprocess.
693
694 If C<guestfs_set_memsize> was not called
695 on this handle, and if C<LIBGUESTFS_MEMSIZE> was not set,
696 then this returns the compiled-in default value for memsize.
697
698 For more information on the architecture of libguestfs,
699 see L<guestfs(3)>.");
700
701   ("get_pid", (RInt "pid", []), -1, [FishAlias "pid"],
702    [InitNone, Always, TestOutputIntOp (
703       [["get_pid"]], ">=", 1)],
704    "get PID of qemu subprocess",
705    "\
706 Return the process ID of the qemu subprocess.  If there is no
707 qemu subprocess, then this will return an error.
708
709 This is an internal call used for debugging and testing.");
710
711   ("version", (RStruct ("version", "version"), []), -1, [],
712    [InitNone, Always, TestOutputStruct (
713       [["version"]], [CompareWithInt ("major", 1)])],
714    "get the library version number",
715    "\
716 Return the libguestfs version number that the program is linked
717 against.
718
719 Note that because of dynamic linking this is not necessarily
720 the version of libguestfs that you compiled against.  You can
721 compile the program, and then at runtime dynamically link
722 against a completely different C<libguestfs.so> library.
723
724 This call was added in version C<1.0.58>.  In previous
725 versions of libguestfs there was no way to get the version
726 number.  From C code you can use ELF weak linking tricks to find out if
727 this symbol exists (if it doesn't, then it's an earlier version).
728
729 The call returns a structure with four elements.  The first
730 three (C<major>, C<minor> and C<release>) are numbers and
731 correspond to the usual version triplet.  The fourth element
732 (C<extra>) is a string and is normally empty, but may be
733 used for distro-specific information.
734
735 To construct the original version string:
736 C<$major.$minor.$release$extra>
737
738 I<Note:> Don't use this call to test for availability
739 of features.  Distro backports makes this unreliable.");
740
741 ]
742
743 (* daemon_functions are any functions which cause some action
744  * to take place in the daemon.
745  *)
746
747 let daemon_functions = [
748   ("mount", (RErr, [String "device"; String "mountpoint"]), 1, [],
749    [InitEmpty, Always, TestOutput (
750       [["sfdiskM"; "/dev/sda"; ","];
751        ["mkfs"; "ext2"; "/dev/sda1"];
752        ["mount"; "/dev/sda1"; "/"];
753        ["write_file"; "/new"; "new file contents"; "0"];
754        ["cat"; "/new"]], "new file contents")],
755    "mount a guest disk at a position in the filesystem",
756    "\
757 Mount a guest disk at a position in the filesystem.  Block devices
758 are named C</dev/sda>, C</dev/sdb> and so on, as they were added to
759 the guest.  If those block devices contain partitions, they will have
760 the usual names (eg. C</dev/sda1>).  Also LVM C</dev/VG/LV>-style
761 names can be used.
762
763 The rules are the same as for L<mount(2)>:  A filesystem must
764 first be mounted on C</> before others can be mounted.  Other
765 filesystems can only be mounted on directories which already
766 exist.
767
768 The mounted filesystem is writable, if we have sufficient permissions
769 on the underlying device.
770
771 The filesystem options C<sync> and C<noatime> are set with this
772 call, in order to improve reliability.");
773
774   ("sync", (RErr, []), 2, [],
775    [ InitEmpty, Always, TestRun [["sync"]]],
776    "sync disks, writes are flushed through to the disk image",
777    "\
778 This syncs the disk, so that any writes are flushed through to the
779 underlying disk image.
780
781 You should always call this if you have modified a disk image, before
782 closing the handle.");
783
784   ("touch", (RErr, [String "path"]), 3, [],
785    [InitBasicFS, Always, TestOutputTrue (
786       [["touch"; "/new"];
787        ["exists"; "/new"]])],
788    "update file timestamps or create a new file",
789    "\
790 Touch acts like the L<touch(1)> command.  It can be used to
791 update the timestamps on a file, or, if the file does not exist,
792 to create a new zero-length file.");
793
794   ("cat", (RString "content", [String "path"]), 4, [ProtocolLimitWarning],
795    [InitBasicFS, Always, TestOutput (
796       [["write_file"; "/new"; "new file contents"; "0"];
797        ["cat"; "/new"]], "new file contents")],
798    "list the contents of a file",
799    "\
800 Return the contents of the file named C<path>.
801
802 Note that this function cannot correctly handle binary files
803 (specifically, files containing C<\\0> character which is treated
804 as end of string).  For those you need to use the C<guestfs_read_file>
805 or C<guestfs_download> functions which have a more complex interface.");
806
807   ("ll", (RString "listing", [String "directory"]), 5, [],
808    [], (* XXX Tricky to test because it depends on the exact format
809         * of the 'ls -l' command, which changes between F10 and F11.
810         *)
811    "list the files in a directory (long format)",
812    "\
813 List the files in C<directory> (relative to the root directory,
814 there is no cwd) in the format of 'ls -la'.
815
816 This command is mostly useful for interactive sessions.  It
817 is I<not> intended that you try to parse the output string.");
818
819   ("ls", (RStringList "listing", [String "directory"]), 6, [],
820    [InitBasicFS, Always, TestOutputList (
821       [["touch"; "/new"];
822        ["touch"; "/newer"];
823        ["touch"; "/newest"];
824        ["ls"; "/"]], ["lost+found"; "new"; "newer"; "newest"])],
825    "list the files in a directory",
826    "\
827 List the files in C<directory> (relative to the root directory,
828 there is no cwd).  The '.' and '..' entries are not returned, but
829 hidden files are shown.
830
831 This command is mostly useful for interactive sessions.  Programs
832 should probably use C<guestfs_readdir> instead.");
833
834   ("list_devices", (RStringList "devices", []), 7, [],
835    [InitEmpty, Always, TestOutputListOfDevices (
836       [["list_devices"]], ["/dev/sda"; "/dev/sdb"; "/dev/sdc"; "/dev/sdd"])],
837    "list the block devices",
838    "\
839 List all the block devices.
840
841 The full block device names are returned, eg. C</dev/sda>");
842
843   ("list_partitions", (RStringList "partitions", []), 8, [],
844    [InitBasicFS, Always, TestOutputListOfDevices (
845       [["list_partitions"]], ["/dev/sda1"]);
846     InitEmpty, Always, TestOutputListOfDevices (
847       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
848        ["list_partitions"]], ["/dev/sda1"; "/dev/sda2"; "/dev/sda3"])],
849    "list the partitions",
850    "\
851 List all the partitions detected on all block devices.
852
853 The full partition device names are returned, eg. C</dev/sda1>
854
855 This does not return logical volumes.  For that you will need to
856 call C<guestfs_lvs>.");
857
858   ("pvs", (RStringList "physvols", []), 9, [],
859    [InitBasicFSonLVM, Always, TestOutputListOfDevices (
860       [["pvs"]], ["/dev/sda1"]);
861     InitEmpty, Always, TestOutputListOfDevices (
862       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
863        ["pvcreate"; "/dev/sda1"];
864        ["pvcreate"; "/dev/sda2"];
865        ["pvcreate"; "/dev/sda3"];
866        ["pvs"]], ["/dev/sda1"; "/dev/sda2"; "/dev/sda3"])],
867    "list the LVM physical volumes (PVs)",
868    "\
869 List all the physical volumes detected.  This is the equivalent
870 of the L<pvs(8)> command.
871
872 This returns a list of just the device names that contain
873 PVs (eg. C</dev/sda2>).
874
875 See also C<guestfs_pvs_full>.");
876
877   ("vgs", (RStringList "volgroups", []), 10, [],
878    [InitBasicFSonLVM, Always, TestOutputList (
879       [["vgs"]], ["VG"]);
880     InitEmpty, Always, TestOutputList (
881       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
882        ["pvcreate"; "/dev/sda1"];
883        ["pvcreate"; "/dev/sda2"];
884        ["pvcreate"; "/dev/sda3"];
885        ["vgcreate"; "VG1"; "/dev/sda1 /dev/sda2"];
886        ["vgcreate"; "VG2"; "/dev/sda3"];
887        ["vgs"]], ["VG1"; "VG2"])],
888    "list the LVM volume groups (VGs)",
889    "\
890 List all the volumes groups detected.  This is the equivalent
891 of the L<vgs(8)> command.
892
893 This returns a list of just the volume group names that were
894 detected (eg. C<VolGroup00>).
895
896 See also C<guestfs_vgs_full>.");
897
898   ("lvs", (RStringList "logvols", []), 11, [],
899    [InitBasicFSonLVM, Always, TestOutputList (
900       [["lvs"]], ["/dev/VG/LV"]);
901     InitEmpty, Always, TestOutputList (
902       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
903        ["pvcreate"; "/dev/sda1"];
904        ["pvcreate"; "/dev/sda2"];
905        ["pvcreate"; "/dev/sda3"];
906        ["vgcreate"; "VG1"; "/dev/sda1 /dev/sda2"];
907        ["vgcreate"; "VG2"; "/dev/sda3"];
908        ["lvcreate"; "LV1"; "VG1"; "50"];
909        ["lvcreate"; "LV2"; "VG1"; "50"];
910        ["lvcreate"; "LV3"; "VG2"; "50"];
911        ["lvs"]], ["/dev/VG1/LV1"; "/dev/VG1/LV2"; "/dev/VG2/LV3"])],
912    "list the LVM logical volumes (LVs)",
913    "\
914 List all the logical volumes detected.  This is the equivalent
915 of the L<lvs(8)> command.
916
917 This returns a list of the logical volume device names
918 (eg. C</dev/VolGroup00/LogVol00>).
919
920 See also C<guestfs_lvs_full>.");
921
922   ("pvs_full", (RStructList ("physvols", "lvm_pv"), []), 12, [],
923    [], (* XXX how to test? *)
924    "list the LVM physical volumes (PVs)",
925    "\
926 List all the physical volumes detected.  This is the equivalent
927 of the L<pvs(8)> command.  The \"full\" version includes all fields.");
928
929   ("vgs_full", (RStructList ("volgroups", "lvm_vg"), []), 13, [],
930    [], (* XXX how to test? *)
931    "list the LVM volume groups (VGs)",
932    "\
933 List all the volumes groups detected.  This is the equivalent
934 of the L<vgs(8)> command.  The \"full\" version includes all fields.");
935
936   ("lvs_full", (RStructList ("logvols", "lvm_lv"), []), 14, [],
937    [], (* XXX how to test? *)
938    "list the LVM logical volumes (LVs)",
939    "\
940 List all the logical volumes detected.  This is the equivalent
941 of the L<lvs(8)> command.  The \"full\" version includes all fields.");
942
943   ("read_lines", (RStringList "lines", [String "path"]), 15, [],
944    [InitBasicFS, Always, TestOutputList (
945       [["write_file"; "/new"; "line1\r\nline2\nline3"; "0"];
946        ["read_lines"; "/new"]], ["line1"; "line2"; "line3"]);
947     InitBasicFS, Always, TestOutputList (
948       [["write_file"; "/new"; ""; "0"];
949        ["read_lines"; "/new"]], [])],
950    "read file as lines",
951    "\
952 Return the contents of the file named C<path>.
953
954 The file contents are returned as a list of lines.  Trailing
955 C<LF> and C<CRLF> character sequences are I<not> returned.
956
957 Note that this function cannot correctly handle binary files
958 (specifically, files containing C<\\0> character which is treated
959 as end of line).  For those you need to use the C<guestfs_read_file>
960 function which has a more complex interface.");
961
962   ("aug_init", (RErr, [String "root"; Int "flags"]), 16, [],
963    [], (* XXX Augeas code needs tests. *)
964    "create a new Augeas handle",
965    "\
966 Create a new Augeas handle for editing configuration files.
967 If there was any previous Augeas handle associated with this
968 guestfs session, then it is closed.
969
970 You must call this before using any other C<guestfs_aug_*>
971 commands.
972
973 C<root> is the filesystem root.  C<root> must not be NULL,
974 use C</> instead.
975
976 The flags are the same as the flags defined in
977 E<lt>augeas.hE<gt>, the logical I<or> of the following
978 integers:
979
980 =over 4
981
982 =item C<AUG_SAVE_BACKUP> = 1
983
984 Keep the original file with a C<.augsave> extension.
985
986 =item C<AUG_SAVE_NEWFILE> = 2
987
988 Save changes into a file with extension C<.augnew>, and
989 do not overwrite original.  Overrides C<AUG_SAVE_BACKUP>.
990
991 =item C<AUG_TYPE_CHECK> = 4
992
993 Typecheck lenses (can be expensive).
994
995 =item C<AUG_NO_STDINC> = 8
996
997 Do not use standard load path for modules.
998
999 =item C<AUG_SAVE_NOOP> = 16
1000
1001 Make save a no-op, just record what would have been changed.
1002
1003 =item C<AUG_NO_LOAD> = 32
1004
1005 Do not load the tree in C<guestfs_aug_init>.
1006
1007 =back
1008
1009 To close the handle, you can call C<guestfs_aug_close>.
1010
1011 To find out more about Augeas, see L<http://augeas.net/>.");
1012
1013   ("aug_close", (RErr, []), 26, [],
1014    [], (* XXX Augeas code needs tests. *)
1015    "close the current Augeas handle",
1016    "\
1017 Close the current Augeas handle and free up any resources
1018 used by it.  After calling this, you have to call
1019 C<guestfs_aug_init> again before you can use any other
1020 Augeas functions.");
1021
1022   ("aug_defvar", (RInt "nrnodes", [String "name"; OptString "expr"]), 17, [],
1023    [], (* XXX Augeas code needs tests. *)
1024    "define an Augeas variable",
1025    "\
1026 Defines an Augeas variable C<name> whose value is the result
1027 of evaluating C<expr>.  If C<expr> is NULL, then C<name> is
1028 undefined.
1029
1030 On success this returns the number of nodes in C<expr>, or
1031 C<0> if C<expr> evaluates to something which is not a nodeset.");
1032
1033   ("aug_defnode", (RStruct ("nrnodescreated", "int_bool"), [String "name"; String "expr"; String "val"]), 18, [],
1034    [], (* XXX Augeas code needs tests. *)
1035    "define an Augeas node",
1036    "\
1037 Defines a variable C<name> whose value is the result of
1038 evaluating C<expr>.
1039
1040 If C<expr> evaluates to an empty nodeset, a node is created,
1041 equivalent to calling C<guestfs_aug_set> C<expr>, C<value>.
1042 C<name> will be the nodeset containing that single node.
1043
1044 On success this returns a pair containing the
1045 number of nodes in the nodeset, and a boolean flag
1046 if a node was created.");
1047
1048   ("aug_get", (RString "val", [String "path"]), 19, [],
1049    [], (* XXX Augeas code needs tests. *)
1050    "look up the value of an Augeas path",
1051    "\
1052 Look up the value associated with C<path>.  If C<path>
1053 matches exactly one node, the C<value> is returned.");
1054
1055   ("aug_set", (RErr, [String "path"; String "val"]), 20, [],
1056    [], (* XXX Augeas code needs tests. *)
1057    "set Augeas path to value",
1058    "\
1059 Set the value associated with C<path> to C<value>.");
1060
1061   ("aug_insert", (RErr, [String "path"; String "label"; Bool "before"]), 21, [],
1062    [], (* XXX Augeas code needs tests. *)
1063    "insert a sibling Augeas node",
1064    "\
1065 Create a new sibling C<label> for C<path>, inserting it into
1066 the tree before or after C<path> (depending on the boolean
1067 flag C<before>).
1068
1069 C<path> must match exactly one existing node in the tree, and
1070 C<label> must be a label, ie. not contain C</>, C<*> or end
1071 with a bracketed index C<[N]>.");
1072
1073   ("aug_rm", (RInt "nrnodes", [String "path"]), 22, [],
1074    [], (* XXX Augeas code needs tests. *)
1075    "remove an Augeas path",
1076    "\
1077 Remove C<path> and all of its children.
1078
1079 On success this returns the number of entries which were removed.");
1080
1081   ("aug_mv", (RErr, [String "src"; String "dest"]), 23, [],
1082    [], (* XXX Augeas code needs tests. *)
1083    "move Augeas node",
1084    "\
1085 Move the node C<src> to C<dest>.  C<src> must match exactly
1086 one node.  C<dest> is overwritten if it exists.");
1087
1088   ("aug_match", (RStringList "matches", [String "path"]), 24, [],
1089    [], (* XXX Augeas code needs tests. *)
1090    "return Augeas nodes which match path",
1091    "\
1092 Returns a list of paths which match the path expression C<path>.
1093 The returned paths are sufficiently qualified so that they match
1094 exactly one node in the current tree.");
1095
1096   ("aug_save", (RErr, []), 25, [],
1097    [], (* XXX Augeas code needs tests. *)
1098    "write all pending Augeas changes to disk",
1099    "\
1100 This writes all pending changes to disk.
1101
1102 The flags which were passed to C<guestfs_aug_init> affect exactly
1103 how files are saved.");
1104
1105   ("aug_load", (RErr, []), 27, [],
1106    [], (* XXX Augeas code needs tests. *)
1107    "load files into the tree",
1108    "\
1109 Load files into the tree.
1110
1111 See C<aug_load> in the Augeas documentation for the full gory
1112 details.");
1113
1114   ("aug_ls", (RStringList "matches", [String "path"]), 28, [],
1115    [], (* XXX Augeas code needs tests. *)
1116    "list Augeas nodes under a path",
1117    "\
1118 This is just a shortcut for listing C<guestfs_aug_match>
1119 C<path/*> and sorting the resulting nodes into alphabetical order.");
1120
1121   ("rm", (RErr, [String "path"]), 29, [],
1122    [InitBasicFS, Always, TestRun
1123       [["touch"; "/new"];
1124        ["rm"; "/new"]];
1125     InitBasicFS, Always, TestLastFail
1126       [["rm"; "/new"]];
1127     InitBasicFS, Always, TestLastFail
1128       [["mkdir"; "/new"];
1129        ["rm"; "/new"]]],
1130    "remove a file",
1131    "\
1132 Remove the single file C<path>.");
1133
1134   ("rmdir", (RErr, [String "path"]), 30, [],
1135    [InitBasicFS, Always, TestRun
1136       [["mkdir"; "/new"];
1137        ["rmdir"; "/new"]];
1138     InitBasicFS, Always, TestLastFail
1139       [["rmdir"; "/new"]];
1140     InitBasicFS, Always, TestLastFail
1141       [["touch"; "/new"];
1142        ["rmdir"; "/new"]]],
1143    "remove a directory",
1144    "\
1145 Remove the single directory C<path>.");
1146
1147   ("rm_rf", (RErr, [String "path"]), 31, [],
1148    [InitBasicFS, Always, TestOutputFalse
1149       [["mkdir"; "/new"];
1150        ["mkdir"; "/new/foo"];
1151        ["touch"; "/new/foo/bar"];
1152        ["rm_rf"; "/new"];
1153        ["exists"; "/new"]]],
1154    "remove a file or directory recursively",
1155    "\
1156 Remove the file or directory C<path>, recursively removing the
1157 contents if its a directory.  This is like the C<rm -rf> shell
1158 command.");
1159
1160   ("mkdir", (RErr, [String "path"]), 32, [],
1161    [InitBasicFS, Always, TestOutputTrue
1162       [["mkdir"; "/new"];
1163        ["is_dir"; "/new"]];
1164     InitBasicFS, Always, TestLastFail
1165       [["mkdir"; "/new/foo/bar"]]],
1166    "create a directory",
1167    "\
1168 Create a directory named C<path>.");
1169
1170   ("mkdir_p", (RErr, [String "path"]), 33, [],
1171    [InitBasicFS, Always, TestOutputTrue
1172       [["mkdir_p"; "/new/foo/bar"];
1173        ["is_dir"; "/new/foo/bar"]];
1174     InitBasicFS, Always, TestOutputTrue
1175       [["mkdir_p"; "/new/foo/bar"];
1176        ["is_dir"; "/new/foo"]];
1177     InitBasicFS, Always, TestOutputTrue
1178       [["mkdir_p"; "/new/foo/bar"];
1179        ["is_dir"; "/new"]];
1180     (* Regression tests for RHBZ#503133: *)
1181     InitBasicFS, Always, TestRun
1182       [["mkdir"; "/new"];
1183        ["mkdir_p"; "/new"]];
1184     InitBasicFS, Always, TestLastFail
1185       [["touch"; "/new"];
1186        ["mkdir_p"; "/new"]]],
1187    "create a directory and parents",
1188    "\
1189 Create a directory named C<path>, creating any parent directories
1190 as necessary.  This is like the C<mkdir -p> shell command.");
1191
1192   ("chmod", (RErr, [Int "mode"; String "path"]), 34, [],
1193    [], (* XXX Need stat command to test *)
1194    "change file mode",
1195    "\
1196 Change the mode (permissions) of C<path> to C<mode>.  Only
1197 numeric modes are supported.");
1198
1199   ("chown", (RErr, [Int "owner"; Int "group"; String "path"]), 35, [],
1200    [], (* XXX Need stat command to test *)
1201    "change file owner and group",
1202    "\
1203 Change the file owner to C<owner> and group to C<group>.
1204
1205 Only numeric uid and gid are supported.  If you want to use
1206 names, you will need to locate and parse the password file
1207 yourself (Augeas support makes this relatively easy).");
1208
1209   ("exists", (RBool "existsflag", [String "path"]), 36, [],
1210    [InitBasicFS, Always, TestOutputTrue (
1211       [["touch"; "/new"];
1212        ["exists"; "/new"]]);
1213     InitBasicFS, Always, TestOutputTrue (
1214       [["mkdir"; "/new"];
1215        ["exists"; "/new"]])],
1216    "test if file or directory exists",
1217    "\
1218 This returns C<true> if and only if there is a file, directory
1219 (or anything) with the given C<path> name.
1220
1221 See also C<guestfs_is_file>, C<guestfs_is_dir>, C<guestfs_stat>.");
1222
1223   ("is_file", (RBool "fileflag", [String "path"]), 37, [],
1224    [InitBasicFS, Always, TestOutputTrue (
1225       [["touch"; "/new"];
1226        ["is_file"; "/new"]]);
1227     InitBasicFS, Always, TestOutputFalse (
1228       [["mkdir"; "/new"];
1229        ["is_file"; "/new"]])],
1230    "test if file exists",
1231    "\
1232 This returns C<true> if and only if there is a file
1233 with the given C<path> name.  Note that it returns false for
1234 other objects like directories.
1235
1236 See also C<guestfs_stat>.");
1237
1238   ("is_dir", (RBool "dirflag", [String "path"]), 38, [],
1239    [InitBasicFS, Always, TestOutputFalse (
1240       [["touch"; "/new"];
1241        ["is_dir"; "/new"]]);
1242     InitBasicFS, Always, TestOutputTrue (
1243       [["mkdir"; "/new"];
1244        ["is_dir"; "/new"]])],
1245    "test if file exists",
1246    "\
1247 This returns C<true> if and only if there is a directory
1248 with the given C<path> name.  Note that it returns false for
1249 other objects like files.
1250
1251 See also C<guestfs_stat>.");
1252
1253   ("pvcreate", (RErr, [String "device"]), 39, [],
1254    [InitEmpty, Always, TestOutputListOfDevices (
1255       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1256        ["pvcreate"; "/dev/sda1"];
1257        ["pvcreate"; "/dev/sda2"];
1258        ["pvcreate"; "/dev/sda3"];
1259        ["pvs"]], ["/dev/sda1"; "/dev/sda2"; "/dev/sda3"])],
1260    "create an LVM physical volume",
1261    "\
1262 This creates an LVM physical volume on the named C<device>,
1263 where C<device> should usually be a partition name such
1264 as C</dev/sda1>.");
1265
1266   ("vgcreate", (RErr, [String "volgroup"; StringList "physvols"]), 40, [],
1267    [InitEmpty, Always, TestOutputList (
1268       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1269        ["pvcreate"; "/dev/sda1"];
1270        ["pvcreate"; "/dev/sda2"];
1271        ["pvcreate"; "/dev/sda3"];
1272        ["vgcreate"; "VG1"; "/dev/sda1 /dev/sda2"];
1273        ["vgcreate"; "VG2"; "/dev/sda3"];
1274        ["vgs"]], ["VG1"; "VG2"])],
1275    "create an LVM volume group",
1276    "\
1277 This creates an LVM volume group called C<volgroup>
1278 from the non-empty list of physical volumes C<physvols>.");
1279
1280   ("lvcreate", (RErr, [String "logvol"; String "volgroup"; Int "mbytes"]), 41, [],
1281    [InitEmpty, Always, TestOutputList (
1282       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1283        ["pvcreate"; "/dev/sda1"];
1284        ["pvcreate"; "/dev/sda2"];
1285        ["pvcreate"; "/dev/sda3"];
1286        ["vgcreate"; "VG1"; "/dev/sda1 /dev/sda2"];
1287        ["vgcreate"; "VG2"; "/dev/sda3"];
1288        ["lvcreate"; "LV1"; "VG1"; "50"];
1289        ["lvcreate"; "LV2"; "VG1"; "50"];
1290        ["lvcreate"; "LV3"; "VG2"; "50"];
1291        ["lvcreate"; "LV4"; "VG2"; "50"];
1292        ["lvcreate"; "LV5"; "VG2"; "50"];
1293        ["lvs"]],
1294       ["/dev/VG1/LV1"; "/dev/VG1/LV2";
1295        "/dev/VG2/LV3"; "/dev/VG2/LV4"; "/dev/VG2/LV5"])],
1296    "create an LVM volume group",
1297    "\
1298 This creates an LVM volume group called C<logvol>
1299 on the volume group C<volgroup>, with C<size> megabytes.");
1300
1301   ("mkfs", (RErr, [String "fstype"; String "device"]), 42, [],
1302    [InitEmpty, Always, TestOutput (
1303       [["sfdiskM"; "/dev/sda"; ","];
1304        ["mkfs"; "ext2"; "/dev/sda1"];
1305        ["mount"; "/dev/sda1"; "/"];
1306        ["write_file"; "/new"; "new file contents"; "0"];
1307        ["cat"; "/new"]], "new file contents")],
1308    "make a filesystem",
1309    "\
1310 This creates a filesystem on C<device> (usually a partition
1311 or LVM logical volume).  The filesystem type is C<fstype>, for
1312 example C<ext3>.");
1313
1314   ("sfdisk", (RErr, [String "device";
1315                      Int "cyls"; Int "heads"; Int "sectors";
1316                      StringList "lines"]), 43, [DangerWillRobinson],
1317    [],
1318    "create partitions on a block device",
1319    "\
1320 This is a direct interface to the L<sfdisk(8)> program for creating
1321 partitions on block devices.
1322
1323 C<device> should be a block device, for example C</dev/sda>.
1324
1325 C<cyls>, C<heads> and C<sectors> are the number of cylinders, heads
1326 and sectors on the device, which are passed directly to sfdisk as
1327 the I<-C>, I<-H> and I<-S> parameters.  If you pass C<0> for any
1328 of these, then the corresponding parameter is omitted.  Usually for
1329 'large' disks, you can just pass C<0> for these, but for small
1330 (floppy-sized) disks, sfdisk (or rather, the kernel) cannot work
1331 out the right geometry and you will need to tell it.
1332
1333 C<lines> is a list of lines that we feed to C<sfdisk>.  For more
1334 information refer to the L<sfdisk(8)> manpage.
1335
1336 To create a single partition occupying the whole disk, you would
1337 pass C<lines> as a single element list, when the single element being
1338 the string C<,> (comma).
1339
1340 See also: C<guestfs_sfdisk_l>, C<guestfs_sfdisk_N>");
1341
1342   ("write_file", (RErr, [String "path"; String "content"; Int "size"]), 44, [ProtocolLimitWarning],
1343    [InitBasicFS, Always, TestOutput (
1344       [["write_file"; "/new"; "new file contents"; "0"];
1345        ["cat"; "/new"]], "new file contents");
1346     InitBasicFS, Always, TestOutput (
1347       [["write_file"; "/new"; "\nnew file contents\n"; "0"];
1348        ["cat"; "/new"]], "\nnew file contents\n");
1349     InitBasicFS, Always, TestOutput (
1350       [["write_file"; "/new"; "\n\n"; "0"];
1351        ["cat"; "/new"]], "\n\n");
1352     InitBasicFS, Always, TestOutput (
1353       [["write_file"; "/new"; ""; "0"];
1354        ["cat"; "/new"]], "");
1355     InitBasicFS, Always, TestOutput (
1356       [["write_file"; "/new"; "\n\n\n"; "0"];
1357        ["cat"; "/new"]], "\n\n\n");
1358     InitBasicFS, Always, TestOutput (
1359       [["write_file"; "/new"; "\n"; "0"];
1360        ["cat"; "/new"]], "\n")],
1361    "create a file",
1362    "\
1363 This call creates a file called C<path>.  The contents of the
1364 file is the string C<content> (which can contain any 8 bit data),
1365 with length C<size>.
1366
1367 As a special case, if C<size> is C<0>
1368 then the length is calculated using C<strlen> (so in this case
1369 the content cannot contain embedded ASCII NULs).
1370
1371 I<NB.> Owing to a bug, writing content containing ASCII NUL
1372 characters does I<not> work, even if the length is specified.
1373 We hope to resolve this bug in a future version.  In the meantime
1374 use C<guestfs_upload>.");
1375
1376   ("umount", (RErr, [String "pathordevice"]), 45, [FishAlias "unmount"],
1377    [InitEmpty, Always, TestOutputListOfDevices (
1378       [["sfdiskM"; "/dev/sda"; ","];
1379        ["mkfs"; "ext2"; "/dev/sda1"];
1380        ["mount"; "/dev/sda1"; "/"];
1381        ["mounts"]], ["/dev/sda1"]);
1382     InitEmpty, Always, TestOutputList (
1383       [["sfdiskM"; "/dev/sda"; ","];
1384        ["mkfs"; "ext2"; "/dev/sda1"];
1385        ["mount"; "/dev/sda1"; "/"];
1386        ["umount"; "/"];
1387        ["mounts"]], [])],
1388    "unmount a filesystem",
1389    "\
1390 This unmounts the given filesystem.  The filesystem may be
1391 specified either by its mountpoint (path) or the device which
1392 contains the filesystem.");
1393
1394   ("mounts", (RStringList "devices", []), 46, [],
1395    [InitBasicFS, Always, TestOutputListOfDevices (
1396       [["mounts"]], ["/dev/sda1"])],
1397    "show mounted filesystems",
1398    "\
1399 This returns the list of currently mounted filesystems.  It returns
1400 the list of devices (eg. C</dev/sda1>, C</dev/VG/LV>).
1401
1402 Some internal mounts are not shown.
1403
1404 See also: C<guestfs_mountpoints>");
1405
1406   ("umount_all", (RErr, []), 47, [FishAlias "unmount-all"],
1407    [InitBasicFS, Always, TestOutputList (
1408       [["umount_all"];
1409        ["mounts"]], []);
1410     (* check that umount_all can unmount nested mounts correctly: *)
1411     InitEmpty, Always, TestOutputList (
1412       [["sfdiskM"; "/dev/sda"; ",100 ,200 ,"];
1413        ["mkfs"; "ext2"; "/dev/sda1"];
1414        ["mkfs"; "ext2"; "/dev/sda2"];
1415        ["mkfs"; "ext2"; "/dev/sda3"];
1416        ["mount"; "/dev/sda1"; "/"];
1417        ["mkdir"; "/mp1"];
1418        ["mount"; "/dev/sda2"; "/mp1"];
1419        ["mkdir"; "/mp1/mp2"];
1420        ["mount"; "/dev/sda3"; "/mp1/mp2"];
1421        ["mkdir"; "/mp1/mp2/mp3"];
1422        ["umount_all"];
1423        ["mounts"]], [])],
1424    "unmount all filesystems",
1425    "\
1426 This unmounts all mounted filesystems.
1427
1428 Some internal mounts are not unmounted by this call.");
1429
1430   ("lvm_remove_all", (RErr, []), 48, [DangerWillRobinson],
1431    [],
1432    "remove all LVM LVs, VGs and PVs",
1433    "\
1434 This command removes all LVM logical volumes, volume groups
1435 and physical volumes.");
1436
1437   ("file", (RString "description", [String "path"]), 49, [],
1438    [InitBasicFS, Always, TestOutput (
1439       [["touch"; "/new"];
1440        ["file"; "/new"]], "empty");
1441     InitBasicFS, Always, TestOutput (
1442       [["write_file"; "/new"; "some content\n"; "0"];
1443        ["file"; "/new"]], "ASCII text");
1444     InitBasicFS, Always, TestLastFail (
1445       [["file"; "/nofile"]])],
1446    "determine file type",
1447    "\
1448 This call uses the standard L<file(1)> command to determine
1449 the type or contents of the file.  This also works on devices,
1450 for example to find out whether a partition contains a filesystem.
1451
1452 The exact command which runs is C<file -bsL path>.  Note in
1453 particular that the filename is not prepended to the output
1454 (the C<-b> option).");
1455
1456   ("command", (RString "output", [StringList "arguments"]), 50, [ProtocolLimitWarning],
1457    [InitBasicFS, Always, TestOutput (
1458       [["upload"; "test-command"; "/test-command"];
1459        ["chmod"; "0o755"; "/test-command"];
1460        ["command"; "/test-command 1"]], "Result1");
1461     InitBasicFS, Always, TestOutput (
1462       [["upload"; "test-command"; "/test-command"];
1463        ["chmod"; "0o755"; "/test-command"];
1464        ["command"; "/test-command 2"]], "Result2\n");
1465     InitBasicFS, Always, TestOutput (
1466       [["upload"; "test-command"; "/test-command"];
1467        ["chmod"; "0o755"; "/test-command"];
1468        ["command"; "/test-command 3"]], "\nResult3");
1469     InitBasicFS, Always, TestOutput (
1470       [["upload"; "test-command"; "/test-command"];
1471        ["chmod"; "0o755"; "/test-command"];
1472        ["command"; "/test-command 4"]], "\nResult4\n");
1473     InitBasicFS, Always, TestOutput (
1474       [["upload"; "test-command"; "/test-command"];
1475        ["chmod"; "0o755"; "/test-command"];
1476        ["command"; "/test-command 5"]], "\nResult5\n\n");
1477     InitBasicFS, Always, TestOutput (
1478       [["upload"; "test-command"; "/test-command"];
1479        ["chmod"; "0o755"; "/test-command"];
1480        ["command"; "/test-command 6"]], "\n\nResult6\n\n");
1481     InitBasicFS, Always, TestOutput (
1482       [["upload"; "test-command"; "/test-command"];
1483        ["chmod"; "0o755"; "/test-command"];
1484        ["command"; "/test-command 7"]], "");
1485     InitBasicFS, Always, TestOutput (
1486       [["upload"; "test-command"; "/test-command"];
1487        ["chmod"; "0o755"; "/test-command"];
1488        ["command"; "/test-command 8"]], "\n");
1489     InitBasicFS, Always, TestOutput (
1490       [["upload"; "test-command"; "/test-command"];
1491        ["chmod"; "0o755"; "/test-command"];
1492        ["command"; "/test-command 9"]], "\n\n");
1493     InitBasicFS, Always, TestOutput (
1494       [["upload"; "test-command"; "/test-command"];
1495        ["chmod"; "0o755"; "/test-command"];
1496        ["command"; "/test-command 10"]], "Result10-1\nResult10-2\n");
1497     InitBasicFS, Always, TestOutput (
1498       [["upload"; "test-command"; "/test-command"];
1499        ["chmod"; "0o755"; "/test-command"];
1500        ["command"; "/test-command 11"]], "Result11-1\nResult11-2");
1501     InitBasicFS, Always, TestLastFail (
1502       [["upload"; "test-command"; "/test-command"];
1503        ["chmod"; "0o755"; "/test-command"];
1504        ["command"; "/test-command"]])],
1505    "run a command from the guest filesystem",
1506    "\
1507 This call runs a command from the guest filesystem.  The
1508 filesystem must be mounted, and must contain a compatible
1509 operating system (ie. something Linux, with the same
1510 or compatible processor architecture).
1511
1512 The single parameter is an argv-style list of arguments.
1513 The first element is the name of the program to run.
1514 Subsequent elements are parameters.  The list must be
1515 non-empty (ie. must contain a program name).  Note that
1516 the command runs directly, and is I<not> invoked via
1517 the shell (see C<guestfs_sh>).
1518
1519 The return value is anything printed to I<stdout> by
1520 the command.
1521
1522 If the command returns a non-zero exit status, then
1523 this function returns an error message.  The error message
1524 string is the content of I<stderr> from the command.
1525
1526 The C<$PATH> environment variable will contain at least
1527 C</usr/bin> and C</bin>.  If you require a program from
1528 another location, you should provide the full path in the
1529 first parameter.
1530
1531 Shared libraries and data files required by the program
1532 must be available on filesystems which are mounted in the
1533 correct places.  It is the caller's responsibility to ensure
1534 all filesystems that are needed are mounted at the right
1535 locations.");
1536
1537   ("command_lines", (RStringList "lines", [StringList "arguments"]), 51, [ProtocolLimitWarning],
1538    [InitBasicFS, Always, TestOutputList (
1539       [["upload"; "test-command"; "/test-command"];
1540        ["chmod"; "0o755"; "/test-command"];
1541        ["command_lines"; "/test-command 1"]], ["Result1"]);
1542     InitBasicFS, Always, TestOutputList (
1543       [["upload"; "test-command"; "/test-command"];
1544        ["chmod"; "0o755"; "/test-command"];
1545        ["command_lines"; "/test-command 2"]], ["Result2"]);
1546     InitBasicFS, Always, TestOutputList (
1547       [["upload"; "test-command"; "/test-command"];
1548        ["chmod"; "0o755"; "/test-command"];
1549        ["command_lines"; "/test-command 3"]], ["";"Result3"]);
1550     InitBasicFS, Always, TestOutputList (
1551       [["upload"; "test-command"; "/test-command"];
1552        ["chmod"; "0o755"; "/test-command"];
1553        ["command_lines"; "/test-command 4"]], ["";"Result4"]);
1554     InitBasicFS, Always, TestOutputList (
1555       [["upload"; "test-command"; "/test-command"];
1556        ["chmod"; "0o755"; "/test-command"];
1557        ["command_lines"; "/test-command 5"]], ["";"Result5";""]);
1558     InitBasicFS, Always, TestOutputList (
1559       [["upload"; "test-command"; "/test-command"];
1560        ["chmod"; "0o755"; "/test-command"];
1561        ["command_lines"; "/test-command 6"]], ["";"";"Result6";""]);
1562     InitBasicFS, Always, TestOutputList (
1563       [["upload"; "test-command"; "/test-command"];
1564        ["chmod"; "0o755"; "/test-command"];
1565        ["command_lines"; "/test-command 7"]], []);
1566     InitBasicFS, Always, TestOutputList (
1567       [["upload"; "test-command"; "/test-command"];
1568        ["chmod"; "0o755"; "/test-command"];
1569        ["command_lines"; "/test-command 8"]], [""]);
1570     InitBasicFS, Always, TestOutputList (
1571       [["upload"; "test-command"; "/test-command"];
1572        ["chmod"; "0o755"; "/test-command"];
1573        ["command_lines"; "/test-command 9"]], ["";""]);
1574     InitBasicFS, Always, TestOutputList (
1575       [["upload"; "test-command"; "/test-command"];
1576        ["chmod"; "0o755"; "/test-command"];
1577        ["command_lines"; "/test-command 10"]], ["Result10-1";"Result10-2"]);
1578     InitBasicFS, Always, TestOutputList (
1579       [["upload"; "test-command"; "/test-command"];
1580        ["chmod"; "0o755"; "/test-command"];
1581        ["command_lines"; "/test-command 11"]], ["Result11-1";"Result11-2"])],
1582    "run a command, returning lines",
1583    "\
1584 This is the same as C<guestfs_command>, but splits the
1585 result into a list of lines.
1586
1587 See also: C<guestfs_sh_lines>");
1588
1589   ("stat", (RStruct ("statbuf", "stat"), [String "path"]), 52, [],
1590    [InitBasicFS, Always, TestOutputStruct (
1591       [["touch"; "/new"];
1592        ["stat"; "/new"]], [CompareWithInt ("size", 0)])],
1593    "get file information",
1594    "\
1595 Returns file information for the given C<path>.
1596
1597 This is the same as the C<stat(2)> system call.");
1598
1599   ("lstat", (RStruct ("statbuf", "stat"), [String "path"]), 53, [],
1600    [InitBasicFS, Always, TestOutputStruct (
1601       [["touch"; "/new"];
1602        ["lstat"; "/new"]], [CompareWithInt ("size", 0)])],
1603    "get file information for a symbolic link",
1604    "\
1605 Returns file information for the given C<path>.
1606
1607 This is the same as C<guestfs_stat> except that if C<path>
1608 is a symbolic link, then the link is stat-ed, not the file it
1609 refers to.
1610
1611 This is the same as the C<lstat(2)> system call.");
1612
1613   ("statvfs", (RStruct ("statbuf", "statvfs"), [String "path"]), 54, [],
1614    [InitBasicFS, Always, TestOutputStruct (
1615       [["statvfs"; "/"]], [CompareWithInt ("namemax", 255);
1616                            CompareWithInt ("bsize", 1024)])],
1617    "get file system statistics",
1618    "\
1619 Returns file system statistics for any mounted file system.
1620 C<path> should be a file or directory in the mounted file system
1621 (typically it is the mount point itself, but it doesn't need to be).
1622
1623 This is the same as the C<statvfs(2)> system call.");
1624
1625   ("tune2fs_l", (RHashtable "superblock", [String "device"]), 55, [],
1626    [], (* XXX test *)
1627    "get ext2/ext3/ext4 superblock details",
1628    "\
1629 This returns the contents of the ext2, ext3 or ext4 filesystem
1630 superblock on C<device>.
1631
1632 It is the same as running C<tune2fs -l device>.  See L<tune2fs(8)>
1633 manpage for more details.  The list of fields returned isn't
1634 clearly defined, and depends on both the version of C<tune2fs>
1635 that libguestfs was built against, and the filesystem itself.");
1636
1637   ("blockdev_setro", (RErr, [String "device"]), 56, [],
1638    [InitEmpty, Always, TestOutputTrue (
1639       [["blockdev_setro"; "/dev/sda"];
1640        ["blockdev_getro"; "/dev/sda"]])],
1641    "set block device to read-only",
1642    "\
1643 Sets the block device named C<device> to read-only.
1644
1645 This uses the L<blockdev(8)> command.");
1646
1647   ("blockdev_setrw", (RErr, [String "device"]), 57, [],
1648    [InitEmpty, Always, TestOutputFalse (
1649       [["blockdev_setrw"; "/dev/sda"];
1650        ["blockdev_getro"; "/dev/sda"]])],
1651    "set block device to read-write",
1652    "\
1653 Sets the block device named C<device> to read-write.
1654
1655 This uses the L<blockdev(8)> command.");
1656
1657   ("blockdev_getro", (RBool "ro", [String "device"]), 58, [],
1658    [InitEmpty, Always, TestOutputTrue (
1659       [["blockdev_setro"; "/dev/sda"];
1660        ["blockdev_getro"; "/dev/sda"]])],
1661    "is block device set to read-only",
1662    "\
1663 Returns a boolean indicating if the block device is read-only
1664 (true if read-only, false if not).
1665
1666 This uses the L<blockdev(8)> command.");
1667
1668   ("blockdev_getss", (RInt "sectorsize", [String "device"]), 59, [],
1669    [InitEmpty, Always, TestOutputInt (
1670       [["blockdev_getss"; "/dev/sda"]], 512)],
1671    "get sectorsize of block device",
1672    "\
1673 This returns the size of sectors on a block device.
1674 Usually 512, but can be larger for modern devices.
1675
1676 (Note, this is not the size in sectors, use C<guestfs_blockdev_getsz>
1677 for that).
1678
1679 This uses the L<blockdev(8)> command.");
1680
1681   ("blockdev_getbsz", (RInt "blocksize", [String "device"]), 60, [],
1682    [InitEmpty, Always, TestOutputInt (
1683       [["blockdev_getbsz"; "/dev/sda"]], 4096)],
1684    "get blocksize of block device",
1685    "\
1686 This returns the block size of a device.
1687
1688 (Note this is different from both I<size in blocks> and
1689 I<filesystem block size>).
1690
1691 This uses the L<blockdev(8)> command.");
1692
1693   ("blockdev_setbsz", (RErr, [String "device"; Int "blocksize"]), 61, [],
1694    [], (* XXX test *)
1695    "set blocksize of block device",
1696    "\
1697 This sets the block size of a device.
1698
1699 (Note this is different from both I<size in blocks> and
1700 I<filesystem block size>).
1701
1702 This uses the L<blockdev(8)> command.");
1703
1704   ("blockdev_getsz", (RInt64 "sizeinsectors", [String "device"]), 62, [],
1705    [InitEmpty, Always, TestOutputInt (
1706       [["blockdev_getsz"; "/dev/sda"]], 1024000)],
1707    "get total size of device in 512-byte sectors",
1708    "\
1709 This returns the size of the device in units of 512-byte sectors
1710 (even if the sectorsize isn't 512 bytes ... weird).
1711
1712 See also C<guestfs_blockdev_getss> for the real sector size of
1713 the device, and C<guestfs_blockdev_getsize64> for the more
1714 useful I<size in bytes>.
1715
1716 This uses the L<blockdev(8)> command.");
1717
1718   ("blockdev_getsize64", (RInt64 "sizeinbytes", [String "device"]), 63, [],
1719    [InitEmpty, Always, TestOutputInt (
1720       [["blockdev_getsize64"; "/dev/sda"]], 524288000)],
1721    "get total size of device in bytes",
1722    "\
1723 This returns the size of the device in bytes.
1724
1725 See also C<guestfs_blockdev_getsz>.
1726
1727 This uses the L<blockdev(8)> command.");
1728
1729   ("blockdev_flushbufs", (RErr, [String "device"]), 64, [],
1730    [InitEmpty, Always, TestRun
1731       [["blockdev_flushbufs"; "/dev/sda"]]],
1732    "flush device buffers",
1733    "\
1734 This tells the kernel to flush internal buffers associated
1735 with C<device>.
1736
1737 This uses the L<blockdev(8)> command.");
1738
1739   ("blockdev_rereadpt", (RErr, [String "device"]), 65, [],
1740    [InitEmpty, Always, TestRun
1741       [["blockdev_rereadpt"; "/dev/sda"]]],
1742    "reread partition table",
1743    "\
1744 Reread the partition table on C<device>.
1745
1746 This uses the L<blockdev(8)> command.");
1747
1748   ("upload", (RErr, [FileIn "filename"; String "remotefilename"]), 66, [],
1749    [InitBasicFS, Always, TestOutput (
1750       (* Pick a file from cwd which isn't likely to change. *)
1751       [["upload"; "../COPYING.LIB"; "/COPYING.LIB"];
1752        ["checksum"; "md5"; "/COPYING.LIB"]], "e3eda01d9815f8d24aae2dbd89b68b06")],
1753    "upload a file from the local machine",
1754    "\
1755 Upload local file C<filename> to C<remotefilename> on the
1756 filesystem.
1757
1758 C<filename> can also be a named pipe.
1759
1760 See also C<guestfs_download>.");
1761
1762   ("download", (RErr, [String "remotefilename"; FileOut "filename"]), 67, [],
1763    [InitBasicFS, Always, TestOutput (
1764       (* Pick a file from cwd which isn't likely to change. *)
1765       [["upload"; "../COPYING.LIB"; "/COPYING.LIB"];
1766        ["download"; "/COPYING.LIB"; "testdownload.tmp"];
1767        ["upload"; "testdownload.tmp"; "/upload"];
1768        ["checksum"; "md5"; "/upload"]], "e3eda01d9815f8d24aae2dbd89b68b06")],
1769    "download a file to the local machine",
1770    "\
1771 Download file C<remotefilename> and save it as C<filename>
1772 on the local machine.
1773
1774 C<filename> can also be a named pipe.
1775
1776 See also C<guestfs_upload>, C<guestfs_cat>.");
1777
1778   ("checksum", (RString "checksum", [String "csumtype"; String "path"]), 68, [],
1779    [InitBasicFS, Always, TestOutput (
1780       [["write_file"; "/new"; "test\n"; "0"];
1781        ["checksum"; "crc"; "/new"]], "935282863");
1782     InitBasicFS, Always, TestLastFail (
1783       [["checksum"; "crc"; "/new"]]);
1784     InitBasicFS, Always, TestOutput (
1785       [["write_file"; "/new"; "test\n"; "0"];
1786        ["checksum"; "md5"; "/new"]], "d8e8fca2dc0f896fd7cb4cb0031ba249");
1787     InitBasicFS, Always, TestOutput (
1788       [["write_file"; "/new"; "test\n"; "0"];
1789        ["checksum"; "sha1"; "/new"]], "4e1243bd22c66e76c2ba9eddc1f91394e57f9f83");
1790     InitBasicFS, Always, TestOutput (
1791       [["write_file"; "/new"; "test\n"; "0"];
1792        ["checksum"; "sha224"; "/new"]], "52f1bf093f4b7588726035c176c0cdb4376cfea53819f1395ac9e6ec");
1793     InitBasicFS, Always, TestOutput (
1794       [["write_file"; "/new"; "test\n"; "0"];
1795        ["checksum"; "sha256"; "/new"]], "f2ca1bb6c7e907d06dafe4687e579fce76b37e4e93b7605022da52e6ccc26fd2");
1796     InitBasicFS, Always, TestOutput (
1797       [["write_file"; "/new"; "test\n"; "0"];
1798        ["checksum"; "sha384"; "/new"]], "109bb6b5b6d5547c1ce03c7a8bd7d8f80c1cb0957f50c4f7fda04692079917e4f9cad52b878f3d8234e1a170b154b72d");
1799     InitBasicFS, Always, TestOutput (
1800       [["write_file"; "/new"; "test\n"; "0"];
1801        ["checksum"; "sha512"; "/new"]], "0e3e75234abc68f4378a86b3f4b32a198ba301845b0cd6e50106e874345700cc6663a86c1ea125dc5e92be17c98f9a0f85ca9d5f595db2012f7cc3571945c123");
1802     InitSquashFS, Always, TestOutput (
1803       [["checksum"; "md5"; "/known-3"]], "46d6ca27ee07cdc6fa99c2e138cc522c")],
1804    "compute MD5, SHAx or CRC checksum of file",
1805    "\
1806 This call computes the MD5, SHAx or CRC checksum of the
1807 file named C<path>.
1808
1809 The type of checksum to compute is given by the C<csumtype>
1810 parameter which must have one of the following values:
1811
1812 =over 4
1813
1814 =item C<crc>
1815
1816 Compute the cyclic redundancy check (CRC) specified by POSIX
1817 for the C<cksum> command.
1818
1819 =item C<md5>
1820
1821 Compute the MD5 hash (using the C<md5sum> program).
1822
1823 =item C<sha1>
1824
1825 Compute the SHA1 hash (using the C<sha1sum> program).
1826
1827 =item C<sha224>
1828
1829 Compute the SHA224 hash (using the C<sha224sum> program).
1830
1831 =item C<sha256>
1832
1833 Compute the SHA256 hash (using the C<sha256sum> program).
1834
1835 =item C<sha384>
1836
1837 Compute the SHA384 hash (using the C<sha384sum> program).
1838
1839 =item C<sha512>
1840
1841 Compute the SHA512 hash (using the C<sha512sum> program).
1842
1843 =back
1844
1845 The checksum is returned as a printable string.");
1846
1847   ("tar_in", (RErr, [FileIn "tarfile"; String "directory"]), 69, [],
1848    [InitBasicFS, Always, TestOutput (
1849       [["tar_in"; "../images/helloworld.tar"; "/"];
1850        ["cat"; "/hello"]], "hello\n")],
1851    "unpack tarfile to directory",
1852    "\
1853 This command uploads and unpacks local file C<tarfile> (an
1854 I<uncompressed> tar file) into C<directory>.
1855
1856 To upload a compressed tarball, use C<guestfs_tgz_in>.");
1857
1858   ("tar_out", (RErr, [String "directory"; FileOut "tarfile"]), 70, [],
1859    [],
1860    "pack directory into tarfile",
1861    "\
1862 This command packs the contents of C<directory> and downloads
1863 it to local file C<tarfile>.
1864
1865 To download a compressed tarball, use C<guestfs_tgz_out>.");
1866
1867   ("tgz_in", (RErr, [FileIn "tarball"; String "directory"]), 71, [],
1868    [InitBasicFS, Always, TestOutput (
1869       [["tgz_in"; "../images/helloworld.tar.gz"; "/"];
1870        ["cat"; "/hello"]], "hello\n")],
1871    "unpack compressed tarball to directory",
1872    "\
1873 This command uploads and unpacks local file C<tarball> (a
1874 I<gzip compressed> tar file) into C<directory>.
1875
1876 To upload an uncompressed tarball, use C<guestfs_tar_in>.");
1877
1878   ("tgz_out", (RErr, [String "directory"; FileOut "tarball"]), 72, [],
1879    [],
1880    "pack directory into compressed tarball",
1881    "\
1882 This command packs the contents of C<directory> and downloads
1883 it to local file C<tarball>.
1884
1885 To download an uncompressed tarball, use C<guestfs_tar_out>.");
1886
1887   ("mount_ro", (RErr, [String "device"; String "mountpoint"]), 73, [],
1888    [InitBasicFS, Always, TestLastFail (
1889       [["umount"; "/"];
1890        ["mount_ro"; "/dev/sda1"; "/"];
1891        ["touch"; "/new"]]);
1892     InitBasicFS, Always, TestOutput (
1893       [["write_file"; "/new"; "data"; "0"];
1894        ["umount"; "/"];
1895        ["mount_ro"; "/dev/sda1"; "/"];
1896        ["cat"; "/new"]], "data")],
1897    "mount a guest disk, read-only",
1898    "\
1899 This is the same as the C<guestfs_mount> command, but it
1900 mounts the filesystem with the read-only (I<-o ro>) flag.");
1901
1902   ("mount_options", (RErr, [String "options"; String "device"; String "mountpoint"]), 74, [],
1903    [],
1904    "mount a guest disk with mount options",
1905    "\
1906 This is the same as the C<guestfs_mount> command, but it
1907 allows you to set the mount options as for the
1908 L<mount(8)> I<-o> flag.");
1909
1910   ("mount_vfs", (RErr, [String "options"; String "vfstype"; String "device"; String "mountpoint"]), 75, [],
1911    [],
1912    "mount a guest disk with mount options and vfstype",
1913    "\
1914 This is the same as the C<guestfs_mount> command, but it
1915 allows you to set both the mount options and the vfstype
1916 as for the L<mount(8)> I<-o> and I<-t> flags.");
1917
1918   ("debug", (RString "result", [String "subcmd"; StringList "extraargs"]), 76, [],
1919    [],
1920    "debugging and internals",
1921    "\
1922 The C<guestfs_debug> command exposes some internals of
1923 C<guestfsd> (the guestfs daemon) that runs inside the
1924 qemu subprocess.
1925
1926 There is no comprehensive help for this command.  You have
1927 to look at the file C<daemon/debug.c> in the libguestfs source
1928 to find out what you can do.");
1929
1930   ("lvremove", (RErr, [String "device"]), 77, [],
1931    [InitEmpty, Always, TestOutputList (
1932       [["sfdiskM"; "/dev/sda"; ","];
1933        ["pvcreate"; "/dev/sda1"];
1934        ["vgcreate"; "VG"; "/dev/sda1"];
1935        ["lvcreate"; "LV1"; "VG"; "50"];
1936        ["lvcreate"; "LV2"; "VG"; "50"];
1937        ["lvremove"; "/dev/VG/LV1"];
1938        ["lvs"]], ["/dev/VG/LV2"]);
1939     InitEmpty, Always, TestOutputList (
1940       [["sfdiskM"; "/dev/sda"; ","];
1941        ["pvcreate"; "/dev/sda1"];
1942        ["vgcreate"; "VG"; "/dev/sda1"];
1943        ["lvcreate"; "LV1"; "VG"; "50"];
1944        ["lvcreate"; "LV2"; "VG"; "50"];
1945        ["lvremove"; "/dev/VG"];
1946        ["lvs"]], []);
1947     InitEmpty, Always, TestOutputList (
1948       [["sfdiskM"; "/dev/sda"; ","];
1949        ["pvcreate"; "/dev/sda1"];
1950        ["vgcreate"; "VG"; "/dev/sda1"];
1951        ["lvcreate"; "LV1"; "VG"; "50"];
1952        ["lvcreate"; "LV2"; "VG"; "50"];
1953        ["lvremove"; "/dev/VG"];
1954        ["vgs"]], ["VG"])],
1955    "remove an LVM logical volume",
1956    "\
1957 Remove an LVM logical volume C<device>, where C<device> is
1958 the path to the LV, such as C</dev/VG/LV>.
1959
1960 You can also remove all LVs in a volume group by specifying
1961 the VG name, C</dev/VG>.");
1962
1963   ("vgremove", (RErr, [String "vgname"]), 78, [],
1964    [InitEmpty, Always, TestOutputList (
1965       [["sfdiskM"; "/dev/sda"; ","];
1966        ["pvcreate"; "/dev/sda1"];
1967        ["vgcreate"; "VG"; "/dev/sda1"];
1968        ["lvcreate"; "LV1"; "VG"; "50"];
1969        ["lvcreate"; "LV2"; "VG"; "50"];
1970        ["vgremove"; "VG"];
1971        ["lvs"]], []);
1972     InitEmpty, Always, TestOutputList (
1973       [["sfdiskM"; "/dev/sda"; ","];
1974        ["pvcreate"; "/dev/sda1"];
1975        ["vgcreate"; "VG"; "/dev/sda1"];
1976        ["lvcreate"; "LV1"; "VG"; "50"];
1977        ["lvcreate"; "LV2"; "VG"; "50"];
1978        ["vgremove"; "VG"];
1979        ["vgs"]], [])],
1980    "remove an LVM volume group",
1981    "\
1982 Remove an LVM volume group C<vgname>, (for example C<VG>).
1983
1984 This also forcibly removes all logical volumes in the volume
1985 group (if any).");
1986
1987   ("pvremove", (RErr, [String "device"]), 79, [],
1988    [InitEmpty, Always, TestOutputListOfDevices (
1989       [["sfdiskM"; "/dev/sda"; ","];
1990        ["pvcreate"; "/dev/sda1"];
1991        ["vgcreate"; "VG"; "/dev/sda1"];
1992        ["lvcreate"; "LV1"; "VG"; "50"];
1993        ["lvcreate"; "LV2"; "VG"; "50"];
1994        ["vgremove"; "VG"];
1995        ["pvremove"; "/dev/sda1"];
1996        ["lvs"]], []);
1997     InitEmpty, Always, TestOutputListOfDevices (
1998       [["sfdiskM"; "/dev/sda"; ","];
1999        ["pvcreate"; "/dev/sda1"];
2000        ["vgcreate"; "VG"; "/dev/sda1"];
2001        ["lvcreate"; "LV1"; "VG"; "50"];
2002        ["lvcreate"; "LV2"; "VG"; "50"];
2003        ["vgremove"; "VG"];
2004        ["pvremove"; "/dev/sda1"];
2005        ["vgs"]], []);
2006     InitEmpty, Always, TestOutputListOfDevices (
2007       [["sfdiskM"; "/dev/sda"; ","];
2008        ["pvcreate"; "/dev/sda1"];
2009        ["vgcreate"; "VG"; "/dev/sda1"];
2010        ["lvcreate"; "LV1"; "VG"; "50"];
2011        ["lvcreate"; "LV2"; "VG"; "50"];
2012        ["vgremove"; "VG"];
2013        ["pvremove"; "/dev/sda1"];
2014        ["pvs"]], [])],
2015    "remove an LVM physical volume",
2016    "\
2017 This wipes a physical volume C<device> so that LVM will no longer
2018 recognise it.
2019
2020 The implementation uses the C<pvremove> command which refuses to
2021 wipe physical volumes that contain any volume groups, so you have
2022 to remove those first.");
2023
2024   ("set_e2label", (RErr, [String "device"; String "label"]), 80, [],
2025    [InitBasicFS, Always, TestOutput (
2026       [["set_e2label"; "/dev/sda1"; "testlabel"];
2027        ["get_e2label"; "/dev/sda1"]], "testlabel")],
2028    "set the ext2/3/4 filesystem label",
2029    "\
2030 This sets the ext2/3/4 filesystem label of the filesystem on
2031 C<device> to C<label>.  Filesystem labels are limited to
2032 16 characters.
2033
2034 You can use either C<guestfs_tune2fs_l> or C<guestfs_get_e2label>
2035 to return the existing label on a filesystem.");
2036
2037   ("get_e2label", (RString "label", [String "device"]), 81, [],
2038    [],
2039    "get the ext2/3/4 filesystem label",
2040    "\
2041 This returns the ext2/3/4 filesystem label of the filesystem on
2042 C<device>.");
2043
2044   ("set_e2uuid", (RErr, [String "device"; String "uuid"]), 82, [],
2045    [InitBasicFS, Always, TestOutput (
2046       [["set_e2uuid"; "/dev/sda1"; "a3a61220-882b-4f61-89f4-cf24dcc7297d"];
2047        ["get_e2uuid"; "/dev/sda1"]], "a3a61220-882b-4f61-89f4-cf24dcc7297d");
2048     InitBasicFS, Always, TestOutput (
2049       [["set_e2uuid"; "/dev/sda1"; "clear"];
2050        ["get_e2uuid"; "/dev/sda1"]], "");
2051     (* We can't predict what UUIDs will be, so just check the commands run. *)
2052     InitBasicFS, Always, TestRun (
2053       [["set_e2uuid"; "/dev/sda1"; "random"]]);
2054     InitBasicFS, Always, TestRun (
2055       [["set_e2uuid"; "/dev/sda1"; "time"]])],
2056    "set the ext2/3/4 filesystem UUID",
2057    "\
2058 This sets the ext2/3/4 filesystem UUID of the filesystem on
2059 C<device> to C<uuid>.  The format of the UUID and alternatives
2060 such as C<clear>, C<random> and C<time> are described in the
2061 L<tune2fs(8)> manpage.
2062
2063 You can use either C<guestfs_tune2fs_l> or C<guestfs_get_e2uuid>
2064 to return the existing UUID of a filesystem.");
2065
2066   ("get_e2uuid", (RString "uuid", [String "device"]), 83, [],
2067    [],
2068    "get the ext2/3/4 filesystem UUID",
2069    "\
2070 This returns the ext2/3/4 filesystem UUID of the filesystem on
2071 C<device>.");
2072
2073   ("fsck", (RInt "status", [String "fstype"; String "device"]), 84, [],
2074    [InitBasicFS, Always, TestOutputInt (
2075       [["umount"; "/dev/sda1"];
2076        ["fsck"; "ext2"; "/dev/sda1"]], 0);
2077     InitBasicFS, Always, TestOutputInt (
2078       [["umount"; "/dev/sda1"];
2079        ["zero"; "/dev/sda1"];
2080        ["fsck"; "ext2"; "/dev/sda1"]], 8)],
2081    "run the filesystem checker",
2082    "\
2083 This runs the filesystem checker (fsck) on C<device> which
2084 should have filesystem type C<fstype>.
2085
2086 The returned integer is the status.  See L<fsck(8)> for the
2087 list of status codes from C<fsck>.
2088
2089 Notes:
2090
2091 =over 4
2092
2093 =item *
2094
2095 Multiple status codes can be summed together.
2096
2097 =item *
2098
2099 A non-zero return code can mean \"success\", for example if
2100 errors have been corrected on the filesystem.
2101
2102 =item *
2103
2104 Checking or repairing NTFS volumes is not supported
2105 (by linux-ntfs).
2106
2107 =back
2108
2109 This command is entirely equivalent to running C<fsck -a -t fstype device>.");
2110
2111   ("zero", (RErr, [String "device"]), 85, [],
2112    [InitBasicFS, Always, TestOutput (
2113       [["umount"; "/dev/sda1"];
2114        ["zero"; "/dev/sda1"];
2115        ["file"; "/dev/sda1"]], "data")],
2116    "write zeroes to the device",
2117    "\
2118 This command writes zeroes over the first few blocks of C<device>.
2119
2120 How many blocks are zeroed isn't specified (but it's I<not> enough
2121 to securely wipe the device).  It should be sufficient to remove
2122 any partition tables, filesystem superblocks and so on.
2123
2124 See also: C<guestfs_scrub_device>.");
2125
2126   ("grub_install", (RErr, [String "root"; String "device"]), 86, [],
2127    (* Test disabled because grub-install incompatible with virtio-blk driver.
2128     * See also: https://bugzilla.redhat.com/show_bug.cgi?id=479760
2129     *)
2130    [InitBasicFS, Disabled, TestOutputTrue (
2131       [["grub_install"; "/"; "/dev/sda1"];
2132        ["is_dir"; "/boot"]])],
2133    "install GRUB",
2134    "\
2135 This command installs GRUB (the Grand Unified Bootloader) on
2136 C<device>, with the root directory being C<root>.");
2137
2138   ("cp", (RErr, [String "src"; String "dest"]), 87, [],
2139    [InitBasicFS, Always, TestOutput (
2140       [["write_file"; "/old"; "file content"; "0"];
2141        ["cp"; "/old"; "/new"];
2142        ["cat"; "/new"]], "file content");
2143     InitBasicFS, Always, TestOutputTrue (
2144       [["write_file"; "/old"; "file content"; "0"];
2145        ["cp"; "/old"; "/new"];
2146        ["is_file"; "/old"]]);
2147     InitBasicFS, Always, TestOutput (
2148       [["write_file"; "/old"; "file content"; "0"];
2149        ["mkdir"; "/dir"];
2150        ["cp"; "/old"; "/dir/new"];
2151        ["cat"; "/dir/new"]], "file content")],
2152    "copy a file",
2153    "\
2154 This copies a file from C<src> to C<dest> where C<dest> is
2155 either a destination filename or destination directory.");
2156
2157   ("cp_a", (RErr, [String "src"; String "dest"]), 88, [],
2158    [InitBasicFS, Always, TestOutput (
2159       [["mkdir"; "/olddir"];
2160        ["mkdir"; "/newdir"];
2161        ["write_file"; "/olddir/file"; "file content"; "0"];
2162        ["cp_a"; "/olddir"; "/newdir"];
2163        ["cat"; "/newdir/olddir/file"]], "file content")],
2164    "copy a file or directory recursively",
2165    "\
2166 This copies a file or directory from C<src> to C<dest>
2167 recursively using the C<cp -a> command.");
2168
2169   ("mv", (RErr, [String "src"; String "dest"]), 89, [],
2170    [InitBasicFS, Always, TestOutput (
2171       [["write_file"; "/old"; "file content"; "0"];
2172        ["mv"; "/old"; "/new"];
2173        ["cat"; "/new"]], "file content");
2174     InitBasicFS, Always, TestOutputFalse (
2175       [["write_file"; "/old"; "file content"; "0"];
2176        ["mv"; "/old"; "/new"];
2177        ["is_file"; "/old"]])],
2178    "move a file",
2179    "\
2180 This moves a file from C<src> to C<dest> where C<dest> is
2181 either a destination filename or destination directory.");
2182
2183   ("drop_caches", (RErr, [Int "whattodrop"]), 90, [],
2184    [InitEmpty, Always, TestRun (
2185       [["drop_caches"; "3"]])],
2186    "drop kernel page cache, dentries and inodes",
2187    "\
2188 This instructs the guest kernel to drop its page cache,
2189 and/or dentries and inode caches.  The parameter C<whattodrop>
2190 tells the kernel what precisely to drop, see
2191 L<http://linux-mm.org/Drop_Caches>
2192
2193 Setting C<whattodrop> to 3 should drop everything.
2194
2195 This automatically calls L<sync(2)> before the operation,
2196 so that the maximum guest memory is freed.");
2197
2198   ("dmesg", (RString "kmsgs", []), 91, [],
2199    [InitEmpty, Always, TestRun (
2200       [["dmesg"]])],
2201    "return kernel messages",
2202    "\
2203 This returns the kernel messages (C<dmesg> output) from
2204 the guest kernel.  This is sometimes useful for extended
2205 debugging of problems.
2206
2207 Another way to get the same information is to enable
2208 verbose messages with C<guestfs_set_verbose> or by setting
2209 the environment variable C<LIBGUESTFS_DEBUG=1> before
2210 running the program.");
2211
2212   ("ping_daemon", (RErr, []), 92, [],
2213    [InitEmpty, Always, TestRun (
2214       [["ping_daemon"]])],
2215    "ping the guest daemon",
2216    "\
2217 This is a test probe into the guestfs daemon running inside
2218 the qemu subprocess.  Calling this function checks that the
2219 daemon responds to the ping message, without affecting the daemon
2220 or attached block device(s) in any other way.");
2221
2222   ("equal", (RBool "equality", [String "file1"; String "file2"]), 93, [],
2223    [InitBasicFS, Always, TestOutputTrue (
2224       [["write_file"; "/file1"; "contents of a file"; "0"];
2225        ["cp"; "/file1"; "/file2"];
2226        ["equal"; "/file1"; "/file2"]]);
2227     InitBasicFS, Always, TestOutputFalse (
2228       [["write_file"; "/file1"; "contents of a file"; "0"];
2229        ["write_file"; "/file2"; "contents of another file"; "0"];
2230        ["equal"; "/file1"; "/file2"]]);
2231     InitBasicFS, Always, TestLastFail (
2232       [["equal"; "/file1"; "/file2"]])],
2233    "test if two files have equal contents",
2234    "\
2235 This compares the two files C<file1> and C<file2> and returns
2236 true if their content is exactly equal, or false otherwise.
2237
2238 The external L<cmp(1)> program is used for the comparison.");
2239
2240   ("strings", (RStringList "stringsout", [String "path"]), 94, [ProtocolLimitWarning],
2241    [InitBasicFS, Always, TestOutputList (
2242       [["write_file"; "/new"; "hello\nworld\n"; "0"];
2243        ["strings"; "/new"]], ["hello"; "world"]);
2244     InitBasicFS, Always, TestOutputList (
2245       [["touch"; "/new"];
2246        ["strings"; "/new"]], [])],
2247    "print the printable strings in a file",
2248    "\
2249 This runs the L<strings(1)> command on a file and returns
2250 the list of printable strings found.");
2251
2252   ("strings_e", (RStringList "stringsout", [String "encoding"; String "path"]), 95, [ProtocolLimitWarning],
2253    [InitBasicFS, Always, TestOutputList (
2254       [["write_file"; "/new"; "hello\nworld\n"; "0"];
2255        ["strings_e"; "b"; "/new"]], []);
2256     InitBasicFS, Disabled, TestOutputList (
2257       [["write_file"; "/new"; "\000h\000e\000l\000l\000o\000\n\000w\000o\000r\000l\000d\000\n"; "24"];
2258        ["strings_e"; "b"; "/new"]], ["hello"; "world"])],
2259    "print the printable strings in a file",
2260    "\
2261 This is like the C<guestfs_strings> command, but allows you to
2262 specify the encoding.
2263
2264 See the L<strings(1)> manpage for the full list of encodings.
2265
2266 Commonly useful encodings are C<l> (lower case L) which will
2267 show strings inside Windows/x86 files.
2268
2269 The returned strings are transcoded to UTF-8.");
2270
2271   ("hexdump", (RString "dump", [String "path"]), 96, [ProtocolLimitWarning],
2272    [InitBasicFS, Always, TestOutput (
2273       [["write_file"; "/new"; "hello\nworld\n"; "12"];
2274        ["hexdump"; "/new"]], "00000000  68 65 6c 6c 6f 0a 77 6f  72 6c 64 0a              |hello.world.|\n0000000c\n");
2275     (* Test for RHBZ#501888c2 regression which caused large hexdump
2276      * commands to segfault.
2277      *)
2278     InitSquashFS, Always, TestRun (
2279       [["hexdump"; "/100krandom"]])],
2280    "dump a file in hexadecimal",
2281    "\
2282 This runs C<hexdump -C> on the given C<path>.  The result is
2283 the human-readable, canonical hex dump of the file.");
2284
2285   ("zerofree", (RErr, [String "device"]), 97, [],
2286    [InitNone, Always, TestOutput (
2287       [["sfdiskM"; "/dev/sda"; ","];
2288        ["mkfs"; "ext3"; "/dev/sda1"];
2289        ["mount"; "/dev/sda1"; "/"];
2290        ["write_file"; "/new"; "test file"; "0"];
2291        ["umount"; "/dev/sda1"];
2292        ["zerofree"; "/dev/sda1"];
2293        ["mount"; "/dev/sda1"; "/"];
2294        ["cat"; "/new"]], "test file")],
2295    "zero unused inodes and disk blocks on ext2/3 filesystem",
2296    "\
2297 This runs the I<zerofree> program on C<device>.  This program
2298 claims to zero unused inodes and disk blocks on an ext2/3
2299 filesystem, thus making it possible to compress the filesystem
2300 more effectively.
2301
2302 You should B<not> run this program if the filesystem is
2303 mounted.
2304
2305 It is possible that using this program can damage the filesystem
2306 or data on the filesystem.");
2307
2308   ("pvresize", (RErr, [String "device"]), 98, [],
2309    [],
2310    "resize an LVM physical volume",
2311    "\
2312 This resizes (expands or shrinks) an existing LVM physical
2313 volume to match the new size of the underlying device.");
2314
2315   ("sfdisk_N", (RErr, [String "device"; Int "partnum";
2316                        Int "cyls"; Int "heads"; Int "sectors";
2317                        String "line"]), 99, [DangerWillRobinson],
2318    [],
2319    "modify a single partition on a block device",
2320    "\
2321 This runs L<sfdisk(8)> option to modify just the single
2322 partition C<n> (note: C<n> counts from 1).
2323
2324 For other parameters, see C<guestfs_sfdisk>.  You should usually
2325 pass C<0> for the cyls/heads/sectors parameters.");
2326
2327   ("sfdisk_l", (RString "partitions", [String "device"]), 100, [],
2328    [],
2329    "display the partition table",
2330    "\
2331 This displays the partition table on C<device>, in the
2332 human-readable output of the L<sfdisk(8)> command.  It is
2333 not intended to be parsed.");
2334
2335   ("sfdisk_kernel_geometry", (RString "partitions", [String "device"]), 101, [],
2336    [],
2337    "display the kernel geometry",
2338    "\
2339 This displays the kernel's idea of the geometry of C<device>.
2340
2341 The result is in human-readable format, and not designed to
2342 be parsed.");
2343
2344   ("sfdisk_disk_geometry", (RString "partitions", [String "device"]), 102, [],
2345    [],
2346    "display the disk geometry from the partition table",
2347    "\
2348 This displays the disk geometry of C<device> read from the
2349 partition table.  Especially in the case where the underlying
2350 block device has been resized, this can be different from the
2351 kernel's idea of the geometry (see C<guestfs_sfdisk_kernel_geometry>).
2352
2353 The result is in human-readable format, and not designed to
2354 be parsed.");
2355
2356   ("vg_activate_all", (RErr, [Bool "activate"]), 103, [],
2357    [],
2358    "activate or deactivate all volume groups",
2359    "\
2360 This command activates or (if C<activate> is false) deactivates
2361 all logical volumes in all volume groups.
2362 If activated, then they are made known to the
2363 kernel, ie. they appear as C</dev/mapper> devices.  If deactivated,
2364 then those devices disappear.
2365
2366 This command is the same as running C<vgchange -a y|n>");
2367
2368   ("vg_activate", (RErr, [Bool "activate"; StringList "volgroups"]), 104, [],
2369    [],
2370    "activate or deactivate some volume groups",
2371    "\
2372 This command activates or (if C<activate> is false) deactivates
2373 all logical volumes in the listed volume groups C<volgroups>.
2374 If activated, then they are made known to the
2375 kernel, ie. they appear as C</dev/mapper> devices.  If deactivated,
2376 then those devices disappear.
2377
2378 This command is the same as running C<vgchange -a y|n volgroups...>
2379
2380 Note that if C<volgroups> is an empty list then B<all> volume groups
2381 are activated or deactivated.");
2382
2383   ("lvresize", (RErr, [String "device"; Int "mbytes"]), 105, [],
2384    [InitNone, Always, TestOutput (
2385       [["sfdiskM"; "/dev/sda"; ","];
2386        ["pvcreate"; "/dev/sda1"];
2387        ["vgcreate"; "VG"; "/dev/sda1"];
2388        ["lvcreate"; "LV"; "VG"; "10"];
2389        ["mkfs"; "ext2"; "/dev/VG/LV"];
2390        ["mount"; "/dev/VG/LV"; "/"];
2391        ["write_file"; "/new"; "test content"; "0"];
2392        ["umount"; "/"];
2393        ["lvresize"; "/dev/VG/LV"; "20"];
2394        ["e2fsck_f"; "/dev/VG/LV"];
2395        ["resize2fs"; "/dev/VG/LV"];
2396        ["mount"; "/dev/VG/LV"; "/"];
2397        ["cat"; "/new"]], "test content")],
2398    "resize an LVM logical volume",
2399    "\
2400 This resizes (expands or shrinks) an existing LVM logical
2401 volume to C<mbytes>.  When reducing, data in the reduced part
2402 is lost.");
2403
2404   ("resize2fs", (RErr, [String "device"]), 106, [],
2405    [], (* lvresize tests this *)
2406    "resize an ext2/ext3 filesystem",
2407    "\
2408 This resizes an ext2 or ext3 filesystem to match the size of
2409 the underlying device.
2410
2411 I<Note:> It is sometimes required that you run C<guestfs_e2fsck_f>
2412 on the C<device> before calling this command.  For unknown reasons
2413 C<resize2fs> sometimes gives an error about this and sometimes not.
2414 In any case, it is always safe to call C<guestfs_e2fsck_f> before
2415 calling this function.");
2416
2417   ("find", (RStringList "names", [String "directory"]), 107, [],
2418    [InitBasicFS, Always, TestOutputList (
2419       [["find"; "/"]], ["lost+found"]);
2420     InitBasicFS, Always, TestOutputList (
2421       [["touch"; "/a"];
2422        ["mkdir"; "/b"];
2423        ["touch"; "/b/c"];
2424        ["find"; "/"]], ["a"; "b"; "b/c"; "lost+found"]);
2425     InitBasicFS, Always, TestOutputList (
2426       [["mkdir_p"; "/a/b/c"];
2427        ["touch"; "/a/b/c/d"];
2428        ["find"; "/a/b/"]], ["c"; "c/d"])],
2429    "find all files and directories",
2430    "\
2431 This command lists out all files and directories, recursively,
2432 starting at C<directory>.  It is essentially equivalent to
2433 running the shell command C<find directory -print> but some
2434 post-processing happens on the output, described below.
2435
2436 This returns a list of strings I<without any prefix>.  Thus
2437 if the directory structure was:
2438
2439  /tmp/a
2440  /tmp/b
2441  /tmp/c/d
2442
2443 then the returned list from C<guestfs_find> C</tmp> would be
2444 4 elements:
2445
2446  a
2447  b
2448  c
2449  c/d
2450
2451 If C<directory> is not a directory, then this command returns
2452 an error.
2453
2454 The returned list is sorted.");
2455
2456   ("e2fsck_f", (RErr, [String "device"]), 108, [],
2457    [], (* lvresize tests this *)
2458    "check an ext2/ext3 filesystem",
2459    "\
2460 This runs C<e2fsck -p -f device>, ie. runs the ext2/ext3
2461 filesystem checker on C<device>, noninteractively (C<-p>),
2462 even if the filesystem appears to be clean (C<-f>).
2463
2464 This command is only needed because of C<guestfs_resize2fs>
2465 (q.v.).  Normally you should use C<guestfs_fsck>.");
2466
2467   ("sleep", (RErr, [Int "secs"]), 109, [],
2468    [InitNone, Always, TestRun (
2469       [["sleep"; "1"]])],
2470    "sleep for some seconds",
2471    "\
2472 Sleep for C<secs> seconds.");
2473
2474   ("ntfs_3g_probe", (RInt "status", [Bool "rw"; String "device"]), 110, [],
2475    [InitNone, Always, TestOutputInt (
2476       [["sfdiskM"; "/dev/sda"; ","];
2477        ["mkfs"; "ntfs"; "/dev/sda1"];
2478        ["ntfs_3g_probe"; "true"; "/dev/sda1"]], 0);
2479     InitNone, Always, TestOutputInt (
2480       [["sfdiskM"; "/dev/sda"; ","];
2481        ["mkfs"; "ext2"; "/dev/sda1"];
2482        ["ntfs_3g_probe"; "true"; "/dev/sda1"]], 12)],
2483    "probe NTFS volume",
2484    "\
2485 This command runs the L<ntfs-3g.probe(8)> command which probes
2486 an NTFS C<device> for mountability.  (Not all NTFS volumes can
2487 be mounted read-write, and some cannot be mounted at all).
2488
2489 C<rw> is a boolean flag.  Set it to true if you want to test
2490 if the volume can be mounted read-write.  Set it to false if
2491 you want to test if the volume can be mounted read-only.
2492
2493 The return value is an integer which C<0> if the operation
2494 would succeed, or some non-zero value documented in the
2495 L<ntfs-3g.probe(8)> manual page.");
2496
2497   ("sh", (RString "output", [String "command"]), 111, [],
2498    [], (* XXX needs tests *)
2499    "run a command via the shell",
2500    "\
2501 This call runs a command from the guest filesystem via the
2502 guest's C</bin/sh>.
2503
2504 This is like C<guestfs_command>, but passes the command to:
2505
2506  /bin/sh -c \"command\"
2507
2508 Depending on the guest's shell, this usually results in
2509 wildcards being expanded, shell expressions being interpolated
2510 and so on.
2511
2512 All the provisos about C<guestfs_command> apply to this call.");
2513
2514   ("sh_lines", (RStringList "lines", [String "command"]), 112, [],
2515    [], (* XXX needs tests *)
2516    "run a command via the shell returning lines",
2517    "\
2518 This is the same as C<guestfs_sh>, but splits the result
2519 into a list of lines.
2520
2521 See also: C<guestfs_command_lines>");
2522
2523   ("glob_expand", (RStringList "paths", [String "pattern"]), 113, [],
2524    [InitBasicFS, Always, TestOutputList (
2525       [["mkdir_p"; "/a/b/c"];
2526        ["touch"; "/a/b/c/d"];
2527        ["touch"; "/a/b/c/e"];
2528        ["glob_expand"; "/a/b/c/*"]], ["/a/b/c/d"; "/a/b/c/e"]);
2529     InitBasicFS, Always, TestOutputList (
2530       [["mkdir_p"; "/a/b/c"];
2531        ["touch"; "/a/b/c/d"];
2532        ["touch"; "/a/b/c/e"];
2533        ["glob_expand"; "/a/*/c/*"]], ["/a/b/c/d"; "/a/b/c/e"]);
2534     InitBasicFS, Always, TestOutputList (
2535       [["mkdir_p"; "/a/b/c"];
2536        ["touch"; "/a/b/c/d"];
2537        ["touch"; "/a/b/c/e"];
2538        ["glob_expand"; "/a/*/x/*"]], [])],
2539    "expand a wildcard path",
2540    "\
2541 This command searches for all the pathnames matching
2542 C<pattern> according to the wildcard expansion rules
2543 used by the shell.
2544
2545 If no paths match, then this returns an empty list
2546 (note: not an error).
2547
2548 It is just a wrapper around the C L<glob(3)> function
2549 with flags C<GLOB_MARK|GLOB_BRACE>.
2550 See that manual page for more details.");
2551
2552   ("scrub_device", (RErr, [String "device"]), 114, [DangerWillRobinson],
2553    [InitNone, Always, TestRun ( (* use /dev/sdc because it's smaller *)
2554       [["scrub_device"; "/dev/sdc"]])],
2555    "scrub (securely wipe) a device",
2556    "\
2557 This command writes patterns over C<device> to make data retrieval
2558 more difficult.
2559
2560 It is an interface to the L<scrub(1)> program.  See that
2561 manual page for more details.");
2562
2563   ("scrub_file", (RErr, [String "file"]), 115, [],
2564    [InitBasicFS, Always, TestRun (
2565       [["write_file"; "/file"; "content"; "0"];
2566        ["scrub_file"; "/file"]])],
2567    "scrub (securely wipe) a file",
2568    "\
2569 This command writes patterns over a file to make data retrieval
2570 more difficult.
2571
2572 The file is I<removed> after scrubbing.
2573
2574 It is an interface to the L<scrub(1)> program.  See that
2575 manual page for more details.");
2576
2577   ("scrub_freespace", (RErr, [String "dir"]), 116, [],
2578    [], (* XXX needs testing *)
2579    "scrub (securely wipe) free space",
2580    "\
2581 This command creates the directory C<dir> and then fills it
2582 with files until the filesystem is full, and scrubs the files
2583 as for C<guestfs_scrub_file>, and deletes them.
2584 The intention is to scrub any free space on the partition
2585 containing C<dir>.
2586
2587 It is an interface to the L<scrub(1)> program.  See that
2588 manual page for more details.");
2589
2590   ("mkdtemp", (RString "dir", [String "template"]), 117, [],
2591    [InitBasicFS, Always, TestRun (
2592       [["mkdir"; "/tmp"];
2593        ["mkdtemp"; "/tmp/tmpXXXXXX"]])],
2594    "create a temporary directory",
2595    "\
2596 This command creates a temporary directory.  The
2597 C<template> parameter should be a full pathname for the
2598 temporary directory name with the final six characters being
2599 \"XXXXXX\".
2600
2601 For example: \"/tmp/myprogXXXXXX\" or \"/Temp/myprogXXXXXX\",
2602 the second one being suitable for Windows filesystems.
2603
2604 The name of the temporary directory that was created
2605 is returned.
2606
2607 The temporary directory is created with mode 0700
2608 and is owned by root.
2609
2610 The caller is responsible for deleting the temporary
2611 directory and its contents after use.
2612
2613 See also: L<mkdtemp(3)>");
2614
2615   ("wc_l", (RInt "lines", [String "path"]), 118, [],
2616    [InitSquashFS, Always, TestOutputInt (
2617       [["wc_l"; "/10klines"]], 10000)],
2618    "count lines in a file",
2619    "\
2620 This command counts the lines in a file, using the
2621 C<wc -l> external command.");
2622
2623   ("wc_w", (RInt "words", [String "path"]), 119, [],
2624    [InitSquashFS, Always, TestOutputInt (
2625       [["wc_w"; "/10klines"]], 10000)],
2626    "count words in a file",
2627    "\
2628 This command counts the words in a file, using the
2629 C<wc -w> external command.");
2630
2631   ("wc_c", (RInt "chars", [String "path"]), 120, [],
2632    [InitSquashFS, Always, TestOutputInt (
2633       [["wc_c"; "/100kallspaces"]], 102400)],
2634    "count characters in a file",
2635    "\
2636 This command counts the characters in a file, using the
2637 C<wc -c> external command.");
2638
2639   ("head", (RStringList "lines", [String "path"]), 121, [ProtocolLimitWarning],
2640    [InitSquashFS, Always, TestOutputList (
2641       [["head"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz";"3abcdefghijklmnopqrstuvwxyz";"4abcdefghijklmnopqrstuvwxyz";"5abcdefghijklmnopqrstuvwxyz";"6abcdefghijklmnopqrstuvwxyz";"7abcdefghijklmnopqrstuvwxyz";"8abcdefghijklmnopqrstuvwxyz";"9abcdefghijklmnopqrstuvwxyz"])],
2642    "return first 10 lines of a file",
2643    "\
2644 This command returns up to the first 10 lines of a file as
2645 a list of strings.");
2646
2647   ("head_n", (RStringList "lines", [Int "nrlines"; String "path"]), 122, [ProtocolLimitWarning],
2648    [InitSquashFS, Always, TestOutputList (
2649       [["head_n"; "3"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz"]);
2650     InitSquashFS, Always, TestOutputList (
2651       [["head_n"; "-9997"; "/10klines"]], ["0abcdefghijklmnopqrstuvwxyz";"1abcdefghijklmnopqrstuvwxyz";"2abcdefghijklmnopqrstuvwxyz"]);
2652     InitSquashFS, Always, TestOutputList (
2653       [["head_n"; "0"; "/10klines"]], [])],
2654    "return first N lines of a file",
2655    "\
2656 If the parameter C<nrlines> is a positive number, this returns the first
2657 C<nrlines> lines of the file C<path>.
2658
2659 If the parameter C<nrlines> is a negative number, this returns lines
2660 from the file C<path>, excluding the last C<nrlines> lines.
2661
2662 If the parameter C<nrlines> is zero, this returns an empty list.");
2663
2664   ("tail", (RStringList "lines", [String "path"]), 123, [ProtocolLimitWarning],
2665    [InitSquashFS, Always, TestOutputList (
2666       [["tail"; "/10klines"]], ["9990abcdefghijklmnopqrstuvwxyz";"9991abcdefghijklmnopqrstuvwxyz";"9992abcdefghijklmnopqrstuvwxyz";"9993abcdefghijklmnopqrstuvwxyz";"9994abcdefghijklmnopqrstuvwxyz";"9995abcdefghijklmnopqrstuvwxyz";"9996abcdefghijklmnopqrstuvwxyz";"9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"])],
2667    "return last 10 lines of a file",
2668    "\
2669 This command returns up to the last 10 lines of a file as
2670 a list of strings.");
2671
2672   ("tail_n", (RStringList "lines", [Int "nrlines"; String "path"]), 124, [ProtocolLimitWarning],
2673    [InitSquashFS, Always, TestOutputList (
2674       [["tail_n"; "3"; "/10klines"]], ["9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"]);
2675     InitSquashFS, Always, TestOutputList (
2676       [["tail_n"; "-9998"; "/10klines"]], ["9997abcdefghijklmnopqrstuvwxyz";"9998abcdefghijklmnopqrstuvwxyz";"9999abcdefghijklmnopqrstuvwxyz"]);
2677     InitSquashFS, Always, TestOutputList (
2678       [["tail_n"; "0"; "/10klines"]], [])],
2679    "return last N lines of a file",
2680    "\
2681 If the parameter C<nrlines> is a positive number, this returns the last
2682 C<nrlines> lines of the file C<path>.
2683
2684 If the parameter C<nrlines> is a negative number, this returns lines
2685 from the file C<path>, starting with the C<-nrlines>th line.
2686
2687 If the parameter C<nrlines> is zero, this returns an empty list.");
2688
2689   ("df", (RString "output", []), 125, [],
2690    [], (* XXX Tricky to test because it depends on the exact format
2691         * of the 'df' command and other imponderables.
2692         *)
2693    "report file system disk space usage",
2694    "\
2695 This command runs the C<df> command to report disk space used.
2696
2697 This command is mostly useful for interactive sessions.  It
2698 is I<not> intended that you try to parse the output string.
2699 Use C<statvfs> from programs.");
2700
2701   ("df_h", (RString "output", []), 126, [],
2702    [], (* XXX Tricky to test because it depends on the exact format
2703         * of the 'df' command and other imponderables.
2704         *)
2705    "report file system disk space usage (human readable)",
2706    "\
2707 This command runs the C<df -h> command to report disk space used
2708 in human-readable format.
2709
2710 This command is mostly useful for interactive sessions.  It
2711 is I<not> intended that you try to parse the output string.
2712 Use C<statvfs> from programs.");
2713
2714   ("du", (RInt64 "sizekb", [String "path"]), 127, [],
2715    [InitBasicFS, Always, TestOutputInt (
2716       [["mkdir"; "/p"];
2717        ["du"; "/p"]], 1 (* ie. 1 block, so depends on ext3 blocksize *))],
2718    "estimate file space usage",
2719    "\
2720 This command runs the C<du -s> command to estimate file space
2721 usage for C<path>.
2722
2723 C<path> can be a file or a directory.  If C<path> is a directory
2724 then the estimate includes the contents of the directory and all
2725 subdirectories (recursively).
2726
2727 The result is the estimated size in I<kilobytes>
2728 (ie. units of 1024 bytes).");
2729
2730   ("initrd_list", (RStringList "filenames", [String "path"]), 128, [],
2731    [InitSquashFS, Always, TestOutputList (
2732       [["initrd_list"; "/initrd"]], ["empty";"known-1";"known-2";"known-3"])],
2733    "list files in an initrd",
2734    "\
2735 This command lists out files contained in an initrd.
2736
2737 The files are listed without any initial C</> character.  The
2738 files are listed in the order they appear (not necessarily
2739 alphabetical).  Directory names are listed as separate items.
2740
2741 Old Linux kernels (2.4 and earlier) used a compressed ext2
2742 filesystem as initrd.  We I<only> support the newer initramfs
2743 format (compressed cpio files).");
2744
2745   ("mount_loop", (RErr, [String "file"; String "mountpoint"]), 129, [],
2746    [],
2747    "mount a file using the loop device",
2748    "\
2749 This command lets you mount C<file> (a filesystem image
2750 in a file) on a mount point.  It is entirely equivalent to
2751 the command C<mount -o loop file mountpoint>.");
2752
2753   ("mkswap", (RErr, [String "device"]), 130, [],
2754    [InitEmpty, Always, TestRun (
2755       [["sfdiskM"; "/dev/sda"; ","];
2756        ["mkswap"; "/dev/sda1"]])],
2757    "create a swap partition",
2758    "\
2759 Create a swap partition on C<device>.");
2760
2761   ("mkswap_L", (RErr, [String "label"; String "device"]), 131, [],
2762    [InitEmpty, Always, TestRun (
2763       [["sfdiskM"; "/dev/sda"; ","];
2764        ["mkswap_L"; "hello"; "/dev/sda1"]])],
2765    "create a swap partition with a label",
2766    "\
2767 Create a swap partition on C<device> with label C<label>.");
2768
2769   ("mkswap_U", (RErr, [String "uuid"; String "device"]), 132, [],
2770    [InitEmpty, Always, TestRun (
2771       [["sfdiskM"; "/dev/sda"; ","];
2772        ["mkswap_U"; "a3a61220-882b-4f61-89f4-cf24dcc7297d"; "/dev/sda1"]])],
2773    "create a swap partition with an explicit UUID",
2774    "\
2775 Create a swap partition on C<device> with UUID C<uuid>.");
2776
2777   ("mknod", (RErr, [Int "mode"; Int "devmajor"; Int "devminor"; String "path"]), 133, [],
2778    [InitBasicFS, Always, TestOutputStruct (
2779       [["mknod"; "0o10777"; "0"; "0"; "/node"];
2780        (* NB: default umask 022 means 0777 -> 0755 in these tests *)
2781        ["stat"; "/node"]], [CompareWithInt ("mode", 0o10755)]);
2782     InitBasicFS, Always, TestOutputStruct (
2783       [["mknod"; "0o60777"; "66"; "99"; "/node"];
2784        ["stat"; "/node"]], [CompareWithInt ("mode", 0o60755)])],
2785    "make block, character or FIFO devices",
2786    "\
2787 This call creates block or character special devices, or
2788 named pipes (FIFOs).
2789
2790 The C<mode> parameter should be the mode, using the standard
2791 constants.  C<devmajor> and C<devminor> are the
2792 device major and minor numbers, only used when creating block
2793 and character special devices.");
2794
2795   ("mkfifo", (RErr, [Int "mode"; String "path"]), 134, [],
2796    [InitBasicFS, Always, TestOutputStruct (
2797       [["mkfifo"; "0o777"; "/node"];
2798        ["stat"; "/node"]], [CompareWithInt ("mode", 0o10755)])],
2799    "make FIFO (named pipe)",
2800    "\
2801 This call creates a FIFO (named pipe) called C<path> with
2802 mode C<mode>.  It is just a convenient wrapper around
2803 C<guestfs_mknod>.");
2804
2805   ("mknod_b", (RErr, [Int "mode"; Int "devmajor"; Int "devminor"; String "path"]), 135, [],
2806    [InitBasicFS, Always, TestOutputStruct (
2807       [["mknod_b"; "0o777"; "99"; "66"; "/node"];
2808        ["stat"; "/node"]], [CompareWithInt ("mode", 0o60755)])],
2809    "make block device node",
2810    "\
2811 This call creates a block device node called C<path> with
2812 mode C<mode> and device major/minor C<devmajor> and C<devminor>.
2813 It is just a convenient wrapper around C<guestfs_mknod>.");
2814
2815   ("mknod_c", (RErr, [Int "mode"; Int "devmajor"; Int "devminor"; String "path"]), 136, [],
2816    [InitBasicFS, Always, TestOutputStruct (
2817       [["mknod_c"; "0o777"; "99"; "66"; "/node"];
2818        ["stat"; "/node"]], [CompareWithInt ("mode", 0o20755)])],
2819    "make char device node",
2820    "\
2821 This call creates a char device node called C<path> with
2822 mode C<mode> and device major/minor C<devmajor> and C<devminor>.
2823 It is just a convenient wrapper around C<guestfs_mknod>.");
2824
2825   ("umask", (RInt "oldmask", [Int "mask"]), 137, [],
2826    [], (* XXX umask is one of those stateful things that we should
2827         * reset between each test.
2828         *)
2829    "set file mode creation mask (umask)",
2830    "\
2831 This function sets the mask used for creating new files and
2832 device nodes to C<mask & 0777>.
2833
2834 Typical umask values would be C<022> which creates new files
2835 with permissions like \"-rw-r--r--\" or \"-rwxr-xr-x\", and
2836 C<002> which creates new files with permissions like
2837 \"-rw-rw-r--\" or \"-rwxrwxr-x\".
2838
2839 The default umask is C<022>.  This is important because it
2840 means that directories and device nodes will be created with
2841 C<0644> or C<0755> mode even if you specify C<0777>.
2842
2843 See also L<umask(2)>, C<guestfs_mknod>, C<guestfs_mkdir>.
2844
2845 This call returns the previous umask.");
2846
2847   ("readdir", (RStructList ("entries", "dirent"), [String "dir"]), 138, [],
2848    [],
2849    "read directories entries",
2850    "\
2851 This returns the list of directory entries in directory C<dir>.
2852
2853 All entries in the directory are returned, including C<.> and
2854 C<..>.  The entries are I<not> sorted, but returned in the same
2855 order as the underlying filesystem.
2856
2857 Also this call returns basic file type information about each
2858 file.  The C<ftyp> field will contain one of the following characters:
2859
2860 =over 4
2861
2862 =item 'b'
2863
2864 Block special
2865
2866 =item 'c'
2867
2868 Char special
2869
2870 =item 'd'
2871
2872 Directory
2873
2874 =item 'f'
2875
2876 FIFO (named pipe)
2877
2878 =item 'l'
2879
2880 Symbolic link
2881
2882 =item 'r'
2883
2884 Regular file
2885
2886 =item 's'
2887
2888 Socket
2889
2890 =item 'u'
2891
2892 Unknown file type
2893
2894 =item '?'
2895
2896 The L<readdir(3)> returned a C<d_type> field with an
2897 unexpected value
2898
2899 =back
2900
2901 This function is primarily intended for use by programs.  To
2902 get a simple list of names, use C<guestfs_ls>.  To get a printable
2903 directory for human consumption, use C<guestfs_ll>.");
2904
2905   ("sfdiskM", (RErr, [String "device"; StringList "lines"]), 139, [DangerWillRobinson],
2906    [],
2907    "create partitions on a block device",
2908    "\
2909 This is a simplified interface to the C<guestfs_sfdisk>
2910 command, where partition sizes are specified in megabytes
2911 only (rounded to the nearest cylinder) and you don't need
2912 to specify the cyls, heads and sectors parameters which
2913 were rarely if ever used anyway.
2914
2915 See also C<guestfs_sfdisk> and the L<sfdisk(8)> manpage.");
2916
2917   ("zfile", (RString "description", [String "method"; String "path"]), 140, [],
2918    [],
2919    "determine file type inside a compressed file",
2920    "\
2921 This command runs C<file> after first decompressing C<path>
2922 using C<method>.
2923
2924 C<method> must be one of C<gzip>, C<compress> or C<bzip2>.
2925
2926 See also: C<guestfs_file>");
2927
2928   ("getxattrs", (RStructList ("xattrs", "xattr"), [String "path"]), 141, [],
2929    [],
2930    "list extended attributes of a file or directory",
2931    "\
2932 This call lists the extended attributes of the file or directory
2933 C<path>.
2934
2935 At the system call level, this is a combination of the
2936 L<listxattr(2)> and L<getxattr(2)> calls.
2937
2938 See also: C<guestfs_lgetxattrs>, L<attr(5)>.");
2939
2940   ("lgetxattrs", (RStructList ("xattrs", "xattr"), [String "path"]), 142, [],
2941    [],
2942    "list extended attributes of a file or directory",
2943    "\
2944 This is the same as C<guestfs_getxattrs>, but if C<path>
2945 is a symbolic link, then it returns the extended attributes
2946 of the link itself.");
2947
2948   ("setxattr", (RErr, [String "xattr";
2949                        String "val"; Int "vallen"; (* will be BufferIn *)
2950                        String "path"]), 143, [],
2951    [],
2952    "set extended attribute of a file or directory",
2953    "\
2954 This call sets the extended attribute named C<xattr>
2955 of the file C<path> to the value C<val> (of length C<vallen>).
2956 The value is arbitrary 8 bit data.
2957
2958 See also: C<guestfs_lsetxattr>, L<attr(5)>.");
2959
2960   ("lsetxattr", (RErr, [String "xattr";
2961                         String "val"; Int "vallen"; (* will be BufferIn *)
2962                         String "path"]), 144, [],
2963    [],
2964    "set extended attribute of a file or directory",
2965    "\
2966 This is the same as C<guestfs_setxattr>, but if C<path>
2967 is a symbolic link, then it sets an extended attribute
2968 of the link itself.");
2969
2970   ("removexattr", (RErr, [String "xattr"; String "path"]), 145, [],
2971    [],
2972    "remove extended attribute of a file or directory",
2973    "\
2974 This call removes the extended attribute named C<xattr>
2975 of the file C<path>.
2976
2977 See also: C<guestfs_lremovexattr>, L<attr(5)>.");
2978
2979   ("lremovexattr", (RErr, [String "xattr"; String "path"]), 146, [],
2980    [],
2981    "remove extended attribute of a file or directory",
2982    "\
2983 This is the same as C<guestfs_removexattr>, but if C<path>
2984 is a symbolic link, then it removes an extended attribute
2985 of the link itself.");
2986
2987   ("mountpoints", (RHashtable "mps", []), 147, [],
2988    [],
2989    "show mountpoints",
2990    "\
2991 This call is similar to C<guestfs_mounts>.  That call returns
2992 a list of devices.  This one returns a hash table (map) of
2993 device name to directory where the device is mounted.");
2994
2995   ("mkmountpoint", (RErr, [String "path"]), 148, [],
2996    [],
2997    "create a mountpoint",
2998    "\
2999 C<guestfs_mkmountpoint> and C<guestfs_rmmountpoint> are
3000 specialized calls that can be used to create extra mountpoints
3001 before mounting the first filesystem.
3002
3003 These calls are I<only> necessary in some very limited circumstances,
3004 mainly the case where you want to mount a mix of unrelated and/or
3005 read-only filesystems together.
3006
3007 For example, live CDs often contain a \"Russian doll\" nest of
3008 filesystems, an ISO outer layer, with a squashfs image inside, with
3009 an ext2/3 image inside that.  You can unpack this as follows
3010 in guestfish:
3011
3012  add-ro Fedora-11-i686-Live.iso
3013  run
3014  mkmountpoint /cd
3015  mkmountpoint /squash
3016  mkmountpoint /ext3
3017  mount /dev/sda /cd
3018  mount-loop /cd/LiveOS/squashfs.img /squash
3019  mount-loop /squash/LiveOS/ext3fs.img /ext3
3020
3021 The inner filesystem is now unpacked under the /ext3 mountpoint.");
3022
3023   ("rmmountpoint", (RErr, [String "path"]), 149, [],
3024    [],
3025    "remove a mountpoint",
3026    "\
3027 This calls removes a mountpoint that was previously created
3028 with C<guestfs_mkmountpoint>.  See C<guestfs_mkmountpoint>
3029 for full details.");
3030
3031   ("read_file", (RBufferOut "content", [String "path"]), 150, [ProtocolLimitWarning],
3032    [InitBasicFS, Always, TestOutput (
3033       [["write_file"; "/new"; "new file contents"; "0"];
3034        ["read_file"; "/new"]], "new file contents")],
3035    "read a file",
3036    "\
3037 This calls returns the contents of the file C<path> as a
3038 buffer.
3039
3040 Unlike C<guestfs_cat>, this function can correctly
3041 handle files that contain embedded ASCII NUL characters.
3042 However unlike C<guestfs_download>, this function is limited
3043 in the total size of file that can be handled.");
3044
3045 ]
3046
3047 let all_functions = non_daemon_functions @ daemon_functions
3048
3049 (* In some places we want the functions to be displayed sorted
3050  * alphabetically, so this is useful:
3051  *)
3052 let all_functions_sorted =
3053   List.sort (fun (n1,_,_,_,_,_,_) (n2,_,_,_,_,_,_) ->
3054                compare n1 n2) all_functions
3055
3056 (* Field types for structures. *)
3057 type field =
3058   | FChar                       (* C 'char' (really, a 7 bit byte). *)
3059   | FString                     (* nul-terminated ASCII string. *)
3060   | FBuffer                     (* opaque buffer of bytes, (char *, int) pair *)
3061   | FUInt32
3062   | FInt32
3063   | FUInt64
3064   | FInt64
3065   | FBytes                      (* Any int measure that counts bytes. *)
3066   | FUUID                       (* 32 bytes long, NOT nul-terminated. *)
3067   | FOptPercent                 (* [0..100], or -1 meaning "not present". *)
3068
3069 (* Because we generate extra parsing code for LVM command line tools,
3070  * we have to pull out the LVM columns separately here.
3071  *)
3072 let lvm_pv_cols = [
3073   "pv_name", FString;
3074   "pv_uuid", FUUID;
3075   "pv_fmt", FString;
3076   "pv_size", FBytes;
3077   "dev_size", FBytes;
3078   "pv_free", FBytes;
3079   "pv_used", FBytes;
3080   "pv_attr", FString (* XXX *);
3081   "pv_pe_count", FInt64;
3082   "pv_pe_alloc_count", FInt64;
3083   "pv_tags", FString;
3084   "pe_start", FBytes;
3085   "pv_mda_count", FInt64;
3086   "pv_mda_free", FBytes;
3087   (* Not in Fedora 10:
3088      "pv_mda_size", FBytes;
3089   *)
3090 ]
3091 let lvm_vg_cols = [
3092   "vg_name", FString;
3093   "vg_uuid", FUUID;
3094   "vg_fmt", FString;
3095   "vg_attr", FString (* XXX *);
3096   "vg_size", FBytes;
3097   "vg_free", FBytes;
3098   "vg_sysid", FString;
3099   "vg_extent_size", FBytes;
3100   "vg_extent_count", FInt64;
3101   "vg_free_count", FInt64;
3102   "max_lv", FInt64;
3103   "max_pv", FInt64;
3104   "pv_count", FInt64;
3105   "lv_count", FInt64;
3106   "snap_count", FInt64;
3107   "vg_seqno", FInt64;
3108   "vg_tags", FString;
3109   "vg_mda_count", FInt64;
3110   "vg_mda_free", FBytes;
3111   (* Not in Fedora 10:
3112      "vg_mda_size", FBytes;
3113   *)
3114 ]
3115 let lvm_lv_cols = [
3116   "lv_name", FString;
3117   "lv_uuid", FUUID;
3118   "lv_attr", FString (* XXX *);
3119   "lv_major", FInt64;
3120   "lv_minor", FInt64;
3121   "lv_kernel_major", FInt64;
3122   "lv_kernel_minor", FInt64;
3123   "lv_size", FBytes;
3124   "seg_count", FInt64;
3125   "origin", FString;
3126   "snap_percent", FOptPercent;
3127   "copy_percent", FOptPercent;
3128   "move_pv", FString;
3129   "lv_tags", FString;
3130   "mirror_log", FString;
3131   "modules", FString;
3132 ]
3133
3134 (* Names and fields in all structures (in RStruct and RStructList)
3135  * that we support.
3136  *)
3137 let structs = [
3138   (* The old RIntBool return type, only ever used for aug_defnode.  Do
3139    * not use this struct in any new code.
3140    *)
3141   "int_bool", [
3142     "i", FInt32;                (* for historical compatibility *)
3143     "b", FInt32;                (* for historical compatibility *)
3144   ];
3145
3146   (* LVM PVs, VGs, LVs. *)
3147   "lvm_pv", lvm_pv_cols;
3148   "lvm_vg", lvm_vg_cols;
3149   "lvm_lv", lvm_lv_cols;
3150
3151   (* Column names and types from stat structures.
3152    * NB. Can't use things like 'st_atime' because glibc header files
3153    * define some of these as macros.  Ugh.
3154    *)
3155   "stat", [
3156     "dev", FInt64;
3157     "ino", FInt64;
3158     "mode", FInt64;
3159     "nlink", FInt64;
3160     "uid", FInt64;
3161     "gid", FInt64;
3162     "rdev", FInt64;
3163     "size", FInt64;
3164     "blksize", FInt64;
3165     "blocks", FInt64;
3166     "atime", FInt64;
3167     "mtime", FInt64;
3168     "ctime", FInt64;
3169   ];
3170   "statvfs", [
3171     "bsize", FInt64;
3172     "frsize", FInt64;
3173     "blocks", FInt64;
3174     "bfree", FInt64;
3175     "bavail", FInt64;
3176     "files", FInt64;
3177     "ffree", FInt64;
3178     "favail", FInt64;
3179     "fsid", FInt64;
3180     "flag", FInt64;
3181     "namemax", FInt64;
3182   ];
3183
3184   (* Column names in dirent structure. *)
3185   "dirent", [
3186     "ino", FInt64;
3187     (* 'b' 'c' 'd' 'f' (FIFO) 'l' 'r' (regular file) 's' 'u' '?' *)
3188     "ftyp", FChar;
3189     "name", FString;
3190   ];
3191
3192   (* Version numbers. *)
3193   "version", [
3194     "major", FInt64;
3195     "minor", FInt64;
3196     "release", FInt64;
3197     "extra", FString;
3198   ];
3199
3200   (* Extended attribute. *)
3201   "xattr", [
3202     "attrname", FString;
3203     "attrval", FBuffer;
3204   ];
3205 ] (* end of structs *)
3206
3207 (* Ugh, Java has to be different ..
3208  * These names are also used by the Haskell bindings.
3209  *)
3210 let java_structs = [
3211   "int_bool", "IntBool";
3212   "lvm_pv", "PV";
3213   "lvm_vg", "VG";
3214   "lvm_lv", "LV";
3215   "stat", "Stat";
3216   "statvfs", "StatVFS";
3217   "dirent", "Dirent";
3218   "version", "Version";
3219   "xattr", "XAttr";
3220 ]
3221
3222 (* Used for testing language bindings. *)
3223 type callt =
3224   | CallString of string
3225   | CallOptString of string option
3226   | CallStringList of string list
3227   | CallInt of int
3228   | CallBool of bool
3229
3230 (* Used to memoize the result of pod2text. *)
3231 let pod2text_memo_filename = "src/.pod2text.data"
3232 let pod2text_memo : ((int * string * string), string list) Hashtbl.t =
3233   try
3234     let chan = open_in pod2text_memo_filename in
3235     let v = input_value chan in
3236     close_in chan;
3237     v
3238   with
3239     _ -> Hashtbl.create 13
3240
3241 (* Useful functions.
3242  * Note we don't want to use any external OCaml libraries which
3243  * makes this a bit harder than it should be.
3244  *)
3245 let failwithf fs = ksprintf failwith fs
3246
3247 let replace_char s c1 c2 =
3248   let s2 = String.copy s in
3249   let r = ref false in
3250   for i = 0 to String.length s2 - 1 do
3251     if String.unsafe_get s2 i = c1 then (
3252       String.unsafe_set s2 i c2;
3253       r := true
3254     )
3255   done;
3256   if not !r then s else s2
3257
3258 let isspace c =
3259   c = ' '
3260   (* || c = '\f' *) || c = '\n' || c = '\r' || c = '\t' (* || c = '\v' *)
3261
3262 let triml ?(test = isspace) str =
3263   let i = ref 0 in
3264   let n = ref (String.length str) in
3265   while !n > 0 && test str.[!i]; do
3266     decr n;
3267     incr i
3268   done;
3269   if !i = 0 then str
3270   else String.sub str !i !n
3271
3272 let trimr ?(test = isspace) str =
3273   let n = ref (String.length str) in
3274   while !n > 0 && test str.[!n-1]; do
3275     decr n
3276   done;
3277   if !n = String.length str then str
3278   else String.sub str 0 !n
3279
3280 let trim ?(test = isspace) str =
3281   trimr ~test (triml ~test str)
3282
3283 let rec find s sub =
3284   let len = String.length s in
3285   let sublen = String.length sub in
3286   let rec loop i =
3287     if i <= len-sublen then (
3288       let rec loop2 j =
3289         if j < sublen then (
3290           if s.[i+j] = sub.[j] then loop2 (j+1)
3291           else -1
3292         ) else
3293           i (* found *)
3294       in
3295       let r = loop2 0 in
3296       if r = -1 then loop (i+1) else r
3297     ) else
3298       -1 (* not found *)
3299   in
3300   loop 0
3301
3302 let rec replace_str s s1 s2 =
3303   let len = String.length s in
3304   let sublen = String.length s1 in
3305   let i = find s s1 in
3306   if i = -1 then s
3307   else (
3308     let s' = String.sub s 0 i in
3309     let s'' = String.sub s (i+sublen) (len-i-sublen) in
3310     s' ^ s2 ^ replace_str s'' s1 s2
3311   )
3312
3313 let rec string_split sep str =
3314   let len = String.length str in
3315   let seplen = String.length sep in
3316   let i = find str sep in
3317   if i = -1 then [str]
3318   else (
3319     let s' = String.sub str 0 i in
3320     let s'' = String.sub str (i+seplen) (len-i-seplen) in
3321     s' :: string_split sep s''
3322   )
3323
3324 let files_equal n1 n2 =
3325   let cmd = sprintf "cmp -s %s %s" (Filename.quote n1) (Filename.quote n2) in
3326   match Sys.command cmd with
3327   | 0 -> true
3328   | 1 -> false
3329   | i -> failwithf "%s: failed with error code %d" cmd i
3330
3331 let rec find_map f = function
3332   | [] -> raise Not_found
3333   | x :: xs ->
3334       match f x with
3335       | Some y -> y
3336       | None -> find_map f xs
3337
3338 let iteri f xs =
3339   let rec loop i = function
3340     | [] -> ()
3341     | x :: xs -> f i x; loop (i+1) xs
3342   in
3343   loop 0 xs
3344
3345 let mapi f xs =
3346   let rec loop i = function
3347     | [] -> []
3348     | x :: xs -> let r = f i x in r :: loop (i+1) xs
3349   in
3350   loop 0 xs
3351
3352 let name_of_argt = function
3353   | String n | OptString n | StringList n | Bool n | Int n
3354   | FileIn n | FileOut n -> n
3355
3356 let java_name_of_struct typ =
3357   try List.assoc typ java_structs
3358   with Not_found ->
3359     failwithf
3360       "java_name_of_struct: no java_structs entry corresponding to %s" typ
3361
3362 let cols_of_struct typ =
3363   try List.assoc typ structs
3364   with Not_found ->
3365     failwithf "cols_of_struct: unknown struct %s" typ
3366
3367 let seq_of_test = function
3368   | TestRun s | TestOutput (s, _) | TestOutputList (s, _)
3369   | TestOutputListOfDevices (s, _)
3370   | TestOutputInt (s, _) | TestOutputIntOp (s, _, _)
3371   | TestOutputTrue s | TestOutputFalse s
3372   | TestOutputLength (s, _) | TestOutputStruct (s, _)
3373   | TestLastFail s -> s
3374
3375 (* Handling for function flags. *)
3376 let protocol_limit_warning =
3377   "Because of the message protocol, there is a transfer limit
3378 of somewhere between 2MB and 4MB.  To transfer large files you should use
3379 FTP."
3380
3381 let danger_will_robinson =
3382   "B<This command is dangerous.  Without careful use you
3383 can easily destroy all your data>."
3384
3385 let deprecation_notice flags =
3386   try
3387     let alt =
3388       find_map (function DeprecatedBy str -> Some str | _ -> None) flags in
3389     let txt =
3390       sprintf "This function is deprecated.
3391 In new code, use the C<%s> call instead.
3392
3393 Deprecated functions will not be removed from the API, but the
3394 fact that they are deprecated indicates that there are problems
3395 with correct use of these functions." alt in
3396     Some txt
3397   with
3398     Not_found -> None
3399
3400 (* Check function names etc. for consistency. *)
3401 let check_functions () =
3402   let contains_uppercase str =
3403     let len = String.length str in
3404     let rec loop i =
3405       if i >= len then false
3406       else (
3407         let c = str.[i] in
3408         if c >= 'A' && c <= 'Z' then true
3409         else loop (i+1)
3410       )
3411     in
3412     loop 0
3413   in
3414
3415   (* Check function names. *)
3416   List.iter (
3417     fun (name, _, _, _, _, _, _) ->
3418       if String.length name >= 7 && String.sub name 0 7 = "guestfs" then
3419         failwithf "function name %s does not need 'guestfs' prefix" name;
3420       if name = "" then
3421         failwithf "function name is empty";
3422       if name.[0] < 'a' || name.[0] > 'z' then
3423         failwithf "function name %s must start with lowercase a-z" name;
3424       if String.contains name '-' then
3425         failwithf "function name %s should not contain '-', use '_' instead."
3426           name
3427   ) all_functions;
3428
3429   (* Check function parameter/return names. *)
3430   List.iter (
3431     fun (name, style, _, _, _, _, _) ->
3432       let check_arg_ret_name n =
3433         if contains_uppercase n then
3434           failwithf "%s param/ret %s should not contain uppercase chars"
3435             name n;
3436         if String.contains n '-' || String.contains n '_' then
3437           failwithf "%s param/ret %s should not contain '-' or '_'"
3438             name n;
3439         if n = "value" then
3440           failwithf "%s has a param/ret called 'value', which causes conflicts in the OCaml bindings, use something like 'val' or a more descriptive name" name;
3441         if n = "int" || n = "char" || n = "short" || n = "long" then
3442           failwithf "%s has a param/ret which conflicts with a C type (eg. 'int', 'char' etc.)" name;
3443         if n = "i" || n = "n" then
3444           failwithf "%s has a param/ret called 'i' or 'n', which will cause some conflicts in the generated code" name;
3445         if n = "argv" || n = "args" then
3446           failwithf "%s has a param/ret called 'argv' or 'args', which will cause some conflicts in the generated code" name
3447       in
3448
3449       (match fst style with
3450        | RErr -> ()
3451        | RInt n | RInt64 n | RBool n
3452        | RConstString n | RConstOptString n | RString n
3453        | RStringList n | RStruct (n, _) | RStructList (n, _)
3454        | RHashtable n | RBufferOut n ->
3455            check_arg_ret_name n
3456       );
3457       List.iter (fun arg -> check_arg_ret_name (name_of_argt arg)) (snd style)
3458   ) all_functions;
3459
3460   (* Check short descriptions. *)
3461   List.iter (
3462     fun (name, _, _, _, _, shortdesc, _) ->
3463       if shortdesc.[0] <> Char.lowercase shortdesc.[0] then
3464         failwithf "short description of %s should begin with lowercase." name;
3465       let c = shortdesc.[String.length shortdesc-1] in
3466       if c = '\n' || c = '.' then
3467         failwithf "short description of %s should not end with . or \\n." name
3468   ) all_functions;
3469
3470   (* Check long dscriptions. *)
3471   List.iter (
3472     fun (name, _, _, _, _, _, longdesc) ->
3473       if longdesc.[String.length longdesc-1] = '\n' then
3474         failwithf "long description of %s should not end with \\n." name
3475   ) all_functions;
3476
3477   (* Check proc_nrs. *)
3478   List.iter (
3479     fun (name, _, proc_nr, _, _, _, _) ->
3480       if proc_nr <= 0 then
3481         failwithf "daemon function %s should have proc_nr > 0" name
3482   ) daemon_functions;
3483
3484   List.iter (
3485     fun (name, _, proc_nr, _, _, _, _) ->
3486       if proc_nr <> -1 then
3487         failwithf "non-daemon function %s should have proc_nr -1" name
3488   ) non_daemon_functions;
3489
3490   let proc_nrs =
3491     List.map (fun (name, _, proc_nr, _, _, _, _) -> name, proc_nr)
3492       daemon_functions in
3493   let proc_nrs =
3494     List.sort (fun (_,nr1) (_,nr2) -> compare nr1 nr2) proc_nrs in
3495   let rec loop = function
3496     | [] -> ()
3497     | [_] -> ()
3498     | (name1,nr1) :: ((name2,nr2) :: _ as rest) when nr1 < nr2 ->
3499         loop rest
3500     | (name1,nr1) :: (name2,nr2) :: _ ->
3501         failwithf "%s and %s have conflicting procedure numbers (%d, %d)"
3502           name1 name2 nr1 nr2
3503   in
3504   loop proc_nrs;
3505
3506   (* Check tests. *)
3507   List.iter (
3508     function
3509       (* Ignore functions that have no tests.  We generate a
3510        * warning when the user does 'make check' instead.
3511        *)
3512     | name, _, _, _, [], _, _ -> ()
3513     | name, _, _, _, tests, _, _ ->
3514         let funcs =
3515           List.map (
3516             fun (_, _, test) ->
3517               match seq_of_test test with
3518               | [] ->
3519                   failwithf "%s has a test containing an empty sequence" name
3520               | cmds -> List.map List.hd cmds
3521           ) tests in
3522         let funcs = List.flatten funcs in
3523
3524         let tested = List.mem name funcs in
3525
3526         if not tested then
3527           failwithf "function %s has tests but does not test itself" name
3528   ) all_functions
3529
3530 (* 'pr' prints to the current output file. *)
3531 let chan = ref stdout
3532 let pr fs = ksprintf (output_string !chan) fs
3533
3534 (* Generate a header block in a number of standard styles. *)
3535 type comment_style = CStyle | HashStyle | OCamlStyle | HaskellStyle
3536 type license = GPLv2 | LGPLv2
3537
3538 let generate_header comment license =
3539   let c = match comment with
3540     | CStyle ->     pr "/* "; " *"
3541     | HashStyle ->  pr "# ";  "#"
3542     | OCamlStyle -> pr "(* "; " *"
3543     | HaskellStyle -> pr "{- "; "  " in
3544   pr "libguestfs generated file\n";
3545   pr "%s WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.\n" c;
3546   pr "%s ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.\n" c;
3547   pr "%s\n" c;
3548   pr "%s Copyright (C) 2009 Red Hat Inc.\n" c;
3549   pr "%s\n" c;
3550   (match license with
3551    | GPLv2 ->
3552        pr "%s This program is free software; you can redistribute it and/or modify\n" c;
3553        pr "%s it under the terms of the GNU General Public License as published by\n" c;
3554        pr "%s the Free Software Foundation; either version 2 of the License, or\n" c;
3555        pr "%s (at your option) any later version.\n" c;
3556        pr "%s\n" c;
3557        pr "%s This program is distributed in the hope that it will be useful,\n" c;
3558        pr "%s but WITHOUT ANY WARRANTY; without even the implied warranty of\n" c;
3559        pr "%s MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n" c;
3560        pr "%s GNU General Public License for more details.\n" c;
3561        pr "%s\n" c;
3562        pr "%s You should have received a copy of the GNU General Public License along\n" c;
3563        pr "%s with this program; if not, write to the Free Software Foundation, Inc.,\n" c;
3564        pr "%s 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.\n" c;
3565
3566    | LGPLv2 ->
3567        pr "%s This library is free software; you can redistribute it and/or\n" c;
3568        pr "%s modify it under the terms of the GNU Lesser General Public\n" c;
3569        pr "%s License as published by the Free Software Foundation; either\n" c;
3570        pr "%s version 2 of the License, or (at your option) any later version.\n" c;
3571        pr "%s\n" c;
3572        pr "%s This library is distributed in the hope that it will be useful,\n" c;
3573        pr "%s but WITHOUT ANY WARRANTY; without even the implied warranty of\n" c;
3574        pr "%s MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n" c;
3575        pr "%s Lesser General Public License for more details.\n" c;
3576        pr "%s\n" c;
3577        pr "%s You should have received a copy of the GNU Lesser General Public\n" c;
3578        pr "%s License along with this library; if not, write to the Free Software\n" c;
3579        pr "%s Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA\n" c;
3580   );
3581   (match comment with
3582    | CStyle -> pr " */\n"
3583    | HashStyle -> ()
3584    | OCamlStyle -> pr " *)\n"
3585    | HaskellStyle -> pr "-}\n"
3586   );
3587   pr "\n"
3588
3589 (* Start of main code generation functions below this line. *)
3590
3591 (* Generate the pod documentation for the C API. *)
3592 let rec generate_actions_pod () =
3593   List.iter (
3594     fun (shortname, style, _, flags, _, _, longdesc) ->
3595       if not (List.mem NotInDocs flags) then (
3596         let name = "guestfs_" ^ shortname in
3597         pr "=head2 %s\n\n" name;
3598         pr " ";
3599         generate_prototype ~extern:false ~handle:"handle" name style;
3600         pr "\n\n";
3601         pr "%s\n\n" longdesc;
3602         (match fst style with
3603          | RErr ->
3604              pr "This function returns 0 on success or -1 on error.\n\n"
3605          | RInt _ ->
3606              pr "On error this function returns -1.\n\n"
3607          | RInt64 _ ->
3608              pr "On error this function returns -1.\n\n"
3609          | RBool _ ->
3610              pr "This function returns a C truth value on success or -1 on error.\n\n"
3611          | RConstString _ ->
3612              pr "This function returns a string, or NULL on error.
3613 The string is owned by the guest handle and must I<not> be freed.\n\n"
3614          | RConstOptString _ ->
3615              pr "This function returns a string which may be NULL.
3616 There is way to return an error from this function.
3617 The string is owned by the guest handle and must I<not> be freed.\n\n"
3618          | RString _ ->
3619              pr "This function returns a string, or NULL on error.
3620 I<The caller must free the returned string after use>.\n\n"
3621          | RStringList _ ->
3622              pr "This function returns a NULL-terminated array of strings
3623 (like L<environ(3)>), or NULL if there was an error.
3624 I<The caller must free the strings and the array after use>.\n\n"
3625          | RStruct (_, typ) ->
3626              pr "This function returns a C<struct guestfs_%s *>,
3627 or NULL if there was an error.
3628 I<The caller must call C<guestfs_free_%s> after use>.\n\n" typ typ
3629          | RStructList (_, typ) ->
3630              pr "This function returns a C<struct guestfs_%s_list *>
3631 (see E<lt>guestfs-structs.hE<gt>),
3632 or NULL if there was an error.
3633 I<The caller must call C<guestfs_free_%s_list> after use>.\n\n" typ typ
3634          | RHashtable _ ->
3635              pr "This function returns a NULL-terminated array of
3636 strings, or NULL if there was an error.
3637 The array of strings will always have length C<2n+1>, where
3638 C<n> keys and values alternate, followed by the trailing NULL entry.
3639 I<The caller must free the strings and the array after use>.\n\n"
3640          | RBufferOut _ ->
3641              pr "This function returns a buffer, or NULL on error.
3642 The size of the returned buffer is written to C<*size_r>.
3643 I<The caller must free the returned buffer after use>.\n\n"
3644         );
3645         if List.mem ProtocolLimitWarning flags then
3646           pr "%s\n\n" protocol_limit_warning;
3647         if List.mem DangerWillRobinson flags then
3648           pr "%s\n\n" danger_will_robinson;
3649         match deprecation_notice flags with
3650         | None -> ()
3651         | Some txt -> pr "%s\n\n" txt
3652       )
3653   ) all_functions_sorted
3654
3655 and generate_structs_pod () =
3656   (* Structs documentation. *)
3657   List.iter (
3658     fun (typ, cols) ->
3659       pr "=head2 guestfs_%s\n" typ;
3660       pr "\n";
3661       pr " struct guestfs_%s {\n" typ;
3662       List.iter (
3663         function
3664         | name, FChar -> pr "   char %s;\n" name
3665         | name, FUInt32 -> pr "   uint32_t %s;\n" name
3666         | name, FInt32 -> pr "   int32_t %s;\n" name
3667         | name, (FUInt64|FBytes) -> pr "   uint64_t %s;\n" name
3668         | name, FInt64 -> pr "   int64_t %s;\n" name
3669         | name, FString -> pr "   char *%s;\n" name
3670         | name, FBuffer ->
3671             pr "   /* The next two fields describe a byte array. */\n";
3672             pr "   uint32_t %s_len;\n" name;
3673             pr "   char *%s;\n" name
3674         | name, FUUID ->
3675             pr "   /* The next field is NOT nul-terminated, be careful when printing it: */\n";
3676             pr "   char %s[32];\n" name
3677         | name, FOptPercent ->
3678             pr "   /* The next field is [0..100] or -1 meaning 'not present': */\n";
3679             pr "   float %s;\n" name
3680       ) cols;
3681       pr " };\n";
3682       pr " \n";
3683       pr " struct guestfs_%s_list {\n" typ;
3684       pr "   uint32_t len; /* Number of elements in list. */\n";
3685       pr "   struct guestfs_%s *val; /* Elements. */\n" typ;
3686       pr " };\n";
3687       pr " \n";
3688       pr " void guestfs_free_%s (struct guestfs_free_%s *);\n" typ typ;
3689       pr " void guestfs_free_%s_list (struct guestfs_free_%s_list *);\n"
3690         typ typ;
3691       pr "\n"
3692   ) structs
3693
3694 (* Generate the protocol (XDR) file, 'guestfs_protocol.x' and
3695  * indirectly 'guestfs_protocol.h' and 'guestfs_protocol.c'.
3696  *
3697  * We have to use an underscore instead of a dash because otherwise
3698  * rpcgen generates incorrect code.
3699  *
3700  * This header is NOT exported to clients, but see also generate_structs_h.
3701  *)
3702 and generate_xdr () =
3703   generate_header CStyle LGPLv2;
3704
3705   (* This has to be defined to get around a limitation in Sun's rpcgen. *)
3706   pr "typedef string str<>;\n";
3707   pr "\n";
3708
3709   (* Internal structures. *)
3710   List.iter (
3711     function
3712     | typ, cols ->
3713         pr "struct guestfs_int_%s {\n" typ;
3714         List.iter (function
3715                    | name, FChar -> pr "  char %s;\n" name
3716                    | name, FString -> pr "  string %s<>;\n" name
3717                    | name, FBuffer -> pr "  opaque %s<>;\n" name
3718            &nb