+#. type: verbatim
+#: ../src/guestfs.pod:2006
+#, 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
+#: ../src/guestfs.pod:2014
+msgid "INITIAL MESSAGE"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2016
+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
+#: ../src/guestfs.pod:2020
+msgid "PROGRESS NOTIFICATION MESSAGES"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2022
+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
+#: ../src/guestfs.pod:2026
+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
+#: ../src/guestfs.pod:2030
+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
+#: ../src/guestfs.pod:2034
+msgid "LIBGUESTFS VERSION NUMBERS"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2036
+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
+#: ../src/guestfs.pod:2041
+#, 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
+#: ../src/guestfs.pod:2052
+msgid "Thus \"1.3.5\" is the 5th update to the development branch \"1.3\"."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2054
+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
+#: ../src/guestfs.pod:2060
+msgid "Our criteria for backporting changes are:"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2066
+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
+#: ../src/guestfs.pod:2072
+msgid ""
+"Bug fixes which are not controversial, fix obvious problems, and have been "
+"well tested are backported."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2077
+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
+#: ../src/guestfs.pod:2083
+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
+#: ../src/guestfs.pod:2089
+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:2097
+msgid "EXTENDING LIBGUESTFS"
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2099
+msgid "ADDING A NEW API ACTION"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2101
+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:2105
+msgid "To add a new API action there are two changes:"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2111
+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:2114
+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:2122
+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:2128
+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:2136
+msgid "Implement the action (in C):"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2138
+msgid ""
+"For daemon actions, implement the function C<do_E<lt>nameE<gt>> in the "
+"C<daemon/> directory."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2141
+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:2144
+msgid "In either case, use another function as an example of what to do."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2148
+msgid "After making these changes, use C<make> to compile."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2150
+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:2154
+msgid "ADDING TESTS FOR AN API ACTION"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2156
+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:2162
+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:2165
+msgid "The test environment has 4 block devices:"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2169
+msgid "C</dev/sda> 500MB"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2171
+msgid "General block device for testing."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2173
+msgid "C</dev/sdb> 50MB"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2175
+msgid ""
+"C</dev/sdb1> is an ext2 filesystem used for testing filesystem write "
+"operations."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2178
+msgid "C</dev/sdc> 10MB"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2180
+msgid "Used in a few tests where two block devices are needed."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2182
+msgid "C</dev/sdd>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2184
+msgid "ISO with fixed content (see C<images/test.iso>)."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2188
+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:2192
+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:2198
+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:2204
+msgid ""
+"In addition, packagers can skip individual tests by setting environment "
+"variables before running C<make check>."
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2207
+#, no-wrap
+msgid ""
+" SKIP_TEST_<CMD>_<NUM>=1\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2209
+msgid "eg: C<SKIP_TEST_COMMAND_3=1> skips test #3 of L</guestfs_command>."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2211
+msgid "or:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2213
+#, no-wrap
+msgid ""
+" SKIP_TEST_<CMD>=1\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2215
+msgid "eg: C<SKIP_TEST_ZEROFREE=1> skips all L</guestfs_zerofree> tests."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2217
+msgid "Packagers can run only certain tests by setting for example:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2219
+#, no-wrap
+msgid ""
+" TEST_ONLY=\"vfs_type zerofree\"\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2221
+msgid ""
+"See C<capitests/tests.c> for more details of how these environment variables "
+"work."
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2224
+msgid "DEBUGGING NEW API ACTIONS"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2226
+msgid "Test new actions work before submitting them."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2228
+msgid "You can use guestfish to try out new commands."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2230
+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:2234
+msgid "FORMATTING CODE AND OTHER CONVENTIONS"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2236
+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:2242
+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:2245
+#, 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:2255
+#, 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:2267
+msgid "Enable warnings when compiling (and fix any problems this finds):"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2270
+#, no-wrap
+msgid ""
+" ./configure --enable-gcc-warnings\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2272
+msgid "Useful targets are:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2274
+#, 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:2277
+msgid "DAEMON CUSTOM PRINTF FORMATTERS"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2279
+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:2284
+msgid "%Q"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2286
+msgid ""
+"Simple shell quoted string. Any spaces or other shell characters are "
+"escaped for you."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2289
+msgid "%R"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2291
+msgid ""
+"Same as C<%Q> except the string is treated as a path which is prefixed by "
+"the sysroot."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2296 ../fish/guestfish.pod:240 ../fish/guestfish.pod:594
+msgid "For example:"
+msgstr ""
+
+#. type: verbatim
+#: ../src/guestfs.pod:2298
+#, no-wrap
+msgid ""
+" asprintf (&cmd, \"cat %R\", path);\n"
+"\n"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2300
+msgid "would produce C<cat /sysroot/some\\ path\\ with\\ spaces>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2302
+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:2308
+msgid "SUBMITTING YOUR NEW API ACTIONS"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2310
+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:2314
+msgid "INTERNATIONALIZATION (I18N) SUPPORT"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2316
+msgid "We support i18n (gettext anyhow) in the library."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2318
+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:2324
+msgid ""
+"Debugging messages are never translated, since they are intended for the "
+"programmers."
+msgstr ""
+
+#. type: =head2
+#: ../src/guestfs.pod:2327
+msgid "SOURCE CODE SUBDIRECTORIES"
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2331
+msgid "C<appliance>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2333
+msgid "The libguestfs appliance, build scripts and so on."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2335
+msgid "C<capitests>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2337
+msgid "Automated tests of the C API."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2339
+msgid "C<cat>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2341
+msgid ""
+"The L<virt-cat(1)>, L<virt-filesystems(1)> and L<virt-ls(1)> commands and "
+"documentation."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2344
+msgid "C<contrib>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2346
+msgid "Outside contributions, experimental parts."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2348
+msgid "C<daemon>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2350
+msgid ""
+"The daemon that runs inside the libguestfs appliance and carries out "
+"actions."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2353
+msgid "C<df>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2355
+msgid "L<virt-df(1)> command and documentation."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2357
+msgid "C<examples>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2359
+msgid "C API example code."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2361
+msgid "C<fish>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2363
+msgid "L<guestfish(1)>, the command-line shell."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2365
+msgid "C<fuse>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2367
+msgid "L<guestmount(1)>, FUSE (userspace filesystem) built on top of libguestfs."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2369
+msgid "C<generator>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2371
+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:2374
+msgid "C<images>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2376
+msgid "Files used by the test suite."
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2378
+msgid "Some \"phony\" guest images which we test against."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2380
+msgid "C<inspector>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2382
+msgid "L<virt-inspector(1)>, the virtual machine image inspector."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2384
+msgid "C<m4>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2386
+msgid "M4 macros used by autoconf."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2388
+msgid "C<po>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2390
+msgid "Translations of simple gettext strings."
+msgstr ""
+
+#. type: =item
+#: ../src/guestfs.pod:2392
+msgid "C<po-docs>"
+msgstr ""
+
+#. type: textblock
+#: ../src/guestfs.pod:2394
+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:2398
+msgid "C<regressions>"