docs: Obsolete HACKING file, move content into guestfs(3) man page.
authorRichard W.M. Jones <rjones@redhat.com>
Sun, 19 Dec 2010 21:53:09 +0000 (21:53 +0000)
committerRichard W.M. Jones <rjones@redhat.com>
Mon, 10 Jan 2011 09:32:53 +0000 (09:32 +0000)
Add a new section called "EXTENDING LIBGUESTFS" to the
guestfs manual page which contains all the information
previously in "HACKING".
(cherry picked from commit d2400da92e5e2cc7fd5e33e61220a33214d5241c)

HACKING
Makefile.am
daemon/daemon.h
daemon/guestfsd.c
generator/generator_main.ml
generator/generator_types.ml
src/api-support/update-from-tarballs.sh
src/guestfs.pod

diff --git a/HACKING b/HACKING
index 1121deb..c1888df 100644 (file)
--- a/HACKING
+++ b/HACKING
@@ -1,258 +1,2 @@
-PLEASE LOOK AT THE TOP OF EACH FILE BEFORE EDITING TO SEE WHETHER IT
-IS AUTOMATICALLY GENERATED OR NOT.
-
-Adding a new action
-----------------------------------------------------------------------
-
-All action functions are generated automatically, so there are only
-two files you need to edit:
-
-(1) generator/generator_actions.ml: Add your new action, parameters,
-description, etc. to the big list at the top of this file.
-
-(2) Edit/create a C file in daemon/ subdirectory which implements your
-'do_action' function.  Take a look at one of the numerous examples
-there.
-
-Formatting
-----------------------------------------------------------------------
-
-Try to use GNU / Emacs default formatting, following the convention
-used elsewhere in the source.
-
-Please make sure that the code compiles without warnings.
-
-Please test any changes.
-
-Useful targets:
-  make syntax-check    Checks the syntax of the C code.
-  make check           Runs the test suite.
-
-Enable warnings, and fix any you find:
-  ./configure --enable-gcc-warnings
-
-Code indentation
-----------------------------------------------------------------------
-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.
-
-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:
-
-  ;;; In libguestfs, indent with spaces everywhere (not TABs).
-  ;;; Exceptions: Makefile and ChangeLog modes.
-  (add-hook 'find-file-hook
-      '(lambda () (if (and buffer-file-name
-                           (string-match "/libguestfs\\>" (buffer-file-name))
-                           (not (string-equal mode-name "Change Log"))
-                           (not (string-equal mode-name "Makefile")))
-                      (setq indent-tabs-mode nil))))
-
-  ;;; When editing C sources in libguestfs, use this style.
-  (defun libguestfs-c-mode ()
-    "C mode with adjusted defaults for use with libguestfs."
-    (interactive)
-    (c-set-style "K&R")
-    (setq c-indent-level 2)
-    (setq c-basic-offset 2))
-  (add-hook 'c-mode-hook
-            '(lambda () (if (string-match "/libguestfs\\>" (buffer-file-name))
-                            (libguestfs-c-mode))))
-
-Directories
-----------------------------------------------------------------------
-
-appliance/
-        The qemu appliance, build scripts and so on.
-
-capitests/
-        Automated tests of the C API.  See "Tests" below.
-
-cat/
-        The 'virt-cat', 'virt-filesystems' and 'virt-ls' commands and
-        documentation.
-
-contrib/
-        Outside contributions, experimental parts.
-
-csharp/
-        Experimental C# bindings.
-
-daemon/
-        The daemon that runs inside the guest and carries out actions.
-
-df/
-        'virt-df' command and documentation.
-
-examples/
-        The examples.
-
-fish/
-        Guestfish (the command-line program / shell)
-
-fuse/
-        FUSE (userspace filesystem) built on top of libguestfs.
-
-generator/
-        The crucially important generator, used to automatically
-        generate large amounts of boilerplate C code for things like
-        RPC and bindings.
-
-haskell/
-        Haskell bindings.
-
-hivex/ [removed in 1.0.85]
-       This used to contain the hivex library for reading and
-       writing Windows Registry binary hive files.  This is now
-       available as a separate upstream project.
-
-images/
-        Some guest images to test against.  These are gzipped to save
-        space.  You have to unzip them before use.
-
-        Also contains some files used by the test suite.
-
-inspector/
-        Virtual machine image inspector (virt-inspector).
-
-java/
-        Java bindings.
-
-m4/
-        M4 macros used by autoconf.
-
-ocaml/
-        OCaml bindings.
-
-php/
-        PHP bindings.
-
-po/
-        Translations of simple gettext strings.  For translations of
-        longer documents, see po-docs/.
-
-po-docs/
-        The build infrastructure and PO files for translations of
-        manpages and POD files.  Eventually this will be combined
-        with the po/ directory, but that is rather complicated.
-
-perl/
-        Perl bindings.
-
-python/
-        Python bindings.
-
-regressions/
-        Regression tests.
-
-rescue/
-        'virt-rescue' command and documentation.
-
-ruby/
-        Ruby bindings.
-
-tools/
-        Command line tools written in Perl (virt-resize and more).
-
-src/
-        Source code to the C library.
-
-test-tool/
-        Interactive qemu/kernel test tool.
-
-Tests
-----------------------------------------------------------------------
-
-You can supply zero or as many tests as you want per API call.
-
-The test environment has 4 block devices:
-  /dev/sda   500MB   General block device for testing.
-  /dev/sdb    50MB   /dev/sdb1 is an ext2 filesystem used for testing
-                     filesystem write operations.
-  /dev/sdc    10MB   Used in a few tests where 2 block devices are needed.
-  /dev/sdd     -     ISO with fixed content (see images/test.iso).
-
-To be able to run the tests in a reasonable amount of time, the
-virtual machine and block devices are reused between tests.  So don't
-try testing kill_subprocess :-x  Between each test we blockdev-setrw,
-umount-all, lvm-remove-all.
-
-Each test starts with an initial scenario, selected using one of the
-'Init*' expressions, described in generator/generator_types.ml.  These
-initialize the disks in a particular way as described.  You should not
-assume anything about the previous contents of other disks that are
-not initialized.
-
-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 'Always' is run
-unconditionally.
-
-In addition, packagers can skip individual tests by setting the
-environment variables: eg:
-
-  SKIP_TEST_<CMD>_<NUM>=1  SKIP_TEST_COMMAND_3=1  (skips test #3 of command)
-  SKIP_TEST_<CMD>=1        SKIP_TEST_ZEROFREE=1   (skips all zerofree tests)
-
-and packagers can run only certain tests by setting eg:
-
-  TEST_ONLY="vfs_type zerofree"
-
-See capitests/tests.c for more details of how these environment
-variables work.
-
-Debugging
-----------------------------------------------------------------------
-
-It's a good idea to use guestfish to try out new commands.
-
-Debugging the daemon is a problem because it runs inside a minimal
-qemu environment.  However you can print messages from the daemon, and
-they will show up if you use 'guestfish -v'.
-
-Patches
-----------------------------------------------------------------------
-
-Submit patches to the mailing list:
-http://www.redhat.com/mailman/listinfo/libguestfs
-and CC to rjones@redhat.com
-
-I18N
-----------------------------------------------------------------------
-
-We support i18n (gettext anyhow) in the library.
-
-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.
-
-Debugging messages are never translated, since they are intended for
-the programmers.
-
-Extended printf
-----------------------------------------------------------------------
-
-In the daemon code we have created custom printf formatters %Q and %R,
-which are used to do shell quoting.
-
-%Q => Simple shell quoted string.  Any spaces or other shell characters
-      are escaped for you.
-
-%R => Same as %Q except the string is treated as a path which is prefixed
-      by the sysroot.
-
-eg.
-
-asprintf (&cmd, "cat %R", path);
-==> "cat /sysroot/some\ path\ with\ spaces"
-
-Note: Do NOT use these when you are passing parameters to the
-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 sysroot_path() function however.
+The contents of this page have moved to the section "EXTENDING LIBGUESTFS"
+in the guestfs(3) man page.
index 0df92d4..66ec0c6 100644 (file)
@@ -128,7 +128,7 @@ HTMLFILES = \
        html/recipes.html \
        html/pod.css html/recipes.css
 
        html/recipes.html \
        html/pod.css html/recipes.css
 
-TEXTFILES = BUGS HACKING README RELEASE-NOTES ROADMAP TODO
+TEXTFILES = BUGS README RELEASE-NOTES ROADMAP TODO
 
 WEBSITEDIR = $(HOME)/d/redhat/websites/libguestfs
 
 
 WEBSITEDIR = $(HOME)/d/redhat/websites/libguestfs
 
index 1e58910..6845e1b 100644 (file)
@@ -81,8 +81,8 @@ extern int prog_exists (const char *prog);
 
 extern void udev_settle (void);
 
 
 extern void udev_settle (void);
 
-/* This just stops gcc from giving a warning about our custom
- * printf formatters %Q and %R.  See HACKING file for more
+/* This just stops gcc from giving a warning about our custom printf
+ * formatters %Q and %R.  See guestfs(3)/EXTENDING LIBGUESTFS for more
  * info about these.
  */
 static inline int
  * info about these.
  */
 static inline int
index e398b7d..16b900f 100644 (file)
@@ -974,7 +974,8 @@ trim (char *str)
 }
 
 /* printf helper function so we can use %Q ("quoted") and %R to print
 }
 
 /* printf helper function so we can use %Q ("quoted") and %R to print
- * shell-quoted strings.  See HACKING file for more details.
+ * shell-quoted strings.  See guestfs(3)/EXTENDING LIBGUESTFS for more
+ * details.
  */
 static int
 print_shell_quote (FILE *stream,
  */
 static int
 print_shell_quote (FILE *stream,
index 4ef9ba5..f3d3340 100644 (file)
@@ -50,7 +50,7 @@ let perror msg = function
 (* Main program. *)
 let () =
   let lock_fd =
 (* Main program. *)
 let () =
   let lock_fd =
-    try openfile "HACKING" [O_RDWR] 0
+    try openfile "BUGS" [O_RDWR] 0
     with
     | Unix_error (ENOENT, _, _) ->
         eprintf "\
     with
     | Unix_error (ENOENT, _, _) ->
         eprintf "\
@@ -60,7 +60,7 @@ Run it from the top source directory using the command
 ";
         exit 1
     | exn ->
 ";
         exit 1
     | exn ->
-        perror "open: HACKING" exn;
+        perror "open: BUGS" exn;
         exit 1 in
 
   (* Acquire a lock so parallel builds won't try to run the generator
         exit 1 in
 
   (* Acquire a lock so parallel builds won't try to run the generator
@@ -70,7 +70,7 @@ Run it from the top source directory using the command
    *)
   (try lockf lock_fd F_LOCK 1
    with exn ->
    *)
   (try lockf lock_fd F_LOCK 1
    with exn ->
-     perror "lock: HACKING" exn;
+     perror "lock: BUGS" exn;
      exit 1);
 
   (* Read the API versions file. *)
      exit 1);
 
   (* Read the API versions file. *)
index 369a49a..b6c2730 100644 (file)
@@ -218,7 +218,7 @@ and fish_output_t =
   | FishOutputOctal       (* for int return, print in octal *)
   | FishOutputHexadecimal (* for int return, print in hex *)
 
   | FishOutputOctal       (* for int return, print in octal *)
   | FishOutputHexadecimal (* for int return, print in hex *)
 
-(* See section "Tests" in HACKING file. *)
+(* See guestfs(3)/EXTENDING LIBGUESTFS. *)
 type tests = (test_init * test_prereq * test) list
 and test =
     (* Run the command sequence and just expect nothing to fail. *)
 type tests = (test_init * test_prereq * test) list
 and test =
     (* Run the command sequence and just expect nothing to fail. *)
index 59f78d9..8579825 100755 (executable)
@@ -16,7 +16,7 @@
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-if [ ! -f HACKING ]; then
+if [ ! -f BUGS ]; then
     echo "You should run this script from the top source directory."
     exit 1
 fi
     echo "You should run this script from the top source directory."
     exit 1
 fi
index 7d2f91c..93f31e6 100644 (file)
@@ -2088,6 +2088,348 @@ dot-oh release won't necessarily be so stable at this point, but by
 backporting fixes from development, that branch will stabilize over
 time.
 
 backporting fixes from development, that branch will stabilize over
 time.
 
+=head1 EXTENDING LIBGUESTFS
+
+=head2 ADDING A NEW API ACTION
+
+Large amounts of boilerplate code in libguestfs (RPC, bindings,
+documentation) are generated, and this makes it easy to extend the
+libguestfs API.
+
+To add a new API action there are two changes:
+
+=over 4
+
+=item 1.
+
+You need to add a description of the call (name, parameters, return
+type, tests, documentation) to C<generator/generator_actions.ml>.
+
+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.
+
+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.
+
+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>.
+
+=item 2.
+
+Implement the action (in C):
+
+For daemon actions, implement the function C<do_E<lt>nameE<gt>> in the
+C<daemon/> directory.
+
+For library actions, implement the function C<guestfs__E<lt>nameE<gt>>
+(note: double underscore) in the C<src/> directory.
+
+In either case, use another function as an example of what to do.
+
+=back
+
+After making these changes, use C<make> to compile.
+
+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.
+
+=head2 ADDING TESTS FOR AN API ACTION
+
+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.
+
+The following describes the test environment used when you add an API
+test in C<generator_actions.ml>.
+
+The test environment has 4 block devices:
+
+=over 4
+
+=item C</dev/sda> 500MB
+
+General block device for testing.
+
+=item C</dev/sdb> 50MB
+
+C</dev/sdb1> is an ext2 filesystem used for testing
+filesystem write operations.
+
+=item C</dev/sdc> 10MB
+
+Used in a few tests where two block devices are needed.
+
+=item C</dev/sdd>
+
+ISO with fixed content (see C<images/test.iso>).
+
+=back
+
+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
+
+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.
+
+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.
+
+In addition, packagers can skip individual tests by setting
+environment variables before running C<make check>.
+
+ SKIP_TEST_<CMD>_<NUM>=1
+
+eg: C<SKIP_TEST_COMMAND_3=1> skips test #3 of L</guestfs_command>.
+
+or:
+
+ SKIP_TEST_<CMD>=1
+
+eg: C<SKIP_TEST_ZEROFREE=1> skips all L</guestfs_zerofree> tests.
+
+Packagers can run only certain tests by setting for example:
+
+ TEST_ONLY="vfs_type zerofree"
+
+See C<capitests/tests.c> for more details of how these environment
+variables work.
+
+=head2 DEBUGGING NEW API ACTIONS
+
+Test new actions work before submitting them.
+
+You can use guestfish to try out new commands.
+
+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>.
+
+=head2 FORMATTING CODE AND OTHER CONVENTIONS
+
+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.
+
+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:
+
+ ;;; In libguestfs, indent with spaces everywhere (not TABs).
+ ;;; Exceptions: Makefile and ChangeLog modes.
+ (add-hook 'find-file-hook
+     '(lambda () (if (and buffer-file-name
+                          (string-match "/libguestfs\\>"
+                              (buffer-file-name))
+                          (not (string-equal mode-name "Change Log"))
+                          (not (string-equal mode-name "Makefile")))
+                     (setq indent-tabs-mode nil))))
+ ;;; When editing C sources in libguestfs, use this style.
+ (defun libguestfs-c-mode ()
+   "C mode with adjusted defaults for use with libguestfs."
+   (interactive)
+   (c-set-style "K&R")
+   (setq c-indent-level 2)
+   (setq c-basic-offset 2))
+ (add-hook 'c-mode-hook
+           '(lambda () (if (string-match "/libguestfs\\>"
+                               (buffer-file-name))
+                           (libguestfs-c-mode))))
+
+Enable warnings when compiling (and fix any problems this
+finds):
+
+ ./configure --enable-gcc-warnings
+
+Useful targets are:
+
+ make syntax-check  # checks the syntax of the C code
+ make check         # runs the test suite
+
+=head2 DAEMON CUSTOM PRINTF FORMATTERS
+
+In the daemon code we have created custom printf formatters C<%Q> and
+C<%R>, which are used to do shell quoting.
+
+=over 4
+
+=item %Q
+
+Simple shell quoted string.  Any spaces or other shell characters are
+escaped for you.
+
+=item %R
+
+Same as C<%Q> except the string is treated as a path which is prefixed
+by the sysroot.
+
+=back
+
+For example:
+
+ asprintf (&cmd, "cat %R", path);
+
+would produce C<cat /sysroot/some\ path\ with\ spaces>
+
+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.
+
+=head2 SUBMITTING YOUR NEW API ACTIONS
+
+Submit patches to the mailing list:
+L<http://www.redhat.com/mailman/listinfo/libguestfs>
+and CC to L<rjones@redhat.com>.
+
+=head2 INTERNATIONALIZATION (I18N) SUPPORT
+
+We support i18n (gettext anyhow) in the library.
+
+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.
+
+Debugging messages are never translated, since they are intended for
+the programmers.
+
+=head2 SOURCE CODE SUBDIRECTORIES
+
+=over 4
+
+=item C<appliance>
+
+The libguestfs appliance, build scripts and so on.
+
+=item C<capitests>
+
+Automated tests of the C API.
+
+=item C<cat>
+
+The L<virt-cat(1)>, L<virt-filesystems(1)> and L<virt-ls(1)> commands
+and documentation.
+
+=item C<contrib>
+
+Outside contributions, experimental parts.
+
+=item C<daemon>
+
+The daemon that runs inside the libguestfs appliance and carries out
+actions.
+
+=item C<df>
+
+L<virt-df(1)> command and documentation.
+
+=item C<examples>
+
+C API example code.
+
+=item C<fish>
+
+L<guestfish(1)>, the command-line shell.
+
+=item C<fuse>
+
+L<guestmount(1)>, FUSE (userspace filesystem) built on top of libguestfs.
+
+=item C<generator>
+
+The crucially important generator, used to automatically generate
+large amounts of boilerplate C code for things like RPC and bindings.
+
+=item C<images>
+
+Files used by the test suite.
+
+Some "phony" guest images which we test against.
+
+=item C<inspector>
+
+L<virt-inspector(1)>, the virtual machine image inspector.
+
+=item C<m4>
+
+M4 macros used by autoconf.
+
+=item C<po>
+
+Translations of simple gettext strings.
+
+=item C<po-docs>
+
+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.
+
+=item C<regressions>
+
+Regression tests.
+
+=item C<rescue>
+
+L<virt-rescue(1)> command and documentation.
+
+=item C<src>
+
+Source code to the C library.
+
+=item C<tools>
+
+Command line tools written in Perl (L<virt-resize(1)> and many others).
+
+=item C<test-tool>
+
+Test tool for end users to test if their qemu/kernel combination
+will work with libguestfs.
+
+=item C<csharp>
+
+=item C<haskell>
+
+=item C<java>
+
+=item C<ocaml>
+
+=item C<php>
+
+=item C<perl>
+
+=item C<python>
+
+=item C<ruby>
+
+Language bindings.
+
+=back
+
 =head1 ENVIRONMENT VARIABLES
 
 =over 4
 =head1 ENVIRONMENT VARIABLES
 
 =over 4