Files
libguestfs/HACKING
Richard Jones 1b21ed4f5d Add 'virt-rescue' command.
This command runs a "rescue appliance" against a virtual machine
or disk image.  This is useful for making ad-hoc interactive
changes to virtual machines.

  $ virt-rescue --ro /dev/vg_trick/F11x64

  Welcome to virt-rescue, the libguestfs rescue shell.

  Note: The contents of / are the rescue appliance.
  You have to mount the guest's partitions under /sysroot
  before you will be able to examine them.

  bash: cannot set terminal process group (-1): Inappropriate ioctl for device
  bash: no job control in this shell
  ><rescue> mount /dev/vg_f11x64/lv_root /sysroot
  EXT4-fs (dm-0): barriers enabled
  kjournald2 starting: pid 269, dev dm-0:8, commit interval 5 seconds
  EXT4-fs (dm-0): internal journal on dm-0:8
  EXT4-fs (dm-0): delayed allocation enabled
  EXT4-fs: file extents enabled
  EXT4-fs: mballoc enabled
  EXT4-fs (dm-0): mounted filesystem with ordered data mode
  ><rescue> ls /sysroot/
  bin   dev  home  lib64       media  opt   root  selinux  sys  usr
  boot  etc  lib   lost+found  mnt    proc  sbin  srv      tmp  var
  ><rescue> exit
2009-09-23 11:18:45 +01:00

189 lines
5.3 KiB
Plaintext

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) src/generator.ml: Add your new action, parameters, description,
etc. to the big list called 'functions' 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.
cat/
The virt-cat tool.
capitests/
Automated tests of the C API.
contrib/
Outside contributions, experimental parts.
daemon/
The daemon that runs inside the guest and carries out actions.
df/
The virt-df tool.
examples/
The examples.
fish/
Guestfish (the command-line program / shell)
haskell/
Haskell bindings.
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.
po/
Translations.
perl/
Perl bindings.
python/
Python bindings.
regressions/
Regression tests.
rescue/
The virt-rescue tool.
ruby/
Ruby bindings.
src/
Source code to the C library.
Also contains the crucial generator program.
test-tool/
Interactive qemu/kernel test tool.
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.