X-Git-Url: http://git.annexia.org/?a=blobdiff_plain;f=src%2Fgenerator.ml;h=2230ab8d6bc29c2a5d787c9288925317c3260913;hb=71fa671c6dd4decccb3d99941a5d02b0d13e0152;hp=98faa0f235cc1941566569aaa61ca697ee14d8bc;hpb=9908e03e922b670437bcd89b6873f9ebc914567e;p=libguestfs.git diff --git a/src/generator.ml b/src/generator.ml index 98faa0f..2230ab8 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -15,11 +15,19 @@ * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA - * - * This script generates a large amount of code and documentation for + *) + +(* This script generates a large amount of code and documentation for * all the daemon actions. To add a new action there are only two * files you need to change, this one to describe the interface, and * daemon/.c to write the implementation. + * + * After editing this file, run it (./src/generator.ml) to regenerate + * all the output files. + * + * IMPORTANT: This script should NOT print any warnings. If it prints + * warnings, you should treat them as errors. + * [Need to add -warn-error to ocaml command line] *) #load "unix.cma";; @@ -32,24 +40,41 @@ and ret = * indication, ie. 0 or -1. *) | Err - (* "RString" and "RStringList" require special treatment because - * the caller must free them. + (* "RInt" as a return value means an int which is -1 for error + * or any value >= 0 on success. + *) + | RInt of string + (* "RBool" is a bool return value which can be true/false or + * -1 for error. + *) + | RBool of string + (* "RConstString" is a string that refers to a constant value. + * Try to avoid using this. In particular you cannot use this + * for values returned from the daemon, because there is no + * thread-safe way to return them in the C API. *) + | RConstString of string + (* "RString" and "RStringList" are caller-frees. *) | RString of string | RStringList of string + (* Some limited tuples are possible: *) + | RIntBool of string * string (* LVM PVs, VGs and LVs. *) | RPVList of string | RVGList of string | RLVList of string -and args = - (* 0 arguments, 1 argument, etc. The guestfs_h param is implicit. *) - | P0 - | P1 of argt - | P2 of argt * argt +and args = argt list (* Function parameters, guestfs handle is implicit. *) and argt = | String of string (* const char *name, cannot be NULL *) + | OptString of string (* const char *name, may be NULL *) + | Bool of string (* boolean *) + | Int of string (* int (smallish ints, signed, <= 31 bits) *) -type flags = ProtocolLimitWarning +type flags = + | ProtocolLimitWarning (* display warning about protocol size limits *) + | FishAlias of string (* provide an alias for this cmd in guestfish *) + | FishAction of string (* call this function in guestfish *) + | NotInFish (* do not export via guestfish *) (* Note about long descriptions: When referring to another * action, use the format C (ie. the full name of @@ -59,8 +84,114 @@ type flags = ProtocolLimitWarning * Apart from that, long descriptions are just perldoc paragraphs. *) -let functions = [ - ("mount", (Err, P2 (String "device", String "mountpoint")), 1, [], +let non_daemon_functions = [ + ("launch", (Err, []), -1, [FishAlias "run"; FishAction "launch"], + "launch the qemu subprocess", + "\ +Internally libguestfs is implemented by running a virtual machine +using L. + +You should call this after configuring the handle +(eg. adding drives) but before performing any actions."); + + ("wait_ready", (Err, []), -1, [NotInFish], + "wait until the qemu subprocess launches", + "\ +Internally libguestfs is implemented by running a virtual machine +using L. + +You should call this after C to wait for the launch +to complete."); + + ("kill_subprocess", (Err, []), -1, [], + "kill the qemu subprocess", + "\ +This kills the qemu subprocess. You should never need to call this."); + + ("add_drive", (Err, [String "filename"]), -1, [FishAlias "add"], + "add an image to examine or modify", + "\ +This function adds a virtual machine disk image C to the +guest. The first time you call this function, the disk appears as IDE +disk 0 (C) in the guest, the second time as C, and +so on. + +You don't necessarily need to be root when using libguestfs. However +you obviously do need sufficient permissions to access the filename +for whatever operations you want to perform (ie. read access if you +just want to read the image or write access if you want to modify the +image). + +This is equivalent to the qemu parameter C<-drive file=filename>."); + + ("add_cdrom", (Err, [String "filename"]), -1, [FishAlias "cdrom"], + "add a CD-ROM disk image to examine", + "\ +This function adds a virtual CD-ROM disk image to the guest. + +This is equivalent to the qemu parameter C<-cdrom filename>."); + + ("config", (Err, [String "qemuparam"; OptString "qemuvalue"]), -1, [], + "add qemu parameters", + "\ +This can be used to add arbitrary qemu command line parameters +of the form C<-param value>. Actually it's not quite arbitrary - we +prevent you from setting some parameters which would interfere with +parameters that we use. + +The first character of C string must be a C<-> (dash). + +C can be NULL."); + + ("set_path", (Err, [String "path"]), -1, [FishAlias "path"], + "set the search path", + "\ +Set the path that libguestfs searches for kernel and initrd.img. + +The default is C<$libdir/guestfs> unless overridden by setting +C environment variable. + +The string C is stashed in the libguestfs handle, so the caller +must make sure it remains valid for the lifetime of the handle. + +Setting C to C restores the default path."); + + ("get_path", (RConstString "path", []), -1, [], + "get the search path", + "\ +Return the current search path. + +This is always non-NULL. If it wasn't set already, then this will +return the default path."); + + ("set_autosync", (Err, [Bool "autosync"]), -1, [FishAlias "autosync"], + "set autosync mode", + "\ +If C is true, this enables autosync. Libguestfs will make a +best effort attempt to run C when the handle is closed +(also if the program exits without closing handles)."); + + ("get_autosync", (RBool "autosync", []), -1, [], + "get autosync mode", + "\ +Get the autosync flag."); + + ("set_verbose", (Err, [Bool "verbose"]), -1, [FishAlias "verbose"], + "set verbose mode", + "\ +If C is true, this turns on verbose messages (to C). + +Verbose messages are disabled unless the environment variable +C is defined and set to C<1>."); + + ("get_verbose", (RBool "verbose", []), -1, [], + "get verbose mode", + "\ +This returns the verbose messages flag.") +] + +let daemon_functions = [ + ("mount", (Err, [String "device"; String "mountpoint"]), 1, [], "mount a guest disk at a position in the filesystem", "\ Mount a guest disk at a position in the filesystem. Block devices @@ -80,7 +211,7 @@ on the underlying device. The filesystem options C and C are set with this call, in order to improve reliability."); - ("sync", (Err, P0), 2, [], + ("sync", (Err, []), 2, [], "sync disks, writes are flushed through to the disk image", "\ This syncs the disk, so that any writes are flushed through to the @@ -89,14 +220,14 @@ underlying disk image. You should always call this if you have modified a disk image, before closing the handle."); - ("touch", (Err, P1 (String "path")), 3, [], + ("touch", (Err, [String "path"]), 3, [], "update file timestamps or create a new file", "\ Touch acts like the L command. It can be used to update the timestamps on a file, or, if the file does not exist, to create a new zero-length file."); - ("cat", (RString "content", P1 (String "path")), 4, [ProtocolLimitWarning], + ("cat", (RString "content", [String "path"]), 4, [ProtocolLimitWarning], "list the contents of a file", "\ Return the contents of the file named C. @@ -106,7 +237,7 @@ Note that this function cannot correctly handle binary files as end of string). For those you need to use the C function which has a more complex interface."); - ("ll", (RString "listing", P1 (String "directory")), 5, [], + ("ll", (RString "listing", [String "directory"]), 5, [], "list the files in a directory (long format)", "\ List the files in C (relative to the root directory, @@ -115,7 +246,7 @@ there is no cwd) in the format of 'ls -la'. This command is mostly useful for interactive sessions. It is I intended that you try to parse the output string."); - ("ls", (RStringList "listing", P1 (String "directory")), 6, [], + ("ls", (RStringList "listing", [String "directory"]), 6, [], "list the files in a directory", "\ List the files in C (relative to the root directory, @@ -125,14 +256,14 @@ hidden files are shown. This command is mostly useful for interactive sessions. Programs should probably use C instead."); - ("list_devices", (RStringList "devices", P0), 7, [], + ("list_devices", (RStringList "devices", []), 7, [], "list the block devices", "\ List all the block devices. The full block device names are returned, eg. C"); - ("list_partitions", (RStringList "partitions", P0), 8, [], + ("list_partitions", (RStringList "partitions", []), 8, [], "list the partitions", "\ List all the partitions detected on all block devices. @@ -142,7 +273,7 @@ The full partition device names are returned, eg. C This does not return logical volumes. For that you will need to call C."); - ("pvs", (RStringList "physvols", P0), 9, [], + ("pvs", (RStringList "physvols", []), 9, [], "list the LVM physical volumes (PVs)", "\ List all the physical volumes detected. This is the equivalent @@ -153,7 +284,7 @@ PVs (eg. C). See also C."); - ("vgs", (RStringList "volgroups", P0), 10, [], + ("vgs", (RStringList "volgroups", []), 10, [], "list the LVM volume groups (VGs)", "\ List all the volumes groups detected. This is the equivalent @@ -164,7 +295,7 @@ detected (eg. C). See also C."); - ("lvs", (RStringList "logvols", P0), 11, [], + ("lvs", (RStringList "logvols", []), 11, [], "list the LVM logical volumes (LVs)", "\ List all the logical volumes detected. This is the equivalent @@ -175,25 +306,193 @@ This returns a list of the logical volume device names See also C."); - ("pvs_full", (RPVList "physvols", P0), 12, [], + ("pvs_full", (RPVList "physvols", []), 12, [], "list the LVM physical volumes (PVs)", "\ List all the physical volumes detected. This is the equivalent of the L command. The \"full\" version includes all fields."); - ("vgs_full", (RVGList "volgroups", P0), 13, [], + ("vgs_full", (RVGList "volgroups", []), 13, [], "list the LVM volume groups (VGs)", "\ List all the volumes groups detected. This is the equivalent of the L command. The \"full\" version includes all fields."); - ("lvs_full", (RLVList "logvols", P0), 14, [], + ("lvs_full", (RLVList "logvols", []), 14, [], "list the LVM logical volumes (LVs)", "\ List all the logical volumes detected. This is the equivalent of the L command. The \"full\" version includes all fields."); + + ("read_lines", (RStringList "lines", [String "path"]), 15, [], + "read file as lines", + "\ +Return the contents of the file named C. + +The file contents are returned as a list of lines. Trailing +C and C character sequences are I returned. + +Note that this function cannot correctly handle binary files +(specifically, files containing C<\\0> character which is treated +as end of line). For those you need to use the C +function which has a more complex interface."); + + ("aug_init", (Err, [String "root"; Int "flags"]), 16, [], + "create a new Augeas handle", + "\ +Create a new Augeas handle for editing configuration files. +If there was any previous Augeas handle associated with this +guestfs session, then it is closed. + +You must call this before using any other C +commands. + +C is the filesystem root. C must not be NULL, +use C instead. + +The flags are the same as the flags defined in +Eaugeas.hE, the logical I of the following +integers: + +=over 4 + +=item C = 1 + +Keep the original file with a C<.augsave> extension. + +=item C = 2 + +Save changes into a file with extension C<.augnew>, and +do not overwrite original. Overrides C. + +=item C = 4 + +Typecheck lenses (can be expensive). + +=item C = 8 + +Do not use standard load path for modules. + +=item C = 16 + +Make save a no-op, just record what would have been changed. + +=item C = 32 + +Do not load the tree in C. + +=back + +To close the handle, you can call C. + +To find out more about Augeas, see L."); + + ("aug_close", (Err, []), 26, [], + "close the current Augeas handle", + "\ +Close the current Augeas handle and free up any resources +used by it. After calling this, you have to call +C again before you can use any other +Augeas functions."); + + ("aug_defvar", (RInt "nrnodes", [String "name"; OptString "expr"]), 17, [], + "define an Augeas variable", + "\ +Defines an Augeas variable C whose value is the result +of evaluating C. If C is NULL, then C is +undefined. + +On success this returns the number of nodes in C, or +C<0> if C evaluates to something which is not a nodeset."); + + ("aug_defnode", (RIntBool ("nrnodes", "created"), [String "name"; String "expr"; String "val"]), 18, [], + "define an Augeas node", + "\ +Defines a variable C whose value is the result of +evaluating C. + +If C evaluates to an empty nodeset, a node is created, +equivalent to calling C C, C. +C will be the nodeset containing that single node. + +On success this returns a pair containing the +number of nodes in the nodeset, and a boolean flag +if a node was created."); + + ("aug_get", (RString "val", [String "path"]), 19, [], + "look up the value of an Augeas path", + "\ +Look up the value associated with C. If C +matches exactly one node, the C is returned."); + + ("aug_set", (Err, [String "path"; String "val"]), 20, [], + "set Augeas path to value", + "\ +Set the value associated with C to C."); + + ("aug_insert", (Err, [String "path"; String "label"; Bool "before"]), 21, [], + "insert a sibling Augeas node", + "\ +Create a new sibling C