+" guestfs_error_handler_cb guestfs_get_error_handler (guestfs_h *g,\n"
+" void **opaque_rtn);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1466
+msgid "Returns the current error handler callback."
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1468
+msgid "guestfs_set_out_of_memory_handler"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1470
+#, no-wrap
+msgid ""
+" typedef void (*guestfs_abort_cb) (void);\n"
+" int guestfs_set_out_of_memory_handler (guestfs_h *g,\n"
+" guestfs_abort_cb);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1474
+msgid ""
+"The callback C<cb> will be called if there is an out of memory situation. "
+"I<Note this callback must not return>."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1477
+msgid "The default is to call L<abort(3)>."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1479
+msgid ""
+"You cannot set C<cb> to C<NULL>. You can't ignore out of memory situations."
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1482
+msgid "guestfs_get_out_of_memory_handler"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1484
+#, no-wrap
+msgid ""
+" guestfs_abort_fn guestfs_get_out_of_memory_handler (guestfs_h *g);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1486
+msgid "This returns the current out of memory handler."
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:1488
+msgid "API CALLS"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1490 ../fish/guestfish.pod:1008
+msgid "@ACTIONS@"
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:1492
+msgid "STRUCTURES"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1494
+msgid "@STRUCTS@"
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:1496
+msgid "AVAILABILITY"
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1498
+msgid "GROUPS OF FUNCTIONALITY IN THE APPLIANCE"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1500
+msgid ""
+"Using L</guestfs_available> you can test availability of the following "
+"groups of functions. This test queries the appliance to see if the "
+"appliance you are currently using supports the functionality."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1505
+msgid "@AVAILABILITY@"
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1507
+msgid "GUESTFISH supported COMMAND"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1509
+msgid ""
+"In L<guestfish(3)> there is a handy interactive command C<supported> which "
+"prints out the available groups and whether they are supported by this build "
+"of libguestfs. Note however that you have to do C<run> first."
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1514
+msgid "SINGLE CALLS AT COMPILE TIME"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1516
+msgid ""
+"Since version 1.5.8, C<E<lt>guestfs.hE<gt>> defines symbols for each C API "
+"function, such as:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1519
+#, no-wrap
+msgid ""
+" #define LIBGUESTFS_HAVE_DD 1\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1521
+msgid "if L</guestfs_dd> is available."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1523
+msgid ""
+"Before version 1.5.8, if you needed to test whether a single libguestfs "
+"function is available at compile time, we recommended using build tools such "
+"as autoconf or cmake. For example in autotools you could use:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1528
+#, no-wrap
+msgid ""
+" AC_CHECK_LIB([guestfs],[guestfs_create])\n"
+" AC_CHECK_FUNCS([guestfs_dd])\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1531
+msgid ""
+"which would result in C<HAVE_GUESTFS_DD> being either defined or not defined "
+"in your program."
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1534
+msgid "SINGLE CALLS AT RUN TIME"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1536
+msgid ""
+"Testing at compile time doesn't guarantee that a function really exists in "
+"the library. The reason is that you might be dynamically linked against a "
+"previous I<libguestfs.so> (dynamic library) which doesn't have the call. "
+"This situation unfortunately results in a segmentation fault, which is a "
+"shortcoming of the C dynamic linking system itself."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1543
+msgid ""
+"You can use L<dlopen(3)> to test if a function is available at run time, as "
+"in this example program (note that you still need the compile time check as "
+"well):"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1547
+#, no-wrap
+msgid ""
+" #include <stdio.h>\n"
+" #include <stdlib.h>\n"
+" #include <unistd.h>\n"
+" #include <dlfcn.h>\n"
+" #include <guestfs.h>\n"
+" \n"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1553
+#, no-wrap
+msgid ""
+" main ()\n"
+" {\n"
+" #ifdef LIBGUESTFS_HAVE_DD\n"
+" void *dl;\n"
+" int has_function;\n"
+" \n"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1559
+#, no-wrap
+msgid ""
+" /* Test if the function guestfs_dd is really available. */\n"
+" dl = dlopen (NULL, RTLD_LAZY);\n"
+" if (!dl) {\n"
+" fprintf (stderr, \"dlopen: %s\\n\", dlerror ());\n"
+" exit (EXIT_FAILURE);\n"
+" }\n"
+" has_function = dlsym (dl, \"guestfs_dd\") != NULL;\n"
+" dlclose (dl);\n"
+" \n"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1568
+#, no-wrap
+msgid ""
+" if (!has_function)\n"
+" printf (\"this libguestfs.so does NOT have guestfs_dd function\\n\");\n"
+" else {\n"
+" printf (\"this libguestfs.so has guestfs_dd function\\n\");\n"
+" /* Now it's safe to call\n"
+" guestfs_dd (g, \"foo\", \"bar\");\n"
+" */\n"
+" }\n"
+" #else\n"
+" printf (\"guestfs_dd function was not found at compile time\\n\");\n"
+" #endif\n"
+" }\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1581
+msgid ""
+"You may think the above is an awful lot of hassle, and it is. There are "
+"other ways outside of the C linking system to ensure that this kind of "
+"incompatibility never arises, such as using package versioning:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1586
+#, no-wrap
+msgid ""
+" Requires: libguestfs >= 1.0.80\n"
+"\n"
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:1588
+msgid "CALLS WITH OPTIONAL ARGUMENTS"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1590
+msgid ""
+"A recent feature of the API is the introduction of calls which take optional "
+"arguments. In C these are declared 3 ways. The main way is as a call which "
+"takes variable arguments (ie. C<...>), as in this example:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1595
+#, no-wrap
+msgid ""
+" int guestfs_add_drive_opts (guestfs_h *g, const char *filename, ...);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1597
+msgid ""
+"Call this with a list of optional arguments, terminated by C<-1>. So to "
+"call with no optional arguments specified:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1600
+#, no-wrap
+msgid ""
+" guestfs_add_drive_opts (g, filename, -1);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1602
+msgid "With a single optional argument:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1604
+#, no-wrap
+msgid ""
+" guestfs_add_drive_opts (g, filename,\n"
+" GUESTFS_ADD_DRIVE_OPTS_FORMAT, \"qcow2\",\n"
+" -1);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1608
+msgid "With two:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1610
+#, no-wrap
+msgid ""
+" guestfs_add_drive_opts (g, filename,\n"
+" GUESTFS_ADD_DRIVE_OPTS_FORMAT, \"qcow2\",\n"
+" GUESTFS_ADD_DRIVE_OPTS_READONLY, 1,\n"
+" -1);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1615
+msgid ""
+"and so forth. Don't forget the terminating C<-1> otherwise Bad Things will "
+"happen!"
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1618
+msgid "USING va_list FOR OPTIONAL ARGUMENTS"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1620
+msgid ""
+"The second variant has the same name with the suffix C<_va>, which works the "
+"same way but takes a C<va_list>. See the C manual for details. For the "
+"example function, this is declared:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1624
+#, no-wrap
+msgid ""
+" int guestfs_add_drive_opts_va (guestfs_h *g, const char *filename,\n"
+" va_list args);\n"
+"\n"
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1627
+msgid "CONSTRUCTING OPTIONAL ARGUMENTS"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1629
+msgid ""
+"The third variant is useful where you need to construct these calls. You "
+"pass in a structure where you fill in the optional fields. The structure "
+"has a bitmask as the first element which you must set to indicate which "
+"fields you have filled in. For our example function the structure and call "
+"are declared:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1635
+#, no-wrap
+msgid ""
+" struct guestfs_add_drive_opts_argv {\n"
+" uint64_t bitmask;\n"
+" int readonly;\n"
+" const char *format;\n"
+" /* ... */\n"
+" };\n"
+" int guestfs_add_drive_opts_argv (guestfs_h *g, const char *filename,\n"
+" const struct guestfs_add_drive_opts_argv *optargs);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1644
+msgid "You could call it like this:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1646
+#, no-wrap
+msgid ""
+" struct guestfs_add_drive_opts_argv optargs = {\n"
+" .bitmask = GUESTFS_ADD_DRIVE_OPTS_READONLY_BITMASK |\n"
+" GUESTFS_ADD_DRIVE_OPTS_FORMAT_BITMASK,\n"
+" .readonly = 1,\n"
+" .format = \"qcow2\"\n"
+" };\n"
+" \n"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1653
+#, no-wrap
+msgid ""
+" guestfs_add_drive_opts_argv (g, filename, &optargs);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1655 ../src/guestfs-actions.pod:11
+#: ../src/guestfs-actions.pod:1855 ../fish/guestfish-actions.pod:9
+#: ../fish/guestfish-actions.pod:1260 ../tools/virt-win-reg.pl:532
+msgid "Notes:"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1661
+msgid "The C<_BITMASK> suffix on each option name when specifying the bitmask."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1666
+msgid "You do not need to fill in all fields of the structure."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1670
+msgid ""
+"There must be a one-to-one correspondence between fields of the structure "
+"that are filled in, and bits set in the bitmask."
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1675
+msgid "OPTIONAL ARGUMENTS IN OTHER LANGUAGES"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1677
+msgid ""
+"In other languages, optional arguments are expressed in the way that is "
+"natural for that language. We refer you to the language-specific "
+"documentation for more details on that."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1681
+msgid "For guestfish, see L<guestfish(1)/OPTIONAL ARGUMENTS>."
+msgstr ""
+
+# type: =head2
+#. type: =head2
+#: ../src/guestfs.pod:1683
+msgid "SETTING CALLBACKS TO HANDLE EVENTS"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1685
+msgid ""
+"B<Note:> This section documents the generic event mechanism introduced in "
+"libguestfs 1.10, which you should use in new code if possible. The old "
+"functions C<guestfs_set_log_message_callback>, "
+"C<guestfs_set_subprocess_quit_callback>, "
+"C<guestfs_set_launch_done_callback>, C<guestfs_set_close_callback> and "
+"C<guestfs_set_progress_callback> are no longer documented in this manual "
+"page."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1693
+msgid ""
+"Handles generate events when certain things happen, such as log messages "
+"being generated, progress messages during long-running operations, or the "
+"handle being closed. The API calls described below let you register a "
+"callback to be called when events happen. You can register multiple "
+"callbacks (for the same, different or overlapping sets of events), and "
+"individually remove callbacks. If callbacks are not removed, then they "
+"remain in force until the handle is closed."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1701
+msgid ""
+"In the current implementation, events are only generated synchronously: that "
+"means that events (and hence callbacks) can only happen while you are in the "
+"middle of making another libguestfs call. The callback is called in the "
+"same thread."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1706
+msgid ""
+"Events may contain a payload, usually nothing (void), an array of 64 bit "
+"unsigned integers, or a message buffer. Payloads are discussed later on."
+msgstr ""
+
+#. type: =head3
+#: ../src/guestfs.pod:1710
+msgid "CLASSES OF EVENTS"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:1714
+msgid "GUESTFS_EVENT_CLOSE (payload type: void)"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1717
+msgid ""
+"The callback function will be called while the handle is being closed "
+"(synchronously from L</guestfs_close>)."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1720
+msgid ""
+"Note that libguestfs installs an L<atexit(3)> handler to try to clean up "
+"handles that are open when the program exits. This means that this callback "
+"might be called indirectly from L<exit(3)>, which can cause unexpected "
+"problems in higher-level languages (eg. if your HLL interpreter has already "
+"been cleaned up by the time this is called, and if your callback then jumps "
+"into some HLL function)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1727
+msgid ""
+"If no callback is registered: the handle is closed without any callback "
+"being invoked."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:1730
+msgid "GUESTFS_EVENT_SUBPROCESS_QUIT (payload type: void)"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1733
+msgid ""
+"The callback function will be called when the child process quits, either "
+"asynchronously or if killed by L</guestfs_kill_subprocess>. (This "
+"corresponds to a transition from any state to the CONFIG state)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1737 ../src/guestfs.pod:1746
+msgid "If no callback is registered: the event is ignored."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:1739
+msgid "GUESTFS_EVENT_LAUNCH_DONE (payload type: void)"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1742
+msgid ""
+"The callback function will be called when the child process becomes ready "
+"first time after it has been launched. (This corresponds to a transition "
+"from LAUNCHING to the READY state)."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:1748
+msgid "GUESTFS_EVENT_PROGRESS (payload type: array of 4 x uint64_t)"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1751
+msgid ""
+"Some long-running operations can generate progress messages. If this "
+"callback is registered, then it will be called each time a progress message "
+"is generated (usually two seconds after the operation started, and three "
+"times per second thereafter until it completes, although the frequency may "
+"change in future versions)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1757
+msgid ""
+"The callback receives in the payload four unsigned 64 bit numbers which are "
+"(in order): C<proc_nr>, C<serial>, C<position>, C<total>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1760
+msgid ""
+"The units of C<total> are not defined, although for some operations C<total> "
+"may relate in some way to the amount of data to be transferred (eg. in bytes "
+"or megabytes), and C<position> may be the portion which has been transferred."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1765
+msgid "The only defined and stable parts of the API are:"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1771
+msgid ""
+"The callback can display to the user some type of progress bar or indicator "
+"which shows the ratio of C<position>:C<total>."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1776
+msgid "0 E<lt>= C<position> E<lt>= C<total>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1780
+msgid ""
+"If any progress notification is sent during a call, then a final progress "
+"notification is always sent when C<position> = C<total> (I<unless> the call "
+"fails with an error)."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1784
+msgid ""
+"This is to simplify caller code, so callers can easily set the progress "
+"indicator to \"100%\" at the end of the operation, without requiring special "
+"code to detect this case."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1790
+msgid ""
+"For some calls we are unable to estimate the progress of the call, but we "
+"can still generate progress messages to indicate activity. This is known as "
+"\"pulse mode\", and is directly supported by certain progress bar "
+"implementations (eg. GtkProgressBar)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1795
+msgid ""
+"For these calls, zero or more progress messages are generated with "
+"C<position = 0> and C<total = 1>, followed by a final message with "
+"C<position = total = 1>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1799
+msgid ""
+"As noted above, if the call fails with an error then the final message may "
+"not be generated."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1804
+msgid ""
+"The callback also receives the procedure number (C<proc_nr>) and serial "
+"number (C<serial>) of the call. These are only useful for debugging "
+"protocol issues, and the callback can normally ignore them. The callback "
+"may want to print these numbers in error messages or debugging messages."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1810
+msgid "If no callback is registered: progress messages are discarded."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:1812
+msgid "GUESTFS_EVENT_APPLIANCE (payload type: message buffer)"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1815
+msgid ""
+"The callback function is called whenever a log message is generated by qemu, "
+"the appliance kernel, guestfsd (daemon), or utility programs."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1818
+msgid ""
+"If the verbose flag (L</guestfs_set_verbose>) is set before launch (L</"
+"guestfs_launch>) then additional debug messages are generated."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1821 ../src/guestfs.pod:1835
+msgid ""
+"If no callback is registered: the messages are discarded unless the verbose "
+"flag is set in which case they are sent to stderr. You can override the "
+"printing of verbose messages to stderr by setting up a callback."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:1826
+msgid "GUESTFS_EVENT_LIBRARY (payload type: message buffer)"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1829
+msgid ""
+"The callback function is called whenever a log message is generated by the "
+"library part of libguestfs."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1832
+msgid ""
+"If the verbose flag (L</guestfs_set_verbose>) is set then additional debug "
+"messages are generated."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:1840
+msgid "GUESTFS_EVENT_TRACE (payload type: message buffer)"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1843
+msgid ""
+"The callback function is called whenever a trace message is generated. This "
+"only applies if the trace flag (L</guestfs_set_trace>) is set."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1846
+msgid ""
+"If no callback is registered: the messages are sent to stderr. You can "
+"override the printing of trace messages to stderr by setting up a callback."
+msgstr ""
+
+#. type: =head3
+#: ../src/guestfs.pod:1852
+msgid "guestfs_set_event_callback"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:1854
+#, no-wrap
+msgid ""
+" int guestfs_set_event_callback (guestfs_h *g,\n"
+" guestfs_event_callback cb,\n"
+" uint64_t event_bitmask,\n"
+" int flags,\n"
+" void *opaque);\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1860
+msgid ""
+"This function registers a callback (C<cb>) for all event classes in the "
+"C<event_bitmask>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1863
+msgid ""
+"For example, to register for all log message events, you could call this "
+"function with the bitmask C<GUESTFS_EVENT_APPLIANCE|GUESTFS_EVENT_LIBRARY>. "
+"To register a single callback for all possible classes of events, use "
+"C<GUESTFS_EVENT_ALL>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1869
+msgid "C<flags> should always be passed as 0."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1871
+msgid ""
+"C<opaque> is an opaque pointer which is passed to the callback. You can use "
+"it for any purpose."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1874
+msgid ""
+"The return value is the event handle (an integer) which you can use to "
+"delete the callback (see below)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1877
+msgid ""
+"If there is an error, this function returns C<-1>, and sets the error in the "
+"handle in the usual way (see L</guestfs_last_error> etc.)"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1880
+msgid ""
+"Callbacks remain in effect until they are deleted, or until the handle is "
+"closed."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1883
+msgid ""
+"In the case where multiple callbacks are registered for a particular event "
+"class, all of the callbacks are called. The order in which multiple "
+"callbacks are called is not defined."
+msgstr ""
+
+#. type: =head3
+#: ../src/guestfs.pod:1887
+msgid "guestfs_delete_event_callback"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:1889
+#, no-wrap
+msgid ""
+" void guestfs_delete_event_callback (guestfs_h *g, int event_handle);\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1891
+msgid ""
+"Delete a callback that was previously registered. C<event_handle> should be "
+"the integer that was returned by a previous call to "
+"C<guestfs_set_event_callback> on the same handle."
+msgstr ""
+
+#. type: =head3
+#: ../src/guestfs.pod:1895
+msgid "guestfs_event_callback"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:1897
+#, no-wrap
+msgid ""
+" typedef void (*guestfs_event_callback) (\n"
+" guestfs_h *g,\n"
+" void *opaque,\n"
+" uint64_t event,\n"
+" int event_handle,\n"
+" int flags,\n"
+" const char *buf, size_t buf_len,\n"
+" const uint64_t *array, size_t array_len);\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1906
+msgid ""
+"This is the type of the event callback function that you have to provide."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1909
+msgid ""
+"The basic parameters are: the handle (C<g>), the opaque user pointer "
+"(C<opaque>), the event class (eg. C<GUESTFS_EVENT_PROGRESS>), the event "
+"handle, and C<flags> which in the current API you should ignore."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1913
+msgid ""
+"The remaining parameters contain the event payload (if any). Each event may "
+"contain a payload, which usually relates to the event class, but for future "
+"proofing your code should be written to handle any payload for any event "
+"class."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1918
+msgid ""
+"C<buf> and C<buf_len> contain a message buffer (if C<buf_len == 0>, then "
+"there is no message buffer). Note that this message buffer can contain "
+"arbitrary 8 bit data, including NUL bytes."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1922
+msgid ""
+"C<array> and C<array_len> is an array of 64 bit unsigned integers. At the "
+"moment this is only used for progress messages."
+msgstr ""
+
+#. type: =head3
+#: ../src/guestfs.pod:1925
+msgid "EXAMPLE: CAPTURING LOG MESSAGES"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1927
+msgid ""
+"One motivation for the generic event API was to allow GUI programs to "
+"capture debug and other messages. In libguestfs E<le> 1.8 these were sent "
+"unconditionally to C<stderr>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1931
+msgid ""
+"Events associated with log messages are: C<GUESTFS_EVENT_LIBRARY>, "
+"C<GUESTFS_EVENT_APPLIANCE> and C<GUESTFS_EVENT_TRACE>. (Note that error "
+"messages are not events; you must capture error messages separately)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1936
+msgid ""
+"Programs have to set up a callback to capture the classes of events of "
+"interest:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:1939
+#, no-wrap
+msgid ""
+" int eh =\n"
+" guestfs_set_event_callback\n"
+" (g, message_callback,\n"
+" GUESTFS_EVENT_LIBRARY|GUESTFS_EVENT_APPLIANCE|\n"
+" GUESTFS_EVENT_TRACE,\n"
+" 0, NULL) == -1)\n"
+" if (eh == -1) {\n"
+" // handle error in the usual way\n"
+" }\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1949
+msgid ""
+"The callback can then direct messages to the appropriate place. In this "
+"example, messages are directed to syslog:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:1952
+#, no-wrap
+msgid ""
+" static void\n"
+" message_callback (\n"
+" guestfs_h *g,\n"
+" void *opaque,\n"
+" uint64_t event,\n"
+" int event_handle,\n"
+" int flags,\n"
+" const char *buf, size_t buf_len,\n"
+" const uint64_t *array, size_t array_len)\n"
+" {\n"
+" const int priority = LOG_USER|LOG_INFO;\n"
+" if (buf_len > 0)\n"
+" syslog (priority, \"event 0x%lx: %s\", event, buf);\n"
+" }\n"
+"\n"
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:1967
+msgid "PRIVATE DATA AREA"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:1969
+msgid ""
+"You can attach named pieces of private data to the libguestfs handle, fetch "
+"them by name, and walk over them, for the lifetime of the handle. This is "
+"called the private data area and is only available from the C API."
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1974
+msgid "To attach a named piece of data, use the following call:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1976
+#, 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:1978
+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:1982
+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:1987
+msgid "To retrieve the pointer, use:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:1989
+#, no-wrap
+msgid ""
+" void *guestfs_get_private (guestfs_h *g, const char *key);\n"
+"\n"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:1991
+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
+#: ../src/guestfs.pod:1995
+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_EVENT_CLOSE>)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2002
+msgid "To walk over all entries, use these two functions:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2004
+#, no-wrap
+msgid ""
+" void *guestfs_first_private (guestfs_h *g, const char **key_rtn);\n"
+"\n"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2006
+#, no-wrap
+msgid ""
+" void *guestfs_next_private (guestfs_h *g, const char **key_rtn);\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2008
+msgid ""
+"C<guestfs_first_private> returns the first key, pointer pair (\"first\" does "
+"not have any particular meaning -- keys are not returned in any defined "
+"order). A pointer to the key is returned in C<*key_rtn> and the "
+"corresponding data pointer is returned from the function. C<NULL> is "
+"returned if there are no keys stored in the handle."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2014
+msgid ""
+"C<guestfs_next_private> returns the next key, pointer pair. The return "
+"value of this function is also C<NULL> is there are no further entries to "
+"return."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2018
+msgid "Notes about walking over entries:"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2024
+msgid ""
+"You must not call C<guestfs_set_private> while walking over the entries."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2029
+msgid ""
+"The handle maintains an internal iterator which is reset when you call "
+"C<guestfs_first_private>. This internal iterator is invalidated when you "
+"call C<guestfs_set_private>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2035
+msgid "If you have set the data pointer associated with a key to C<NULL>, ie:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2037
+#, no-wrap
+msgid ""
+" guestfs_set_private (g, key, NULL);\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2039
+msgid "then that C<key> is not returned when walking."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2043
+msgid ""
+"C<*key_rtn> is only valid until the next call to C<guestfs_first_private>, "
+"C<guestfs_next_private> or C<guestfs_set_private>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2049
+msgid ""
+"The following example code shows how to print all keys and data pointers "
+"that are associated with the handle C<g>:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2052
+#, no-wrap
+msgid ""
+" const char *key;\n"
+" void *data = guestfs_first_private (g, &key);\n"
+" while (data != NULL)\n"
+" {\n"
+" printf (\"key = %s, data = %p\\n\", key, data);\n"
+" data = guestfs_next_private (g, &key);\n"
+" }\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2060
+msgid ""
+"More commonly you are only interested in keys that begin with an application-"
+"specific prefix C<foo_>. Modify the loop like so:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2063
+#, no-wrap
+msgid ""
+" const char *key;\n"
+" void *data = guestfs_first_private (g, &key);\n"
+" while (data != NULL)\n"
+" {\n"
+" if (strncmp (key, \"foo_\", strlen (\"foo_\")) == 0)\n"
+" printf (\"key = %s, data = %p\\n\", key, data);\n"
+" data = guestfs_next_private (g, &key);\n"
+" }\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2072
+msgid ""
+"If you need to modify keys while walking, then you have to jump back to the "
+"beginning of the loop. For example, to delete all keys prefixed with "
+"C<foo_>:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2076
+#, no-wrap
+msgid ""
+" const char *key;\n"
+" void *data;\n"
+" again:\n"
+" data = guestfs_first_private (g, &key);\n"
+" while (data != NULL)\n"
+" {\n"
+" if (strncmp (key, \"foo_\", strlen (\"foo_\")) == 0)\n"
+" {\n"
+" guestfs_set_private (g, key, NULL);\n"
+" /* note that 'key' pointer is now invalid, and so is\n"
+" the internal iterator */\n"
+" goto again;\n"
+" }\n"
+" data = guestfs_next_private (g, &key);\n"
+" }\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2092
+msgid ""
+"Note that the above loop is guaranteed to terminate because the keys are "
+"being deleted, but other manipulations of keys within the loop might not "
+"terminate unless you also maintain an indication of which keys have been "
+"visited."
+msgstr ""
+
+# type: =end
+#. type: =end
+#: ../src/guestfs.pod:2097 ../src/guestfs.pod:2102
+msgid "html"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2099
+msgid ""
+"<!-- old anchor for the next section --> <a name="
+"\"state_machine_and_low_level_event_api\"/>"
+msgstr ""
+
+# type: =head1
+#. type: =head1
+#: ../src/guestfs.pod:2104
+msgid "ARCHITECTURE"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2106
+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:2110
+#, 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:2130
+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:2133
+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:2142
+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:2149
+msgid "STATE MACHINE"
+msgstr ""
+
+# type: textblock
+#. type: textblock
+#: ../src/guestfs.pod:2151
+msgid "libguestfs uses a state machine to model the child process:"
+msgstr ""
+
+# type: verbatim
+#. type: verbatim
+#: ../src/guestfs.pod:2153
+#, no-wrap
+msgid ""
+" |\n"
+" guestfs_create\n"
+" |\n"
+" |\n"
+" ____V_____\n"
+" / \\\n"
+" | CONFIG |\n"
+" \\__________/\n"
+" ^ ^ ^ \\\n"
+" / | \\ \\ guestfs_launch\n"
+" / | _\\__V______\n"
+" / | / \\\n"