+#. type: textblock
+#: ../src/guestfs.pod:1753
+msgid "To attach a named piece of data, use the following call:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1755
+#, no-wrap
+msgid ""
+" void guestfs_set_private (guestfs_h *g, const char *key, void *data);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1757
+msgid ""
+"C<key> is the name to associate with this data, and C<data> is an arbitrary "
+"pointer (which can be C<NULL>). Any previous item with the same name is "
+"overwritten."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1761
+msgid ""
+"You can use any C<key> you want, but names beginning with an underscore "
+"character are reserved for internal libguestfs purposes (for implementing "
+"language bindings). It is recommended to prefix the name with some unique "
+"string to avoid collisions with other users."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1766
+msgid "To retrieve the pointer, use:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1768
+#, no-wrap
+msgid ""
+" void *guestfs_get_private (guestfs_h *g, const char *key);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1770
+msgid ""
+"This function returns C<NULL> if either no data is found associated with "
+"C<key>, or if the user previously set the C<key>'s C<data> pointer to "
+"C<NULL>."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1774
+msgid ""
+"Libguestfs does not try to look at or interpret the C<data> pointer in any "
+"way. As far as libguestfs is concerned, it need not be a valid pointer at "
+"all. In particular, libguestfs does I<not> try to free the data when the "
+"handle is closed. If the data must be freed, then the caller must either "
+"free it before calling L</guestfs_close> or must set up a close callback to "
+"do it (see L</guestfs_set_close_callback>, and note that only one callback "
+"can be registered for a handle)."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1782
+msgid ""
+"The private data area is implemented using a hash table, and should be "
+"reasonably efficient for moderate numbers of keys."
+msgstr ""
+
+# type: =end
+#. type: =end
+#: ../src/guestfs.pod:1785 ../src/guestfs.pod:1790
+msgid "html"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1787
+msgid ""
+"<!-- old anchor for the next section --> <a name="
+"\"state_machine_and_low_level_event_api\"/>"
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:1792
+msgid "ARCHITECTURE"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1794
+msgid ""
+"Internally, libguestfs is implemented by running an appliance (a special "
+"type of small virtual machine) using L<qemu(1)>. Qemu runs as a child "
+"process of the main program."
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1798
+#, no-wrap
+msgid ""
+" ___________________\n"
+" / \\\n"
+" | main program |\n"
+" | |\n"
+" | | child process / appliance\n"
+" | | __________________________\n"
+" | | / qemu \\\n"
+" +-------------------+ RPC | +-----------------+ |\n"
+" | libguestfs <--------------------> guestfsd | |\n"
+" | | | +-----------------+ |\n"
+" \\___________________/ | | Linux kernel | |\n"
+" | +--^--------------+ |\n"
+" \\_________|________________/\n"
+" |\n"
+" _______v______\n"
+" / \\\n"
+" | Device or |\n"
+" | disk image |\n"
+" \\______________/\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1818
+msgid ""
+"The library, linked to the main program, creates the child process and hence "
+"the appliance in the L</guestfs_launch> function."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1821
+msgid ""
+"Inside the appliance is a Linux kernel and a complete stack of userspace "
+"tools (such as LVM and ext2 programs) and a small controlling daemon called "
+"L</guestfsd>. The library talks to L</guestfsd> using remote procedure "
+"calls (RPC). There is a mostly one-to-one correspondence between libguestfs "
+"API calls and RPC calls to the daemon. Lastly the disk image(s) are "
+"attached to the qemu process which translates device access by the "
+"appliance's Linux kernel into accesses to the image."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1830
+msgid ""
+"A common misunderstanding is that the appliance \"is\" the virtual machine. "
+"Although the disk image you are attached to might also be used by some "
+"virtual machine, libguestfs doesn't know or care about this. (But you will "
+"care if both libguestfs's qemu process and your virtual machine are trying "
+"to update the disk image at the same time, since these usually results in "
+"massive disk corruption)."
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:1837
+msgid "STATE MACHINE"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1839
+msgid "libguestfs uses a state machine to model the child process:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1841
+#, no-wrap
+msgid ""
+" |\n"
+" guestfs_create\n"
+" |\n"
+" |\n"
+" ____V_____\n"
+" / \\\n"
+" | CONFIG |\n"
+" \\__________/\n"
+" ^ ^ ^ \\\n"
+" / | \\ \\ guestfs_launch\n"
+" / | _\\__V______\n"
+" / | / \\\n"
+" / | | LAUNCHING |\n"
+" / | \\___________/\n"
+" / | /\n"
+" / | guestfs_launch\n"
+" / | /\n"
+" ______ / __|____V\n"
+" / \\ ------> / \\\n"
+" | BUSY | | READY |\n"
+" \\______/ <------ \\________/\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1863
+msgid ""
+"The normal transitions are (1) CONFIG (when the handle is created, but there "
+"is no child process), (2) LAUNCHING (when the child process is booting up), "
+"(3) alternating between READY and BUSY as commands are issued to, and "
+"carried out by, the child process."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1868
+msgid ""
+"The guest may be killed by L</guestfs_kill_subprocess>, or may die "
+"asynchronously at any time (eg. due to some internal error), and that causes "
+"the state to transition back to CONFIG."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1872
+msgid ""
+"Configuration commands for qemu such as L</guestfs_add_drive> can only be "
+"issued when in the CONFIG state."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1875
+msgid ""
+"The API offers one call that goes from CONFIG through LAUNCHING to READY. "
+"L</guestfs_launch> blocks until the child process is READY to accept "
+"commands (or until some failure or timeout). L</guestfs_launch> internally "
+"moves the state from CONFIG to LAUNCHING while it is running."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1881
+msgid ""
+"API actions such as L</guestfs_mount> can only be issued when in the READY "
+"state. These API calls block waiting for the command to be carried out (ie. "
+"the state to transition to BUSY and then back to READY). There are no non-"
+"blocking versions, and no way to issue more than one command per handle at "
+"the same time."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1887
+msgid ""
+"Finally, the child process sends asynchronous messages back to the main "
+"program, such as kernel log messages. You can register a callback to "
+"receive these messages."
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:1891
+msgid "INTERNALS"
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1893
+msgid "COMMUNICATION PROTOCOL"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1895
+msgid ""
+"Don't rely on using this protocol directly. This section documents how it "
+"currently works, but it may change at any time."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1898
+msgid ""
+"The protocol used to talk between the library and the daemon running inside "
+"the qemu virtual machine is a simple RPC mechanism built on top of XDR (RFC "
+"1014, RFC 1832, RFC 4506)."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1902
+msgid ""
+"The detailed format of structures is in C<src/guestfs_protocol.x> (note: "
+"this file is automatically generated)."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1905
+msgid ""
+"There are two broad cases, ordinary functions that don't have any C<FileIn> "
+"and C<FileOut> parameters, which are handled with very simple request/reply "
+"messages. Then there are functions that have any C<FileIn> or C<FileOut> "
+"parameters, which use the same request and reply messages, but they may also "
+"be followed by files sent using a chunked encoding."
+msgstr ""
+
+# type: =head3
+#. type: =head3
+#: ../src/guestfs.pod:1912
+msgid "ORDINARY FUNCTIONS (NO FILEIN/FILEOUT PARAMS)"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1914
+msgid "For ordinary functions, the request message is:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1916
+#, no-wrap
+msgid ""
+" total length (header + arguments,\n"
+" but not including the length word itself)\n"
+" struct guestfs_message_header (encoded as XDR)\n"
+" struct guestfs_<foo>_args (encoded as XDR)\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1921
+msgid ""
+"The total length field allows the daemon to allocate a fixed size buffer "
+"into which it slurps the rest of the message. As a result, the total length "
+"is limited to C<GUESTFS_MESSAGE_MAX> bytes (currently 4MB), which means the "
+"effective size of any request is limited to somewhere under this size."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1927
+msgid ""
+"Note also that many functions don't take any arguments, in which case the "
+"C<guestfs_I<foo>_args> is completely omitted."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1930
+msgid ""
+"The header contains the procedure number (C<guestfs_proc>) which is how the "
+"receiver knows what type of args structure to expect, or none at all."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1934
+msgid ""
+"For functions that take optional arguments, the optional arguments are "
+"encoded in the C<guestfs_I<foo>_args> structure in the same way as ordinary "
+"arguments. A bitmask in the header indicates which optional arguments are "
+"meaningful. The bitmask is also checked to see if it contains bits set "
+"which the daemon does not know about (eg. if more optional arguments were "
+"added in a later version of the library), and this causes the call to be "
+"rejected."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1942
+msgid "The reply message for ordinary functions is:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1944
+#, no-wrap
+msgid ""
+" total length (header + ret,\n"
+" but not including the length word itself)\n"
+" struct guestfs_message_header (encoded as XDR)\n"
+" struct guestfs_<foo>_ret (encoded as XDR)\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1949
+msgid ""
+"As above the C<guestfs_I<foo>_ret> structure may be completely omitted for "
+"functions that return no formal return values."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1952
+msgid ""
+"As above the total length of the reply is limited to C<GUESTFS_MESSAGE_MAX>."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1955
+msgid ""
+"In the case of an error, a flag is set in the header, and the reply message "
+"is slightly changed:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1958
+#, no-wrap
+msgid ""
+" total length (header + error,\n"
+" but not including the length word itself)\n"
+" struct guestfs_message_header (encoded as XDR)\n"
+" struct guestfs_message_error (encoded as XDR)\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1963
+msgid ""
+"The C<guestfs_message_error> structure contains the error message as a "
+"string."
+msgstr ""
+
+# type: =head3
+#. type: =head3
+#: ../src/guestfs.pod:1966
+msgid "FUNCTIONS THAT HAVE FILEIN PARAMETERS"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1968
+msgid ""
+"A C<FileIn> parameter indicates that we transfer a file I<into> the guest. "
+"The normal request message is sent (see above). However this is followed by "
+"a sequence of file chunks."
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1972
+#, no-wrap
+msgid ""
+" total length (header + arguments,\n"
+" but not including the length word itself,\n"
+" and not including the chunks)\n"
+" struct guestfs_message_header (encoded as XDR)\n"
+" struct guestfs_<foo>_args (encoded as XDR)\n"
+" sequence of chunks for FileIn param #0\n"
+" sequence of chunks for FileIn param #1 etc.\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1980
+msgid "The \"sequence of chunks\" is:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1982
+#, no-wrap
+msgid ""
+" length of chunk (not including length word itself)\n"
+" struct guestfs_chunk (encoded as XDR)\n"
+" length of chunk\n"
+" struct guestfs_chunk (encoded as XDR)\n"
+" ...\n"
+" length of chunk\n"
+" struct guestfs_chunk (with data.data_len == 0)\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1990
+msgid ""
+"The final chunk has the C<data_len> field set to zero. Additionally a flag "
+"is set in the final chunk to indicate either successful completion or early "
+"cancellation."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1994
+msgid ""
+"At time of writing there are no functions that have more than one FileIn "
+"parameter. However this is (theoretically) supported, by sending the "
+"sequence of chunks for each FileIn parameter one after another (from left to "
+"right)."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1999
+msgid ""
+"Both the library (sender) I<and> the daemon (receiver) may cancel the "
+"transfer. The library does this by sending a chunk with a special flag set "
+"to indicate cancellation. When the daemon sees this, it cancels the whole "
+"RPC, does I<not> send any reply, and goes back to reading the next request."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2005
+msgid ""
+"The daemon may also cancel. It does this by writing a special word "
+"C<GUESTFS_CANCEL_FLAG> to the socket. The library listens for this during "
+"the transfer, and if it gets it, it will cancel the transfer (it sends a "
+"cancel chunk). The special word is chosen so that even if cancellation "
+"happens right at the end of the transfer (after the library has finished "
+"writing and has started listening for the reply), the \"spurious\" cancel "
+"flag will not be confused with the reply message."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2014
+msgid ""
+"This protocol allows the transfer of arbitrary sized files (no 32 bit "
+"limit), and also files where the size is not known in advance (eg. from "
+"pipes or sockets). However the chunks are rather small "
+"(C<GUESTFS_MAX_CHUNK_SIZE>), so that neither the library nor the daemon need "
+"to keep much in memory."
+msgstr ""
+
+# type: =head3
+#. type: =head3
+#: ../src/guestfs.pod:2020
+msgid "FUNCTIONS THAT HAVE FILEOUT PARAMETERS"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2022
+msgid ""
+"The protocol for FileOut parameters is exactly the same as for FileIn "
+"parameters, but with the roles of daemon and library reversed."
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:2025
+#, no-wrap
+msgid ""
+" total length (header + ret,\n"
+" but not including the length word itself,\n"
+" and not including the chunks)\n"
+" struct guestfs_message_header (encoded as XDR)\n"
+" struct guestfs_<foo>_ret (encoded as XDR)\n"
+" sequence of chunks for FileOut param #0\n"
+" sequence of chunks for FileOut param #1 etc.\n"
+"\n"
+msgstr ""
+
+# type: =head3
+#. type: =head3
+#: ../src/guestfs.pod:2033
+msgid "INITIAL MESSAGE"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2035
+msgid ""
+"When the daemon launches it sends an initial word (C<GUESTFS_LAUNCH_FLAG>) "
+"which indicates that the guest and daemon is alive. This is what L</"
+"guestfs_launch> waits for."
+msgstr ""
+
+# type: =head3
+#. type: =head3
+#: ../src/guestfs.pod:2039
+msgid "PROGRESS NOTIFICATION MESSAGES"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2041
+msgid ""
+"The daemon may send progress notification messages at any time. These are "
+"distinguished by the normal length word being replaced by "
+"C<GUESTFS_PROGRESS_FLAG>, followed by a fixed size progress message."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2045
+msgid ""
+"The library turns them into progress callbacks (see "
+"C<guestfs_set_progress_callback>) if there is a callback registered, or "
+"discards them if not."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2049
+msgid ""
+"The daemon self-limits the frequency of progress messages it sends (see "
+"C<daemon/proto.c:notify_progress>). Not all calls generate progress "
+"messages."
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:2053
+msgid "LIBGUESTFS VERSION NUMBERS"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2055
+msgid ""
+"Since April 2010, libguestfs has started to make separate development and "
+"stable releases, along with corresponding branches in our git repository. "
+"These separate releases can be identified by version number:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:2060
+#, no-wrap
+msgid ""
+" even numbers for stable: 1.2.x, 1.4.x, ...\n"
+" .-------- odd numbers for development: 1.3.x, 1.5.x, ...\n"
+" |\n"
+" v\n"
+" 1 . 3 . 5\n"
+" ^ ^\n"
+" | |\n"
+" | `-------- sub-version\n"
+" |\n"
+" `------ always '1' because we don't change the ABI\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2071
+msgid "Thus \"1.3.5\" is the 5th update to the development branch \"1.3\"."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2073
+msgid ""
+"As time passes we cherry pick fixes from the development branch and backport "
+"those into the stable branch, the effect being that the stable branch should "
+"get more stable and less buggy over time. So the stable releases are ideal "
+"for people who don't need new features but would just like the software to "
+"work."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2079
+msgid "Our criteria for backporting changes are:"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2085
+msgid ""
+"Documentation changes which don't affect any code are backported unless the "
+"documentation refers to a future feature which is not in stable."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2091
+msgid ""
+"Bug fixes which are not controversial, fix obvious problems, and have been "
+"well tested are backported."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2096
+msgid ""
+"Simple rearrangements of code which shouldn't affect how it works get "
+"backported. This is so that the code in the two branches doesn't get too "
+"far out of step, allowing us to backport future fixes more easily."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2102
+msgid ""
+"We I<don't> backport new features, new APIs, new tools etc, except in one "
+"exceptional case: the new feature is required in order to implement an "
+"important bug fix."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2108
+msgid ""
+"A new stable branch starts when we think the new features in development are "
+"substantial and compelling enough over the current stable branch to warrant "
+"it. When that happens we create new stable and development versions 1.N.0 "
+"and 1.(N+1).0 [N is even]. The new dot-oh release won't necessarily be so "
+"stable at this point, but by backporting fixes from development, that branch "
+"will stabilize over time."
+msgstr ""
+
+#. type: =head1
+#: ../src/guestfs.pod:2116
+msgid "EXTENDING LIBGUESTFS"
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2118
+msgid "ADDING A NEW API ACTION"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2120
+msgid ""
+"Large amounts of boilerplate code in libguestfs (RPC, bindings, "
+"documentation) are generated, and this makes it easy to extend the "
+"libguestfs API."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2124
+msgid "To add a new API action there are two changes:"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2130
+msgid ""
+"You need to add a description of the call (name, parameters, return type, "
+"tests, documentation) to C<generator/generator_actions.ml>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2133
+msgid ""
+"There are two sorts of API action, depending on whether the call goes "
+"through to the daemon in the appliance, or is serviced entirely by the "
+"library (see L</ARCHITECTURE> above). L</guestfs_sync> is an example of the "
+"former, since the sync is done in the appliance. L</guestfs_set_trace> is "
+"an example of the latter, since a trace flag is maintained in the handle and "
+"all tracing is done on the library side."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2141
+msgid ""
+"Most new actions are of the first type, and get added to the "
+"C<daemon_functions> list. Each function has a unique procedure number used "
+"in the RPC protocol which is assigned to that action when we publish "
+"libguestfs and cannot be reused. Take the latest procedure number and "
+"increment it."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2147
+msgid ""
+"For library-only actions of the second type, add to the "
+"C<non_daemon_functions> list. Since these functions are serviced by the "
+"library and do not travel over the RPC mechanism to the daemon, these "
+"functions do not need a procedure number, and so the procedure number is set "
+"to C<-1>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2155
+msgid "Implement the action (in C):"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2157
+msgid ""
+"For daemon actions, implement the function C<do_E<lt>nameE<gt>> in the "
+"C<daemon/> directory."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2160
+msgid ""
+"For library actions, implement the function C<guestfs__E<lt>nameE<gt>> "
+"(note: double underscore) in the C<src/> directory."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2163
+msgid "In either case, use another function as an example of what to do."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2167
+msgid "After making these changes, use C<make> to compile."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2169
+msgid ""
+"Note that you don't need to implement the RPC, language bindings, manual "
+"pages or anything else. It's all automatically generated from the OCaml "
+"description."
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2173
+msgid "ADDING TESTS FOR AN API ACTION"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2175
+msgid ""
+"You can supply zero or as many tests as you want per API call. The tests "
+"can either be added as part of the API description (C<generator/"
+"generator_actions.ml>), or in some rarer cases you may want to drop a script "
+"into C<regressions/>. Note that adding a script to C<regressions/> is "
+"slower, so if possible use the first method."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2181
+msgid ""
+"The following describes the test environment used when you add an API test "
+"in C<generator_actions.ml>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2184
+msgid "The test environment has 4 block devices:"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2188
+msgid "C</dev/sda> 500MB"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2190
+msgid "General block device for testing."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2192
+msgid "C</dev/sdb> 50MB"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2194
+msgid ""
+"C</dev/sdb1> is an ext2 filesystem used for testing filesystem write "
+"operations."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2197
+msgid "C</dev/sdc> 10MB"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2199
+msgid "Used in a few tests where two block devices are needed."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2201
+msgid "C</dev/sdd>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2203
+msgid "ISO with fixed content (see C<images/test.iso>)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2207
+msgid ""
+"To be able to run the tests in a reasonable amount of time, the libguestfs "
+"appliance and block devices are reused between tests. So don't try testing "
+"L</guestfs_kill_subprocess> :-x"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2211
+msgid ""
+"Each test starts with an initial scenario, selected using one of the "
+"C<Init*> expressions, described in C<generator/generator_types.ml>. These "
+"initialize the disks mentioned above in a particular way as documented in "
+"C<generator_types.ml>. You should not assume anything about the previous "
+"contents of other disks that are not initialized."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2217
+msgid ""
+"You can add a prerequisite clause to any individual test. This is a run-"
+"time check, which, if it fails, causes the test to be skipped. Useful if "
+"testing a command which might not work on all variations of libguestfs "
+"builds. A test that has prerequisite of C<Always> means to run "
+"unconditionally."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2223
+msgid ""
+"In addition, packagers can skip individual tests by setting environment "
+"variables before running C<make check>."
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2226
+#, no-wrap
+msgid ""
+" SKIP_TEST_<CMD>_<NUM>=1\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2228
+msgid "eg: C<SKIP_TEST_COMMAND_3=1> skips test #3 of L</guestfs_command>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2230
+msgid "or:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2232
+#, no-wrap
+msgid ""
+" SKIP_TEST_<CMD>=1\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2234
+msgid "eg: C<SKIP_TEST_ZEROFREE=1> skips all L</guestfs_zerofree> tests."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2236
+msgid "Packagers can run only certain tests by setting for example:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2238
+#, no-wrap
+msgid ""
+" TEST_ONLY=\"vfs_type zerofree\"\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2240
+msgid ""
+"See C<capitests/tests.c> for more details of how these environment variables "
+"work."
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2243
+msgid "DEBUGGING NEW API ACTIONS"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2245
+msgid "Test new actions work before submitting them."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2247
+msgid "You can use guestfish to try out new commands."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2249
+msgid ""
+"Debugging the daemon is a problem because it runs inside a minimal "
+"environment. However you can fprintf messages in the daemon to stderr, and "
+"they will show up if you use C<guestfish -v>."
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2253
+msgid "FORMATTING CODE AND OTHER CONVENTIONS"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2255
+msgid ""
+"Our C source code generally adheres to some basic code-formatting "
+"conventions. The existing code base is not totally consistent on this "
+"front, but we do prefer that contributed code be formatted similarly. In "
+"short, use spaces-not-TABs for indentation, use 2 spaces for each "
+"indentation level, and other than that, follow the K&R style."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2261
+msgid ""
+"If you use Emacs, add the following to one of one of your start-up files (e."
+"g., ~/.emacs), to help ensure that you get indentation right:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2264
+#, no-wrap
+msgid ""
+" ;;; In libguestfs, indent with spaces everywhere (not TABs).\n"
+" ;;; Exceptions: Makefile and ChangeLog modes.\n"
+" (add-hook 'find-file-hook\n"
+" '(lambda () (if (and buffer-file-name\n"
+" (string-match \"/libguestfs\\\\>\"\n"
+" (buffer-file-name))\n"
+" (not (string-equal mode-name \"Change Log\"))\n"
+" (not (string-equal mode-name \"Makefile\")))\n"
+" (setq indent-tabs-mode nil))))\n"
+" \n"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2274
+#, no-wrap
+msgid ""
+" ;;; When editing C sources in libguestfs, use this style.\n"
+" (defun libguestfs-c-mode ()\n"
+" \"C mode with adjusted defaults for use with libguestfs.\"\n"
+" (interactive)\n"
+" (c-set-style \"K&R\")\n"
+" (setq c-indent-level 2)\n"
+" (setq c-basic-offset 2))\n"
+" (add-hook 'c-mode-hook\n"
+" '(lambda () (if (string-match \"/libguestfs\\\\>\"\n"
+" (buffer-file-name))\n"
+" (libguestfs-c-mode))))\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2286
+msgid "Enable warnings when compiling (and fix any problems this finds):"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2289
+#, no-wrap
+msgid ""
+" ./configure --enable-gcc-warnings\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2291
+msgid "Useful targets are:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2293
+#, no-wrap
+msgid ""
+" make syntax-check # checks the syntax of the C code\n"
+" make check # runs the test suite\n"
+"\n"
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2296
+msgid "DAEMON CUSTOM PRINTF FORMATTERS"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2298
+msgid ""
+"In the daemon code we have created custom printf formatters C<%Q> and C<%R>, "
+"which are used to do shell quoting."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2303
+msgid "%Q"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2305
+msgid ""
+"Simple shell quoted string. Any spaces or other shell characters are "
+"escaped for you."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2308
+msgid "%R"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2310
+msgid ""
+"Same as C<%Q> except the string is treated as a path which is prefixed by "
+"the sysroot."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2315 ../fish/guestfish.pod:240 ../fish/guestfish.pod:594
+msgid "For example:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2317
+#, no-wrap
+msgid ""
+" asprintf (&cmd, \"cat %R\", path);\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2319
+msgid "would produce C<cat /sysroot/some\\ path\\ with\\ spaces>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2321
+msgid ""
+"I<Note:> Do I<not> use these when you are passing parameters to the C<command"
+"{,r,v,rv}()> functions. These parameters do NOT need to be quoted because "
+"they are not passed via the shell (instead, straight to exec). You probably "
+"want to use the C<sysroot_path()> function however."
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2327
+msgid "SUBMITTING YOUR NEW API ACTIONS"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2329
+msgid ""
+"Submit patches to the mailing list: L<http://www.redhat.com/mailman/listinfo/"
+"libguestfs> and CC to L<rjones@redhat.com>."
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2333
+msgid "INTERNATIONALIZATION (I18N) SUPPORT"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2335
+msgid "We support i18n (gettext anyhow) in the library."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2337
+msgid ""
+"However many messages come from the daemon, and we don't translate those at "
+"the moment. One reason is that the appliance generally has all locale files "
+"removed from it, because they take up a lot of space. So we'd have to readd "
+"some of those, as well as copying our PO files into the appliance."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2343
+msgid ""
+"Debugging messages are never translated, since they are intended for the "
+"programmers."
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2346
+msgid "SOURCE CODE SUBDIRECTORIES"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2350
+msgid "C<appliance>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2352
+msgid "The libguestfs appliance, build scripts and so on."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2354
+msgid "C<capitests>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2356
+msgid "Automated tests of the C API."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2358
+msgid "C<cat>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2360
+msgid ""
+"The L<virt-cat(1)>, L<virt-filesystems(1)> and L<virt-ls(1)> commands and "
+"documentation."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2363
+msgid "C<contrib>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2365
+msgid "Outside contributions, experimental parts."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2367
+msgid "C<daemon>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2369
+msgid ""
+"The daemon that runs inside the libguestfs appliance and carries out actions."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2372
+msgid "C<df>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2374
+msgid "L<virt-df(1)> command and documentation."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2376
+msgid "C<examples>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2378
+msgid "C API example code."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2380
+msgid "C<fish>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2382
+msgid ""
+"L<guestfish(1)>, the command-line shell, and various shell scripts built on "
+"top such as L<virt-copy-in(1)>, L<virt-copy-out(1)>, L<virt-tar-in(1)>, "
+"L<virt-tar-out(1)>."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2386
+msgid "C<fuse>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2388
+msgid ""
+"L<guestmount(1)>, FUSE (userspace filesystem) built on top of libguestfs."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2390
+msgid "C<generator>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2392
+msgid ""
+"The crucially important generator, used to automatically generate large "
+"amounts of boilerplate C code for things like RPC and bindings."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2395
+msgid "C<images>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2397
+msgid "Files used by the test suite."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2399
+msgid "Some \"phony\" guest images which we test against."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2401
+msgid "C<inspector>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2403
+msgid "L<virt-inspector(1)>, the virtual machine image inspector."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2405
+msgid "C<logo>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2407
+msgid "Logo used on the website. The fish is called Arthur by the way."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2409
+msgid "C<m4>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2411
+msgid "M4 macros used by autoconf."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2413
+msgid "C<po>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2415
+msgid "Translations of simple gettext strings."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2417
+msgid "C<po-docs>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2419
+msgid ""
+"The build infrastructure and PO files for translations of manpages and POD "
+"files. Eventually this will be combined with the C<po> directory, but that "
+"is rather complicated."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2423
+msgid "C<regressions>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2425
+msgid "Regression tests."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2427
+msgid "C<rescue>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2429
+msgid "L<virt-rescue(1)> command and documentation."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2431
+msgid "C<src>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2433
+msgid "Source code to the C library."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2435
+msgid "C<tools>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2437
+msgid "Command line tools written in Perl (L<virt-resize(1)> and many others)."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2439
+msgid "C<test-tool>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2441
+msgid ""
+"Test tool for end users to test if their qemu/kernel combination will work "
+"with libguestfs."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2444
+msgid "C<csharp>"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2446
+msgid "C<haskell>"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2448
+msgid "C<java>"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2450
+msgid "C<ocaml>"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2452
+msgid "C<php>"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2454
+msgid "C<perl>"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2456
+msgid "C<python>"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2458
+msgid "C<ruby>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2460
+msgid "Language bindings."
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:2464 ../fish/guestfish.pod:991
+#: ../test-tool/libguestfs-test-tool.pod:104 ../tools/virt-edit.pl:330
+msgid "ENVIRONMENT VARIABLES"
+msgstr ""
+
+# type: =item
+#. type: =item
+#: ../src/guestfs.pod:2468 ../fish/guestfish.pod:1017
+msgid "LIBGUESTFS_APPEND"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2470 ../fish/guestfish.pod:1019
+msgid "Pass additional options to the guest kernel."
+msgstr ""
+
+# type: =item
+#. type: =item
+#: ../src/guestfs.pod:2472 ../fish/guestfish.pod:1021
+msgid "LIBGUESTFS_DEBUG"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2474
+msgid ""
+"Set C<LIBGUESTFS_DEBUG=1> to enable verbose messages. This has the same "
+"effect as calling C<guestfs_set_verbose (g, 1)>."
+msgstr ""
+
+# type: =item
+#. type: =item
+#: ../src/guestfs.pod:2477 ../fish/guestfish.pod:1026
+msgid "LIBGUESTFS_MEMSIZE"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2479 ../fish/guestfish.pod:1028
+msgid ""
+"Set the memory allocated to the qemu process, in megabytes. For example:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:2482 ../fish/guestfish.pod:1031
+#, no-wrap
+msgid ""
+" LIBGUESTFS_MEMSIZE=700\n"
+"\n"
+msgstr ""
+
+# type: =item
+#. type: =item
+#: ../src/guestfs.pod:2484 ../fish/guestfish.pod:1033
+msgid "LIBGUESTFS_PATH"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2486
+msgid ""
+"Set the path that libguestfs uses to search for kernel and initrd.img. See "
+"the discussion of paths in section PATH above."
+msgstr ""
+
+# type: =item
+#. type: =item
+#: ../src/guestfs.pod:2489 ../fish/guestfish.pod:1038
+msgid "LIBGUESTFS_QEMU"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2491 ../fish/guestfish.pod:1040
+msgid ""
+"Set the default qemu binary that libguestfs uses. If not set, then the qemu "
+"which was found at compile time by the configure script is used."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2495
+msgid "See also L</QEMU WRAPPERS> above."
+msgstr ""
+
+# type: =item
+#. type: =item
+#: ../src/guestfs.pod:2497 ../fish/guestfish.pod:1044
+msgid "LIBGUESTFS_TRACE"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2499
+msgid ""
+"Set C<LIBGUESTFS_TRACE=1> to enable command traces. This has the same "
+"effect as calling C<guestfs_set_trace (g, 1)>."
+msgstr ""
+
+# type: =item
+#. type: =item
+#: ../src/guestfs.pod:2502 ../fish/guestfish.pod:1053
+msgid "TMPDIR"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2504 ../fish/guestfish.pod:1055
+msgid ""
+"Location of temporary directory, defaults to C</tmp> except for the cached "
+"supermin appliance which defaults to C</var/tmp>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2507 ../fish/guestfish.pod:1058
+msgid ""
+"If libguestfs was compiled to use the supermin appliance then the real "
+"appliance is cached in this directory, shared between all handles belonging "
+"to the same EUID. You can use C<$TMPDIR> to configure another directory to "
+"use in case C</var/tmp> is not large enough."
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:2515 ../fish/guestfish.pod:1116
+#: ../test-tool/libguestfs-test-tool.pod:109 ../fuse/guestmount.pod:233
+#: ../tools/virt-edit.pl:350 ../tools/virt-win-reg.pl:572
+#: ../tools/virt-resize.pl:1483 ../tools/virt-list-filesystems.pl:189
+#: ../tools/virt-tar.pl:286 ../tools/virt-make-fs.pl:534
+#: ../tools/virt-list-partitions.pl:257
+msgid "SEE ALSO"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2517
+msgid ""
+"L<guestfs-examples(3)>, L<guestfs-ocaml(3)>, L<guestfs-python(3)>, L<guestfs-"
+"ruby(3)>, L<guestfish(1)>, L<guestmount(1)>, L<virt-cat(1)>, L<virt-copy-in"
+"(1)>, L<virt-copy-out(1)>, L<virt-df(1)>, L<virt-edit(1)>, L<virt-filesystems"
+"(1)>, L<virt-inspector(1)>, L<virt-list-filesystems(1)>, L<virt-list-"
+"partitions(1)>, L<virt-ls(1)>, L<virt-make-fs(1)>, L<virt-rescue(1)>, L<virt-"
+"tar(1)>, L<virt-tar-in(1)>, L<virt-tar-out(1)>, L<virt-win-reg(1)>, L<qemu(1)"
+">, L<febootstrap(1)>, L<hivex(3)>, L<http://libguestfs.org/>."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2544
+msgid ""
+"Tools with a similar purpose: L<fdisk(8)>, L<parted(8)>, L<kpartx(8)>, L<lvm"
+"(8)>, L<disktype(1)>."
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:2551 ../tools/virt-win-reg.pl:587
+#: ../tools/virt-make-fs.pl:548
+msgid "BUGS"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2553
+msgid "To get a list of bugs against libguestfs use this link:"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2555
+msgid ""
+"L<https://bugzilla.redhat.com/buglist.cgi?"
+"component=libguestfs&product=Virtualization+Tools>"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2557
+msgid "To report a new bug against libguestfs use this link:"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2559
+msgid ""
+"L<https://bugzilla.redhat.com/enter_bug.cgi?"
+"component=libguestfs&product=Virtualization+Tools>"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2561
+msgid "When reporting a bug, please check:"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2567
+msgid "That the bug hasn't been reported already."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2571
+msgid "That you are testing a recent version."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2575
+msgid "Describe the bug accurately, and give a way to reproduce it."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2579
+msgid ""
+"Run libguestfs-test-tool and paste the B<complete, unedited> output into the "
+"bug report."
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:2584 ../fish/guestfish.pod:1139
+#: ../test-tool/libguestfs-test-tool.pod:115 ../fuse/guestmount.pod:244
+msgid "AUTHORS"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2586 ../fish/guestfish.pod:1141
+#: ../test-tool/libguestfs-test-tool.pod:117 ../fuse/guestmount.pod:246
+msgid "Richard W.M. Jones (C<rjones at redhat dot com>)"
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:2588 ../fish/guestfish.pod:1143
+#: ../test-tool/libguestfs-test-tool.pod:119 ../fuse/guestmount.pod:248
+#: ../tools/virt-edit.pl:368 ../tools/virt-win-reg.pl:602
+#: ../tools/virt-resize.pl:1508 ../tools/virt-list-filesystems.pl:206
+#: ../tools/virt-tar.pl:305 ../tools/virt-make-fs.pl:563
+#: ../tools/virt-list-partitions.pl:273
+msgid "COPYRIGHT"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2590 ../fish/guestfish.pod:1145
+#: ../fuse/guestmount.pod:250
+msgid "Copyright (C) 2009-2010 Red Hat Inc. L<http://libguestfs.org/>"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2593
+msgid ""
+"This library is free software; you can redistribute it and/or modify it "
+"under the terms of the GNU Lesser General Public License as published by the "
+"Free Software Foundation; either version 2 of the License, or (at your "
+"option) any later version."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2598
+msgid ""
+"This library is distributed in the hope that it will be useful, but WITHOUT "
+"ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or "
+"FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License "
+"for more details."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2603
+msgid ""
+"You should have received a copy of the GNU Lesser General Public License "
+"along with this library; if not, write to the Free Software Foundation, "
+"Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA"
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs-actions.pod:1
+msgid "guestfs_add_cdrom"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs-actions.pod:3
+#, no-wrap
+msgid ""
+" int\n"
+" guestfs_add_cdrom (guestfs_h *g,\n"
+" const char *filename);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:7 ../fish/guestfish-actions.pod:5
+msgid "This function adds a virtual CD-ROM disk image to the guest."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:9 ../fish/guestfish-actions.pod:7
+msgid "This is equivalent to the qemu parameter C<-cdrom filename>."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:17
+msgid ""
+"This call checks for the existence of C<filename>. This stops you from "
+"specifying other types of drive which are supported by qemu such as C<nbd:> "
+"and C<http:> URLs. To specify those, use the general C<guestfs_config> call "
+"instead."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:24
+msgid ""
+"If you just want to add an ISO file (often you use this as an efficient way "
+"to transfer large files into the guest), then you should probably use "
+"C<guestfs_add_drive_ro> instead."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:30 ../src/guestfs-actions.pod:126
+#: ../src/guestfs-actions.pod:187 ../src/guestfs-actions.pod:224
+#: ../src/guestfs-actions.pod:238 ../src/guestfs-actions.pod:259
+#: ../src/guestfs-actions.pod:279 ../src/guestfs-actions.pod:293
+#: ../src/guestfs-actions.pod:408 ../src/guestfs-actions.pod:428
+#: ../src/guestfs-actions.pod:442 ../src/guestfs-actions.pod:487
+#: ../src/guestfs-actions.pod:515 ../src/guestfs-actions.pod:533
+#: ../src/guestfs-actions.pod:600 ../src/guestfs-actions.pod:633
+#: ../src/guestfs-actions.pod:647 ../src/guestfs-actions.pod:662
+#: ../src/guestfs-actions.pod:761 ../src/guestfs-actions.pod:779
+#: ../src/guestfs-actions.pod:793 ../src/guestfs-actions.pod:807
+#: ../src/guestfs-actions.pod:968 ../src/guestfs-actions.pod:988
+#: ../src/guestfs-actions.pod:1006 ../src/guestfs-actions.pod:1090
+#: ../src/guestfs-actions.pod:1108 ../src/guestfs-actions.pod:1127
+#: ../src/guestfs-actions.pod:1141 ../src/guestfs-actions.pod:1161
+#: ../src/guestfs-actions.pod:1231 ../src/guestfs-actions.pod:1262
+#: ../src/guestfs-actions.pod:1287 ../src/guestfs-actions.pod:1324
+#: ../src/guestfs-actions.pod:1430 ../src/guestfs-actions.pod:1464
+#: ../src/guestfs-actions.pod:1682 ../src/guestfs-actions.pod:1704
+#: ../src/guestfs-actions.pod:1791 ../src/guestfs-actions.pod:2243
+#: ../src/guestfs-actions.pod:2387 ../src/guestfs-actions.pod:2448
+#: ../src/guestfs-actions.pod:2483 ../src/guestfs-actions.pod:3318
+#: ../src/guestfs-actions.pod:3333 ../src/guestfs-actions.pod:3353
+#: ../src/guestfs-actions.pod:3508 ../src/guestfs-actions.pod:3522
+#: ../src/guestfs-actions.pod:3535 ../src/guestfs-actions.pod:3549
+#: ../src/guestfs-actions.pod:3564 ../src/guestfs-actions.pod:3600
+#: ../src/guestfs-actions.pod:3672 ../src/guestfs-actions.pod:3692
+#: ../src/guestfs-actions.pod:3709 ../src/guestfs-actions.pod:3732
+#: ../src/guestfs-actions.pod:3755 ../src/guestfs-actions.pod:3787
+#: ../src/guestfs-actions.pod:3806 ../src/guestfs-actions.pod:3825
+#: ../src/guestfs-actions.pod:3860 ../src/guestfs-actions.pod:3872
+#: ../src/guestfs-actions.pod:3908 ../src/guestfs-actions.pod:3924
+#: ../src/guestfs-actions.pod:3937 ../src/guestfs-actions.pod:3952
+#: ../src/guestfs-actions.pod:3969 ../src/guestfs-actions.pod:4062
+#: ../src/guestfs-actions.pod:4082 ../src/guestfs-actions.pod:4095
+#: ../src/guestfs-actions.pod:4146 ../src/guestfs-actions.pod:4164
+#: ../src/guestfs-actions.pod:4182 ../src/guestfs-actions.pod:4198
+#: ../src/guestfs-actions.pod:4212 ../src/guestfs-actions.pod:4226
+#: ../src/guestfs-actions.pod:4243 ../src/guestfs-actions.pod:4258
+#: ../src/guestfs-actions.pod:4278 ../src/guestfs-actions.pod:4336
+#: ../src/guestfs-actions.pod:4409 ../src/guestfs-actions.pod:4440
+#: ../src/guestfs-actions.pod:4459 ../src/guestfs-actions.pod:4478
+#: ../src/guestfs-actions.pod:4490 ../src/guestfs-actions.pod:4507
+#: ../src/guestfs-actions.pod:4520 ../src/guestfs-actions.pod:4535
+#: ../src/guestfs-actions.pod:4550 ../src/guestfs-actions.pod:4585
+#: ../src/guestfs-actions.pod:4600 ../src/guestfs-actions.pod:4620
+#: ../src/guestfs-actions.pod:4634 ../src/guestfs-actions.pod:4651
+#: ../src/guestfs-actions.pod:4700 ../src/guestfs-actions.pod:4737
+#: ../src/guestfs-actions.pod:4751 ../src/guestfs-actions.pod:4779
+#: ../src/guestfs-actions.pod:4796 ../src/guestfs-actions.pod:4814
+#: ../src/guestfs-actions.pod:4948 ../src/guestfs-actions.pod:5005
+#: ../src/guestfs-actions.pod:5027 ../src/guestfs-actions.pod:5045
+#: ../src/guestfs-actions.pod:5077 ../src/guestfs-actions.pod:5143
+#: ../src/guestfs-actions.pod:5160 ../src/guestfs-actions.pod:5173
+#: ../src/guestfs-actions.pod:5187 ../src/guestfs-actions.pod:5476
+#: ../src/guestfs-actions.pod:5495 ../src/guestfs-actions.pod:5514
+#: ../src/guestfs-actions.pod:5526 ../src/guestfs-actions.pod:5538
+#: ../src/guestfs-actions.pod:5552 ../src/guestfs-actions.pod:5564
+#: ../src/guestfs-actions.pod:5578 ../src/guestfs-actions.pod:5594
+#: ../src/guestfs-actions.pod:5615 ../src/guestfs-actions.pod:5634
+#: ../src/guestfs-actions.pod:5653 ../src/guestfs-actions.pod:5671
+#: ../src/guestfs-actions.pod:5694 ../src/guestfs-actions.pod:5712
+#: ../src/guestfs-actions.pod:5731 ../src/guestfs-actions.pod:5752
+#: ../src/guestfs-actions.pod:5771 ../src/guestfs-actions.pod:5788
+#: ../src/guestfs-actions.pod:5816 ../src/guestfs-actions.pod:5840
+#: ../src/guestfs-actions.pod:5859 ../src/guestfs-actions.pod:5883
+#: ../src/guestfs-actions.pod:5898 ../src/guestfs-actions.pod:5913
+#: ../src/guestfs-actions.pod:5932 ../src/guestfs-actions.pod:5969
+#: ../src/guestfs-actions.pod:5992 ../src/guestfs-actions.pod:6018
+#: ../src/guestfs-actions.pod:6126 ../src/guestfs-actions.pod:6247
+#: ../src/guestfs-actions.pod:6259 ../src/guestfs-actions.pod:6272
+#: ../src/guestfs-actions.pod:6285 ../src/guestfs-actions.pod:6307
+#: ../src/guestfs-actions.pod:6320 ../src/guestfs-actions.pod:6333
+#: ../src/guestfs-actions.pod:6346 ../src/guestfs-actions.pod:6361
+#: ../src/guestfs-actions.pod:6420 ../src/guestfs-actions.pod:6437
+#: ../src/guestfs-actions.pod:6453 ../src/guestfs-actions.pod:6469
+#: ../src/guestfs-actions.pod:6486 ../src/guestfs-actions.pod:6499
+#: ../src/guestfs-actions.pod:6519 ../src/guestfs-actions.pod:6555
+#: ../src/guestfs-actions.pod:6569 ../src/guestfs-actions.pod:6610
+#: ../src/guestfs-actions.pod:6623 ../src/guestfs-actions.pod:6641
+#: ../src/guestfs-actions.pod:6675 ../src/guestfs-actions.pod:6711
+#: ../src/guestfs-actions.pod:6830 ../src/guestfs-actions.pod:6848
+#: ../src/guestfs-actions.pod:6862 ../src/guestfs-actions.pod:6917
+#: ../src/guestfs-actions.pod:6930 ../src/guestfs-actions.pod:6975
+#: ../src/guestfs-actions.pod:7008 ../src/guestfs-actions.pod:7062
+#: ../src/guestfs-actions.pod:7088 ../src/guestfs-actions.pod:7154
+#: ../src/guestfs-actions.pod:7173 ../src/guestfs-actions.pod:7202
+msgid "This function returns 0 on success or -1 on error."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:32 ../src/guestfs-actions.pod:240
+#: ../src/guestfs-actions.pod:261 ../fish/guestfish-actions.pod:28
+#: ../fish/guestfish-actions.pod:151 ../fish/guestfish-actions.pod:165
+msgid ""
+"This function is deprecated. In new code, use the C<add_drive_opts> call "
+"instead."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:35 ../src/guestfs-actions.pod:243
+#: ../src/guestfs-actions.pod:264 ../src/guestfs-actions.pod:1435
+#: ../src/guestfs-actions.pod:1921 ../src/guestfs-actions.pod:1942
+#: ../src/guestfs-actions.pod:4283 ../src/guestfs-actions.pod:7096
+#: ../src/guestfs-actions.pod:7265 ../fish/guestfish-actions.pod:31
+#: ../fish/guestfish-actions.pod:154 ../fish/guestfish-actions.pod:168
+#: ../fish/guestfish-actions.pod:949 ../fish/guestfish-actions.pod:1306
+#: ../fish/guestfish-actions.pod:1320 ../fish/guestfish-actions.pod:2895
+#: ../fish/guestfish-actions.pod:4723 ../fish/guestfish-actions.pod:4820
+msgid ""
+"Deprecated functions will not be removed from the API, but the fact that "
+"they are deprecated indicates that there are problems with correct use of "
+"these functions."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:39 ../src/guestfs-actions.pod:128
+#: ../src/guestfs-actions.pod:1092 ../src/guestfs-actions.pod:1893
+#: ../src/guestfs-actions.pod:1991 ../src/guestfs-actions.pod:2094
+#: ../src/guestfs-actions.pod:3320 ../src/guestfs-actions.pod:3335
+#: ../src/guestfs-actions.pod:4587 ../src/guestfs-actions.pod:5673
+#: ../src/guestfs-actions.pod:5790 ../src/guestfs-actions.pod:5900
+#: ../src/guestfs-actions.pod:6363 ../src/guestfs-actions.pod:6488
+#: ../src/guestfs-actions.pod:7010
+msgid "(Added in 0.3)"
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs-actions.pod:41
+msgid "guestfs_add_domain"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs-actions.pod:43
+#, no-wrap
+msgid ""
+" int\n"
+" guestfs_add_domain (guestfs_h *g,\n"
+" const char *dom,\n"
+" ...);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:48 ../src/guestfs-actions.pod:137
+#: ../src/guestfs-actions.pod:4297
+msgid ""
+"You may supply a list of optional arguments to this call. Use zero or more "
+"of the following pairs of parameters, and terminate the list with C<-1> on "
+"its own. See L</CALLS WITH OPTIONAL ARGUMENTS>."
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs-actions.pod:53
+#, no-wrap
+msgid ""
+" GUESTFS_ADD_DOMAIN_LIBVIRTURI, const char *libvirturi,\n"
+" GUESTFS_ADD_DOMAIN_READONLY, int readonly,\n"
+" GUESTFS_ADD_DOMAIN_IFACE, const char *iface,\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:57
+msgid ""
+"This function adds the disk(s) attached to the named libvirt domain C<dom>. "
+"It works by connecting to libvirt, requesting the domain and domain XML from "
+"libvirt, parsing it for disks, and calling C<guestfs_add_drive_opts> on each "
+"one."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:62 ../fish/guestfish-actions.pod:46
+msgid ""
+"The number of disks added is returned. This operation is atomic: if an "
+"error is returned, then no disks are added."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:65 ../fish/guestfish-actions.pod:49
+msgid ""
+"This function does some minimal checks to make sure the libvirt domain is "
+"not running (unless C<readonly> is true). In a future version we will try "
+"to acquire the libvirt lock on each disk."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:69 ../fish/guestfish-actions.pod:53
+msgid ""
+"Disks must be accessible locally. This often means that adding disks from a "
+"remote libvirt connection (see L<http://libvirt.org/remote.html>) will fail "
+"unless those disks are accessible via the same device path locally too."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs-actions.pod:74 ../fish/guestfish-actions.pod:58
+msgid ""
+"The optional C<libvirturi> parameter sets the libvirt URI (see L<http://"
+"libvirt.org/uri.html>). If this is not set then we connect to the default "
+"libvirt URI (or one set through an environment variable, see the libvirt "
+"documentation for full details)."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:80
+msgid ""
+"The other optional parameters are passed directly through to "
+"C<guestfs_add_drive_opts>."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:83 ../src/guestfs-actions.pod:336
+#: ../src/guestfs-actions.pod:501 ../src/guestfs-actions.pod:679
+#: ../src/guestfs-actions.pod:710 ../src/guestfs-actions.pod:728
+#: ../src/guestfs-actions.pod:747 ../src/guestfs-actions.pod:1307
+#: ../src/guestfs-actions.pod:1661 ../src/guestfs-actions.pod:1864
+#: ../src/guestfs-actions.pod:1963 ../src/guestfs-actions.pod:2003
+#: ../src/guestfs-actions.pod:2058 ../src/guestfs-actions.pod:2081
+#: ../src/guestfs-actions.pod:2374 ../src/guestfs-actions.pod:2701
+#: ../src/guestfs-actions.pod:2722 ../src/guestfs-actions.pod:4723
+#: ../src/guestfs-actions.pod:4851 ../src/guestfs-actions.pod:5257
+#: ../src/guestfs-actions.pod:5283 ../src/guestfs-actions.pod:6596
+#: ../src/guestfs-actions.pod:7021 ../src/guestfs-actions.pod:7034
+#: ../src/guestfs-actions.pod:7047
+msgid "On error this function returns -1."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs-actions.pod:85
+msgid "(Added in 1.7.4)"
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs-actions.pod:87
+msgid "guestfs_add_domain_va"