Java bindings compile, not tested.
authorRichard Jones <rjones@redhat.com>
Tue, 21 Apr 2009 20:14:55 +0000 (21:14 +0100)
committerRichard Jones <rjones@redhat.com>
Tue, 21 Apr 2009 20:14:55 +0000 (21:14 +0100)
14 files changed:
.gitignore
HACKING
configure.ac
java/Makefile.am
java/com/redhat/et/libguestfs/GuestFS.java [new file with mode: 0644]
java/com/redhat/et/libguestfs/IntBool.java [new file with mode: 0644]
java/com/redhat/et/libguestfs/LV.java [new file with mode: 0644]
java/com/redhat/et/libguestfs/LibGuestFSException.java [new file with mode: 0644]
java/com/redhat/et/libguestfs/PV.java [new file with mode: 0644]
java/com/redhat/et/libguestfs/Stat.java [new file with mode: 0644]
java/com/redhat/et/libguestfs/StatVFS.java [new file with mode: 0644]
java/com/redhat/et/libguestfs/VG.java [new file with mode: 0644]
java/com_redhat_et_libguestfs_GuestFS.c [new file with mode: 0644]
src/generator.ml

index e41c076..25d8a02 100644 (file)
@@ -12,6 +12,8 @@
 *.cmxa
 *.a
 *.so
+*.class
+*.jar
 Makefile.in
 Makefile
 aclocal.m4
@@ -40,6 +42,9 @@ initramfs
 initramfs.timestamp
 initramfs.*.img
 install-sh
+java/api
+java/com_redhat_et_libguestfs_GuestFS.h
+java/doc-stamp
 missing
 libguestfs.spec
 libguestfs-*.tar.gz
diff --git a/HACKING b/HACKING
index 85d094b..df20e2d 100644 (file)
--- a/HACKING
+++ b/HACKING
@@ -46,6 +46,9 @@ images/
 
        Also contains some files used by the test suite.
 
+java/
+       Java bindings.
+
 m4/
        M4 macros used by autoconf.
 
index 5270a67..3a59e65 100644 (file)
@@ -290,6 +290,17 @@ if test "x$with_java_home" != "xno"; then
        JAVAC_FLAGS="-source 1.5" ;;
     esac
     AC_MSG_RESULT([$JAVAC_FLAGS])
+
+    dnl Where to install jarfiles.
+    dnl XXX How to make it configurable?
+    JAR_INSTALL_DIR=\${prefix}/share/java
+    JNI_INSTALL_DIR=\${libdir}
+
+    dnl JNI version.
+    jni_major_version=`echo $VERSION | awk -F. '{print $1}'`
+    jni_minor_version=`echo $VERSION | awk -F. '{print $2}'`
+    jni_micro_version=`echo $VERSION | awk -F. '{print $3}'`
+    JNI_VERSION_INFO=`expr $jni_major_version + $jni_minor_version`:$jni_micro_version:$jni_minor_version
 fi
 
 AC_SUBST(JAVA_HOME)
@@ -300,6 +311,9 @@ AC_SUBST(JAVADOC)
 AC_SUBST(JAR)
 AC_SUBST(JNI_CFLAGS)
 AC_SUBST(JAVAC_FLAGS)
+AC_SUBST(JAR_INSTALL_DIR)
+AC_SUBST(JNI_INSTALL_DIR)
+AC_SUBST(JNI_VERSION_INFO)
 
 AM_CONDITIONAL([HAVE_JAVA],[test -n "$JAVAC"])
 
index 7e8786d..68f1d78 100644 (file)
 # along with this program; if not, write to the Free Software
 # Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 
-EXTRA_DIST =
+CPTH = com/redhat/et/libguestfs
 
-CLEANFILES = *~
+java_sources = \
+  $(CPTH)/LibGuestFSException.java \
+  $(CPTH)/IntBool.java \
+  $(CPTH)/PV.java \
+  $(CPTH)/VG.java \
+  $(CPTH)/LV.java \
+  $(CPTH)/Stat.java \
+  $(CPTH)/StatVFS.java \
+  $(CPTH)/GuestFS.java
+
+EXTRA_DIST = $(java_sources)
+
+CLEANFILES = *~ doc-stamp
 
 if HAVE_JAVA
 
+# Java source.
+
+libguestfs_jardir = $(JAR_INSTALL_DIR)
+libguestfs_jar_DATA = libguestfs-${VERSION}.jar
+libguestfs_jar_class_files = $(java_sources:.java=.class)
+$(libguestfs_jar_class_files): %.class: %.java
+       $(JAVAC) $(JAVAC_FLAGS) -classpath "$(CPTH)" $(java_sources)
+
+libguestfs-${VERSION}.jar: $(libguestfs_jar_class_files)
+       $(JAR) cf $@ $^
+
+# JNI source.
+
+lib_LTLIBRARIES = libguestfs_jni.la
+libguestfs_jni_la_SOURCES = \
+       com_redhat_et_libguestfs_GuestFS.h \
+       com_redhat_et_libguestfs_GuestFS.c
+
+libguestfs_jni_la_LIBADD = $(top_builddir)/src/libguestfs.la
+libguestfs_jni_la_LDFLAGS = -version-info $(JNI_VERSION_INFO)
+libguestfs_jni_la_CFLAGS = -Wall -I$(top_builddir)/src $(JNI_CFLAGS)
+
+BUILT_SOURCES = com_redhat_et_libguestfs_GuestFS.h
+
+com_redhat_et_libguestfs_GuestFS.h: $(CPTH)/GuestFS.class
+       $(JAVAH) -classpath ".:$(CPTH)" com.redhat.et.libguestfs.GuestFS
+
+# Documentation.
+
+noinst_SCRIPTS = doc-stamp
+
+doc-stamp: $(java_sources)
+       $(JAVADOC) $(JAVADOC_FLAGS) -d api \
+         -sourcepath $(srcdir) \
+         -windowtitle "libguestfs java $(VERSION) API reference" \
+         -doctitle "libguestfs java $(VERSION) API reference" \
+         com.redhat.et.libguestfs
+       touch $@
 
 endif
\ No newline at end of file
diff --git a/java/com/redhat/et/libguestfs/GuestFS.java b/java/com/redhat/et/libguestfs/GuestFS.java
new file mode 100644 (file)
index 0000000..8c2265e
--- /dev/null
@@ -0,0 +1,2083 @@
+/* libguestfs generated file
+ * WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.
+ * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+package com.redhat.et.libguestfs;
+
+import java.util.HashMap;
+import com.redhat.et.libguestfs.LibGuestFSException;
+import com.redhat.et.libguestfs.PV;
+import com.redhat.et.libguestfs.VG;
+import com.redhat.et.libguestfs.LV;
+import com.redhat.et.libguestfs.Stat;
+import com.redhat.et.libguestfs.StatVFS;
+import com.redhat.et.libguestfs.IntBool;
+
+/**
+ * The GuestFS object is a libguestfs handle.
+ *
+ * @author rjones
+ */
+public class GuestFS {
+  // Load the native code.
+  static {
+    System.loadLibrary ("guestfs_jni");
+  }
+
+  /**
+   * The native guestfs_h pointer.
+   */
+  long g;
+
+  /**
+   * Create a libguestfs handle.
+   *
+   * @throws LibGuestFSException
+   */
+  public GuestFS () throws LibGuestFSException
+  {
+    g = _create ();
+  }
+  private native long _create () throws LibGuestFSException;
+
+  /**
+   * Close a libguestfs handle.
+   *
+   * You can also leave handles to be collected by the garbage
+   * collector, but this method ensures that the resources used
+   * by the handle are freed up immediately.  If you call any
+   * other methods after closing the handle, you will get an
+   * exception.
+   *
+   * @throws LibGuestFSException
+   */
+  public void close () throws LibGuestFSException
+  {
+    if (g != 0)
+      _close (g);
+    g = 0;
+  }
+  private native void _close (long g) throws LibGuestFSException;
+
+  public void finalize () throws LibGuestFSException
+  {
+    close ();
+  }
+
+  /**
+   * launch the qemu subprocess
+   *
+   * Internally libguestfs is implemented by running a
+   * virtual machine using qemu(1).
+   * 
+   * You should call this after configuring the handle (eg.
+   * adding drives) but before performing any actions.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void launch ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("launch: handle is closed");
+    _launch (g);
+  }
+  private native void _launch (long g)
+    throws LibGuestFSException;
+
+  /**
+   * wait until the qemu subprocess launches
+   *
+   * Internally libguestfs is implemented by running a
+   * virtual machine using qemu(1).
+   * 
+   * You should call this after "g.launch" to wait for the
+   * launch to complete.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void wait_ready ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("wait_ready: handle is closed");
+    _wait_ready (g);
+  }
+  private native void _wait_ready (long g)
+    throws LibGuestFSException;
+
+  /**
+   * kill the qemu subprocess
+   *
+   * This kills the qemu subprocess. You should never need to
+   * call this.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void kill_subprocess ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("kill_subprocess: handle is closed");
+    _kill_subprocess (g);
+  }
+  private native void _kill_subprocess (long g)
+    throws LibGuestFSException;
+
+  /**
+   * add an image to examine or modify
+   *
+   * This function adds a virtual machine disk image
+   * "filename" to the guest. The first time you call this
+   * function, the disk appears as IDE disk 0 ("/dev/sda") in
+   * the guest, the second time as "/dev/sdb", and so on.
+   * 
+   * You don't necessarily need to be root when using
+   * libguestfs. However you obviously do need sufficient
+   * permissions to access the filename for whatever
+   * operations you want to perform (ie. read access if you
+   * just want to read the image or write access if you want
+   * to modify the image).
+   * 
+   * This is equivalent to the qemu parameter "-drive
+   * file=filename".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void add_drive (String filename)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("add_drive: handle is closed");
+    _add_drive (g, filename);
+  }
+  private native void _add_drive (long g, String filename)
+    throws LibGuestFSException;
+
+  /**
+   * add a CD-ROM disk image to examine
+   *
+   * This function adds a virtual CD-ROM disk image to the
+   * guest.
+   * 
+   * This is equivalent to the qemu parameter "-cdrom
+   * filename".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void add_cdrom (String filename)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("add_cdrom: handle is closed");
+    _add_cdrom (g, filename);
+  }
+  private native void _add_cdrom (long g, String filename)
+    throws LibGuestFSException;
+
+  /**
+   * add qemu parameters
+   *
+   * This can be used to add arbitrary qemu command line
+   * parameters of the form "-param value". Actually it's not
+   * quite arbitrary - we prevent you from setting some
+   * parameters which would interfere with parameters that we
+   * use.
+   * 
+   * The first character of "param" string must be a "-"
+   * (dash).
+   * 
+   * "value" can be NULL.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void config (String qemuparam, String qemuvalue)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("config: handle is closed");
+    _config (g, qemuparam, qemuvalue);
+  }
+  private native void _config (long g, String qemuparam, String qemuvalue)
+    throws LibGuestFSException;
+
+  /**
+   * set the search path
+   *
+   * Set the path that libguestfs searches for kernel and
+   * initrd.img.
+   * 
+   * The default is "$libdir/guestfs" unless overridden by
+   * setting "LIBGUESTFS_PATH" environment variable.
+   * 
+   * The string "path" is stashed in the libguestfs handle,
+   * so the caller must make sure it remains valid for the
+   * lifetime of the handle.
+   * 
+   * Setting "path" to "NULL" restores the default path.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void set_path (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("set_path: handle is closed");
+    _set_path (g, path);
+  }
+  private native void _set_path (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * get the search path
+   *
+   * Return the current search path.
+   * 
+   * This is always non-NULL. If it wasn't set already, then
+   * this will return the default path.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String get_path ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("get_path: handle is closed");
+    return _get_path (g);
+  }
+  private native String _get_path (long g)
+    throws LibGuestFSException;
+
+  /**
+   * set autosync mode
+   *
+   * If "autosync" is true, this enables autosync. Libguestfs
+   * will make a best effort attempt to run "g.sync" when the
+   * handle is closed (also if the program exits without
+   * closing handles).
+   * 
+   * @throws LibGuestFSException
+   */
+  public void set_autosync (boolean autosync)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("set_autosync: handle is closed");
+    _set_autosync (g, autosync);
+  }
+  private native void _set_autosync (long g, boolean autosync)
+    throws LibGuestFSException;
+
+  /**
+   * get autosync mode
+   *
+   * Get the autosync flag.
+   * 
+   * @throws LibGuestFSException
+   */
+  public boolean get_autosync ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("get_autosync: handle is closed");
+    return _get_autosync (g);
+  }
+  private native boolean _get_autosync (long g)
+    throws LibGuestFSException;
+
+  /**
+   * set verbose mode
+   *
+   * If "verbose" is true, this turns on verbose messages (to
+   * "stderr").
+   * 
+   * Verbose messages are disabled unless the environment
+   * variable "LIBGUESTFS_DEBUG" is defined and set to 1.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void set_verbose (boolean verbose)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("set_verbose: handle is closed");
+    _set_verbose (g, verbose);
+  }
+  private native void _set_verbose (long g, boolean verbose)
+    throws LibGuestFSException;
+
+  /**
+   * get verbose mode
+   *
+   * This returns the verbose messages flag.
+   * 
+   * @throws LibGuestFSException
+   */
+  public boolean get_verbose ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("get_verbose: handle is closed");
+    return _get_verbose (g);
+  }
+  private native boolean _get_verbose (long g)
+    throws LibGuestFSException;
+
+  /**
+   * is ready to accept commands
+   *
+   * This returns true iff this handle is ready to accept
+   * commands (in the "READY" state).
+   * 
+   * For more information on states, see guestfs(3).
+   * 
+   * @throws LibGuestFSException
+   */
+  public boolean is_ready ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("is_ready: handle is closed");
+    return _is_ready (g);
+  }
+  private native boolean _is_ready (long g)
+    throws LibGuestFSException;
+
+  /**
+   * is in configuration state
+   *
+   * This returns true iff this handle is being configured
+   * (in the "CONFIG" state).
+   * 
+   * For more information on states, see guestfs(3).
+   * 
+   * @throws LibGuestFSException
+   */
+  public boolean is_config ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("is_config: handle is closed");
+    return _is_config (g);
+  }
+  private native boolean _is_config (long g)
+    throws LibGuestFSException;
+
+  /**
+   * is launching subprocess
+   *
+   * This returns true iff this handle is launching the
+   * subprocess (in the "LAUNCHING" state).
+   * 
+   * For more information on states, see guestfs(3).
+   * 
+   * @throws LibGuestFSException
+   */
+  public boolean is_launching ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("is_launching: handle is closed");
+    return _is_launching (g);
+  }
+  private native boolean _is_launching (long g)
+    throws LibGuestFSException;
+
+  /**
+   * is busy processing a command
+   *
+   * This returns true iff this handle is busy processing a
+   * command (in the "BUSY" state).
+   * 
+   * For more information on states, see guestfs(3).
+   * 
+   * @throws LibGuestFSException
+   */
+  public boolean is_busy ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("is_busy: handle is closed");
+    return _is_busy (g);
+  }
+  private native boolean _is_busy (long g)
+    throws LibGuestFSException;
+
+  /**
+   * get the current state
+   *
+   * This returns the current state as an opaque integer.
+   * This is only useful for printing debug and internal
+   * error messages.
+   * 
+   * For more information on states, see guestfs(3).
+   * 
+   * @throws LibGuestFSException
+   */
+  public int get_state ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("get_state: handle is closed");
+    return _get_state (g);
+  }
+  private native int _get_state (long g)
+    throws LibGuestFSException;
+
+  /**
+   * set state to busy
+   *
+   * This sets the state to "BUSY". This is only used when
+   * implementing actions using the low-level API.
+   * 
+   * For more information on states, see guestfs(3).
+   * 
+   * @throws LibGuestFSException
+   */
+  public void set_busy ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("set_busy: handle is closed");
+    _set_busy (g);
+  }
+  private native void _set_busy (long g)
+    throws LibGuestFSException;
+
+  /**
+   * set state to ready
+   *
+   * This sets the state to "READY". This is only used when
+   * implementing actions using the low-level API.
+   * 
+   * For more information on states, see guestfs(3).
+   * 
+   * @throws LibGuestFSException
+   */
+  public void set_ready ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("set_ready: handle is closed");
+    _set_ready (g);
+  }
+  private native void _set_ready (long g)
+    throws LibGuestFSException;
+
+  /**
+   * mount a guest disk at a position in the filesystem
+   *
+   * Mount a guest disk at a position in the filesystem.
+   * Block devices are named "/dev/sda", "/dev/sdb" and so
+   * on, as they were added to the guest. If those block
+   * devices contain partitions, they will have the usual
+   * names (eg. "/dev/sda1"). Also LVM "/dev/VG/LV"-style
+   * names can be used.
+   * 
+   * The rules are the same as for mount(2): A filesystem
+   * must first be mounted on "/" before others can be
+   * mounted. Other filesystems can only be mounted on
+   * directories which already exist.
+   * 
+   * The mounted filesystem is writable, if we have
+   * sufficient permissions on the underlying device.
+   * 
+   * The filesystem options "sync" and "noatime" are set with
+   * this call, in order to improve reliability.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void mount (String device, String mountpoint)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("mount: handle is closed");
+    _mount (g, device, mountpoint);
+  }
+  private native void _mount (long g, String device, String mountpoint)
+    throws LibGuestFSException;
+
+  /**
+   * sync disks, writes are flushed through to the disk image
+   *
+   * This syncs the disk, so that any writes are flushed
+   * through to the underlying disk image.
+   * 
+   * You should always call this if you have modified a disk
+   * image, before closing the handle.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void sync ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("sync: handle is closed");
+    _sync (g);
+  }
+  private native void _sync (long g)
+    throws LibGuestFSException;
+
+  /**
+   * update file timestamps or create a new file
+   *
+   * Touch acts like the touch(1) command. It can be used to
+   * update the timestamps on a file, or, if the file does
+   * not exist, to create a new zero-length file.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void touch (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("touch: handle is closed");
+    _touch (g, path);
+  }
+  private native void _touch (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * list the contents of a file
+   *
+   * Return the contents of the file named "path".
+   * 
+   * Note that this function cannot correctly handle binary
+   * files (specifically, files containing "\0" character
+   * which is treated as end of string). For those you need
+   * to use the "g.download" function which has a more
+   * complex interface.
+   * 
+   * Because of the message protocol, there is a transfer
+   * limit of somewhere between 2MB and 4MB. To transfer
+   * large files you should use FTP.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String cat (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("cat: handle is closed");
+    return _cat (g, path);
+  }
+  private native String _cat (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * list the files in a directory (long format)
+   *
+   * List the files in "directory" (relative to the root
+   * directory, there is no cwd) in the format of 'ls -la'.
+   * 
+   * This command is mostly useful for interactive sessions.
+   * It is *not* intended that you try to parse the output
+   * string.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String ll (String directory)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("ll: handle is closed");
+    return _ll (g, directory);
+  }
+  private native String _ll (long g, String directory)
+    throws LibGuestFSException;
+
+  /**
+   * list the files in a directory
+   *
+   * List the files in "directory" (relative to the root
+   * directory, there is no cwd). The '.' and '..' entries
+   * are not returned, but hidden files are shown.
+   * 
+   * This command is mostly useful for interactive sessions.
+   * Programs should probably use "g.readdir" instead.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] ls (String directory)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("ls: handle is closed");
+    return _ls (g, directory);
+  }
+  private native String[] _ls (long g, String directory)
+    throws LibGuestFSException;
+
+  /**
+   * list the block devices
+   *
+   * List all the block devices.
+   * 
+   * The full block device names are returned, eg. "/dev/sda"
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] list_devices ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("list_devices: handle is closed");
+    return _list_devices (g);
+  }
+  private native String[] _list_devices (long g)
+    throws LibGuestFSException;
+
+  /**
+   * list the partitions
+   *
+   * List all the partitions detected on all block devices.
+   * 
+   * The full partition device names are returned, eg.
+   * "/dev/sda1"
+   * 
+   * This does not return logical volumes. For that you will
+   * need to call "g.lvs".
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] list_partitions ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("list_partitions: handle is closed");
+    return _list_partitions (g);
+  }
+  private native String[] _list_partitions (long g)
+    throws LibGuestFSException;
+
+  /**
+   * list the LVM physical volumes (PVs)
+   *
+   * List all the physical volumes detected. This is the
+   * equivalent of the pvs(8) command.
+   * 
+   * This returns a list of just the device names that
+   * contain PVs (eg. "/dev/sda2").
+   * 
+   * See also "g.pvs_full".
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] pvs ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("pvs: handle is closed");
+    return _pvs (g);
+  }
+  private native String[] _pvs (long g)
+    throws LibGuestFSException;
+
+  /**
+   * list the LVM volume groups (VGs)
+   *
+   * List all the volumes groups detected. This is the
+   * equivalent of the vgs(8) command.
+   * 
+   * This returns a list of just the volume group names that
+   * were detected (eg. "VolGroup00").
+   * 
+   * See also "g.vgs_full".
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] vgs ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("vgs: handle is closed");
+    return _vgs (g);
+  }
+  private native String[] _vgs (long g)
+    throws LibGuestFSException;
+
+  /**
+   * list the LVM logical volumes (LVs)
+   *
+   * List all the logical volumes detected. This is the
+   * equivalent of the lvs(8) command.
+   * 
+   * This returns a list of the logical volume device names
+   * (eg. "/dev/VolGroup00/LogVol00").
+   * 
+   * See also "g.lvs_full".
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] lvs ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("lvs: handle is closed");
+    return _lvs (g);
+  }
+  private native String[] _lvs (long g)
+    throws LibGuestFSException;
+
+  /**
+   * list the LVM physical volumes (PVs)
+   *
+   * List all the physical volumes detected. This is the
+   * equivalent of the pvs(8) command. The "full" version
+   * includes all fields.
+   * 
+   * @throws LibGuestFSException
+   */
+  public PV[] pvs_full ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("pvs_full: handle is closed");
+    return _pvs_full (g);
+  }
+  private native PV[] _pvs_full (long g)
+    throws LibGuestFSException;
+
+  /**
+   * list the LVM volume groups (VGs)
+   *
+   * List all the volumes groups detected. This is the
+   * equivalent of the vgs(8) command. The "full" version
+   * includes all fields.
+   * 
+   * @throws LibGuestFSException
+   */
+  public VG[] vgs_full ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("vgs_full: handle is closed");
+    return _vgs_full (g);
+  }
+  private native VG[] _vgs_full (long g)
+    throws LibGuestFSException;
+
+  /**
+   * list the LVM logical volumes (LVs)
+   *
+   * List all the logical volumes detected. This is the
+   * equivalent of the lvs(8) command. The "full" version
+   * includes all fields.
+   * 
+   * @throws LibGuestFSException
+   */
+  public LV[] lvs_full ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("lvs_full: handle is closed");
+    return _lvs_full (g);
+  }
+  private native LV[] _lvs_full (long g)
+    throws LibGuestFSException;
+
+  /**
+   * read file as lines
+   *
+   * Return the contents of the file named "path".
+   * 
+   * The file contents are returned as a list of lines.
+   * Trailing "LF" and "CRLF" character sequences are *not*
+   * returned.
+   * 
+   * Note that this function cannot correctly handle binary
+   * files (specifically, files containing "\0" character
+   * which is treated as end of line). For those you need to
+   * use the "g.read_file" function which has a more complex
+   * interface.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] read_lines (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("read_lines: handle is closed");
+    return _read_lines (g, path);
+  }
+  private native String[] _read_lines (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * create a new Augeas handle
+   *
+   * Create a new Augeas handle for editing configuration
+   * files. If there was any previous Augeas handle
+   * associated with this guestfs session, then it is closed.
+   * 
+   * You must call this before using any other "g.aug_*"
+   * commands.
+   * 
+   * "root" is the filesystem root. "root" must not be NULL,
+   * use "/" instead.
+   * 
+   * The flags are the same as the flags defined in
+   * <augeas.h>, the logical *or* of the following integers:
+   * 
+   * "AUG_SAVE_BACKUP" = 1
+   * Keep the original file with a ".augsave" extension.
+   * 
+   * "AUG_SAVE_NEWFILE" = 2
+   * Save changes into a file with extension ".augnew",
+   * and do not overwrite original. Overrides
+   * "AUG_SAVE_BACKUP".
+   * 
+   * "AUG_TYPE_CHECK" = 4
+   * Typecheck lenses (can be expensive).
+   * 
+   * "AUG_NO_STDINC" = 8
+   * Do not use standard load path for modules.
+   * 
+   * "AUG_SAVE_NOOP" = 16
+   * Make save a no-op, just record what would have been
+   * changed.
+   * 
+   * "AUG_NO_LOAD" = 32
+   * Do not load the tree in "g.aug_init".
+   * 
+   * To close the handle, you can call "g.aug_close".
+   * 
+   * To find out more about Augeas, see <http://augeas.net/>.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void aug_init (String root, int flags)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_init: handle is closed");
+    _aug_init (g, root, flags);
+  }
+  private native void _aug_init (long g, String root, int flags)
+    throws LibGuestFSException;
+
+  /**
+   * close the current Augeas handle
+   *
+   * Close the current Augeas handle and free up any
+   * resources used by it. After calling this, you have to
+   * call "g.aug_init" again before you can use any other
+   * Augeas functions.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void aug_close ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_close: handle is closed");
+    _aug_close (g);
+  }
+  private native void _aug_close (long g)
+    throws LibGuestFSException;
+
+  /**
+   * define an Augeas variable
+   *
+   * Defines an Augeas variable "name" whose value is the
+   * result of evaluating "expr". If "expr" is NULL, then
+   * "name" is undefined.
+   * 
+   * On success this returns the number of nodes in "expr",
+   * or 0 if "expr" evaluates to something which is not a
+   * nodeset.
+   * 
+   * @throws LibGuestFSException
+   */
+  public int aug_defvar (String name, String expr)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_defvar: handle is closed");
+    return _aug_defvar (g, name, expr);
+  }
+  private native int _aug_defvar (long g, String name, String expr)
+    throws LibGuestFSException;
+
+  /**
+   * define an Augeas node
+   *
+   * Defines a variable "name" whose value is the result of
+   * evaluating "expr".
+   * 
+   * If "expr" evaluates to an empty nodeset, a node is
+   * created, equivalent to calling "g.aug_set" "expr",
+   * "value". "name" will be the nodeset containing that
+   * single node.
+   * 
+   * On success this returns a pair containing the number of
+   * nodes in the nodeset, and a boolean flag if a node was
+   * created.
+   * 
+   * @throws LibGuestFSException
+   */
+  public IntBool aug_defnode (String name, String expr, String val)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_defnode: handle is closed");
+    return _aug_defnode (g, name, expr, val);
+  }
+  private native IntBool _aug_defnode (long g, String name, String expr, String val)
+    throws LibGuestFSException;
+
+  /**
+   * look up the value of an Augeas path
+   *
+   * Look up the value associated with "path". If "path"
+   * matches exactly one node, the "value" is returned.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String aug_get (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_get: handle is closed");
+    return _aug_get (g, path);
+  }
+  private native String _aug_get (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * set Augeas path to value
+   *
+   * Set the value associated with "path" to "value".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void aug_set (String path, String val)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_set: handle is closed");
+    _aug_set (g, path, val);
+  }
+  private native void _aug_set (long g, String path, String val)
+    throws LibGuestFSException;
+
+  /**
+   * insert a sibling Augeas node
+   *
+   * Create a new sibling "label" for "path", inserting it
+   * into the tree before or after "path" (depending on the
+   * boolean flag "before").
+   * 
+   * "path" must match exactly one existing node in the tree,
+   * and "label" must be a label, ie. not contain "/", "*" or
+   * end with a bracketed index "[N]".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void aug_insert (String path, String label, boolean before)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_insert: handle is closed");
+    _aug_insert (g, path, label, before);
+  }
+  private native void _aug_insert (long g, String path, String label, boolean before)
+    throws LibGuestFSException;
+
+  /**
+   * remove an Augeas path
+   *
+   * Remove "path" and all of its children.
+   * 
+   * On success this returns the number of entries which were
+   * removed.
+   * 
+   * @throws LibGuestFSException
+   */
+  public int aug_rm (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_rm: handle is closed");
+    return _aug_rm (g, path);
+  }
+  private native int _aug_rm (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * move Augeas node
+   *
+   * Move the node "src" to "dest". "src" must match exactly
+   * one node. "dest" is overwritten if it exists.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void aug_mv (String src, String dest)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_mv: handle is closed");
+    _aug_mv (g, src, dest);
+  }
+  private native void _aug_mv (long g, String src, String dest)
+    throws LibGuestFSException;
+
+  /**
+   * return Augeas nodes which match path
+   *
+   * Returns a list of paths which match the path expression
+   * "path". The returned paths are sufficiently qualified so
+   * that they match exactly one node in the current tree.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] aug_match (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_match: handle is closed");
+    return _aug_match (g, path);
+  }
+  private native String[] _aug_match (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * write all pending Augeas changes to disk
+   *
+   * This writes all pending changes to disk.
+   * 
+   * The flags which were passed to "g.aug_init" affect
+   * exactly how files are saved.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void aug_save ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_save: handle is closed");
+    _aug_save (g);
+  }
+  private native void _aug_save (long g)
+    throws LibGuestFSException;
+
+  /**
+   * load files into the tree
+   *
+   * Load files into the tree.
+   * 
+   * See "aug_load" in the Augeas documentation for the full
+   * gory details.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void aug_load ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_load: handle is closed");
+    _aug_load (g);
+  }
+  private native void _aug_load (long g)
+    throws LibGuestFSException;
+
+  /**
+   * list Augeas nodes under a path
+   *
+   * This is just a shortcut for listing "g.aug_match"
+   * "path/*" and sorting the resulting nodes into
+   * alphabetical order.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] aug_ls (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("aug_ls: handle is closed");
+    return _aug_ls (g, path);
+  }
+  private native String[] _aug_ls (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * remove a file
+   *
+   * Remove the single file "path".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void rm (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("rm: handle is closed");
+    _rm (g, path);
+  }
+  private native void _rm (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * remove a directory
+   *
+   * Remove the single directory "path".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void rmdir (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("rmdir: handle is closed");
+    _rmdir (g, path);
+  }
+  private native void _rmdir (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * remove a file or directory recursively
+   *
+   * Remove the file or directory "path", recursively
+   * removing the contents if its a directory. This is like
+   * the "rm -rf" shell command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void rm_rf (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("rm_rf: handle is closed");
+    _rm_rf (g, path);
+  }
+  private native void _rm_rf (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * create a directory
+   *
+   * Create a directory named "path".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void mkdir (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("mkdir: handle is closed");
+    _mkdir (g, path);
+  }
+  private native void _mkdir (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * create a directory and parents
+   *
+   * Create a directory named "path", creating any parent
+   * directories as necessary. This is like the "mkdir -p"
+   * shell command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void mkdir_p (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("mkdir_p: handle is closed");
+    _mkdir_p (g, path);
+  }
+  private native void _mkdir_p (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * change file mode
+   *
+   * Change the mode (permissions) of "path" to "mode". Only
+   * numeric modes are supported.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void chmod (int mode, String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("chmod: handle is closed");
+    _chmod (g, mode, path);
+  }
+  private native void _chmod (long g, int mode, String path)
+    throws LibGuestFSException;
+
+  /**
+   * change file owner and group
+   *
+   * Change the file owner to "owner" and group to "group".
+   * 
+   * Only numeric uid and gid are supported. If you want to
+   * use names, you will need to locate and parse the
+   * password file yourself (Augeas support makes this
+   * relatively easy).
+   * 
+   * @throws LibGuestFSException
+   */
+  public void chown (int owner, int group, String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("chown: handle is closed");
+    _chown (g, owner, group, path);
+  }
+  private native void _chown (long g, int owner, int group, String path)
+    throws LibGuestFSException;
+
+  /**
+   * test if file or directory exists
+   *
+   * This returns "true" if and only if there is a file,
+   * directory (or anything) with the given "path" name.
+   * 
+   * See also "g.is_file", "g.is_dir", "g.stat".
+   * 
+   * @throws LibGuestFSException
+   */
+  public boolean exists (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("exists: handle is closed");
+    return _exists (g, path);
+  }
+  private native boolean _exists (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * test if file exists
+   *
+   * This returns "true" if and only if there is a file with
+   * the given "path" name. Note that it returns false for
+   * other objects like directories.
+   * 
+   * See also "g.stat".
+   * 
+   * @throws LibGuestFSException
+   */
+  public boolean is_file (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("is_file: handle is closed");
+    return _is_file (g, path);
+  }
+  private native boolean _is_file (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * test if file exists
+   *
+   * This returns "true" if and only if there is a directory
+   * with the given "path" name. Note that it returns false
+   * for other objects like files.
+   * 
+   * See also "g.stat".
+   * 
+   * @throws LibGuestFSException
+   */
+  public boolean is_dir (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("is_dir: handle is closed");
+    return _is_dir (g, path);
+  }
+  private native boolean _is_dir (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * create an LVM physical volume
+   *
+   * This creates an LVM physical volume on the named
+   * "device", where "device" should usually be a partition
+   * name such as "/dev/sda1".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void pvcreate (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("pvcreate: handle is closed");
+    _pvcreate (g, device);
+  }
+  private native void _pvcreate (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * create an LVM volume group
+   *
+   * This creates an LVM volume group called "volgroup" from
+   * the non-empty list of physical volumes "physvols".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void vgcreate (String volgroup, String[] physvols)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("vgcreate: handle is closed");
+    _vgcreate (g, volgroup, physvols);
+  }
+  private native void _vgcreate (long g, String volgroup, String[] physvols)
+    throws LibGuestFSException;
+
+  /**
+   * create an LVM volume group
+   *
+   * This creates an LVM volume group called "logvol" on the
+   * volume group "volgroup", with "size" megabytes.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void lvcreate (String logvol, String volgroup, int mbytes)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("lvcreate: handle is closed");
+    _lvcreate (g, logvol, volgroup, mbytes);
+  }
+  private native void _lvcreate (long g, String logvol, String volgroup, int mbytes)
+    throws LibGuestFSException;
+
+  /**
+   * make a filesystem
+   *
+   * This creates a filesystem on "device" (usually a
+   * partition of LVM logical volume). The filesystem type is
+   * "fstype", for example "ext3".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void mkfs (String fstype, String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("mkfs: handle is closed");
+    _mkfs (g, fstype, device);
+  }
+  private native void _mkfs (long g, String fstype, String device)
+    throws LibGuestFSException;
+
+  /**
+   * create partitions on a block device
+   *
+   * This is a direct interface to the sfdisk(8) program for
+   * creating partitions on block devices.
+   * 
+   * "device" should be a block device, for example
+   * "/dev/sda".
+   * 
+   * "cyls", "heads" and "sectors" are the number of
+   * cylinders, heads and sectors on the device, which are
+   * passed directly to sfdisk as the *-C*, *-H* and *-S*
+   * parameters. If you pass 0 for any of these, then the
+   * corresponding parameter is omitted. Usually for 'large'
+   * disks, you can just pass 0 for these, but for small
+   * (floppy-sized) disks, sfdisk (or rather, the kernel)
+   * cannot work out the right geometry and you will need to
+   * tell it.
+   * 
+   * "lines" is a list of lines that we feed to "sfdisk". For
+   * more information refer to the sfdisk(8) manpage.
+   * 
+   * To create a single partition occupying the whole disk,
+   * you would pass "lines" as a single element list, when
+   * the single element being the string "," (comma).
+   * 
+   * This command is dangerous. Without careful use you can
+   * easily destroy all your data.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void sfdisk (String device, int cyls, int heads, int sectors, String[] lines)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("sfdisk: handle is closed");
+    _sfdisk (g, device, cyls, heads, sectors, lines);
+  }
+  private native void _sfdisk (long g, String device, int cyls, int heads, int sectors, String[] lines)
+    throws LibGuestFSException;
+
+  /**
+   * create a file
+   *
+   * This call creates a file called "path". The contents of
+   * the file is the string "content" (which can contain any
+   * 8 bit data), with length "size".
+   * 
+   * As a special case, if "size" is 0 then the length is
+   * calculated using "strlen" (so in this case the content
+   * cannot contain embedded ASCII NULs).
+   * 
+   * Because of the message protocol, there is a transfer
+   * limit of somewhere between 2MB and 4MB. To transfer
+   * large files you should use FTP.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void write_file (String path, String content, int size)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("write_file: handle is closed");
+    _write_file (g, path, content, size);
+  }
+  private native void _write_file (long g, String path, String content, int size)
+    throws LibGuestFSException;
+
+  /**
+   * unmount a filesystem
+   *
+   * This unmounts the given filesystem. The filesystem may
+   * be specified either by its mountpoint (path) or the
+   * device which contains the filesystem.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void umount (String pathordevice)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("umount: handle is closed");
+    _umount (g, pathordevice);
+  }
+  private native void _umount (long g, String pathordevice)
+    throws LibGuestFSException;
+
+  /**
+   * show mounted filesystems
+   *
+   * This returns the list of currently mounted filesystems.
+   * It returns the list of devices (eg. "/dev/sda1",
+   * "/dev/VG/LV").
+   * 
+   * Some internal mounts are not shown.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] mounts ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("mounts: handle is closed");
+    return _mounts (g);
+  }
+  private native String[] _mounts (long g)
+    throws LibGuestFSException;
+
+  /**
+   * unmount all filesystems
+   *
+   * This unmounts all mounted filesystems.
+   * 
+   * Some internal mounts are not unmounted by this call.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void umount_all ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("umount_all: handle is closed");
+    _umount_all (g);
+  }
+  private native void _umount_all (long g)
+    throws LibGuestFSException;
+
+  /**
+   * remove all LVM LVs, VGs and PVs
+   *
+   * This command removes all LVM logical volumes, volume
+   * groups and physical volumes.
+   * 
+   * This command is dangerous. Without careful use you can
+   * easily destroy all your data.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void lvm_remove_all ()
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("lvm_remove_all: handle is closed");
+    _lvm_remove_all (g);
+  }
+  private native void _lvm_remove_all (long g)
+    throws LibGuestFSException;
+
+  /**
+   * determine file type
+   *
+   * This call uses the standard file(1) command to determine
+   * the type or contents of the file. This also works on
+   * devices, for example to find out whether a partition
+   * contains a filesystem.
+   * 
+   * The exact command which runs is "file -bsL path". Note
+   * in particular that the filename is not prepended to the
+   * output (the "-b" option).
+   * 
+   * @throws LibGuestFSException
+   */
+  public String file (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("file: handle is closed");
+    return _file (g, path);
+  }
+  private native String _file (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * run a command from the guest filesystem
+   *
+   * This call runs a command from the guest filesystem. The
+   * filesystem must be mounted, and must contain a
+   * compatible operating system (ie. something Linux, with
+   * the same or compatible processor architecture).
+   * 
+   * The single parameter is an argv-style list of arguments.
+   * The first element is the name of the program to run.
+   * Subsequent elements are parameters. The list must be
+   * non-empty (ie. must contain a program name).
+   * 
+   * The $PATH environment variable will contain at least
+   * "/usr/bin" and "/bin". If you require a program from
+   * another location, you should provide the full path in
+   * the first parameter.
+   * 
+   * Shared libraries and data files required by the program
+   * must be available on filesystems which are mounted in
+   * the correct places. It is the caller's responsibility to
+   * ensure all filesystems that are needed are mounted at
+   * the right locations.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String command (String[] arguments)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("command: handle is closed");
+    return _command (g, arguments);
+  }
+  private native String _command (long g, String[] arguments)
+    throws LibGuestFSException;
+
+  /**
+   * run a command, returning lines
+   *
+   * This is the same as "g.command", but splits the result
+   * into a list of lines.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String[] command_lines (String[] arguments)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("command_lines: handle is closed");
+    return _command_lines (g, arguments);
+  }
+  private native String[] _command_lines (long g, String[] arguments)
+    throws LibGuestFSException;
+
+  /**
+   * get file information
+   *
+   * Returns file information for the given "path".
+   * 
+   * This is the same as the stat(2) system call.
+   * 
+   * @throws LibGuestFSException
+   */
+  public Stat stat (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("stat: handle is closed");
+    return _stat (g, path);
+  }
+  private native Stat _stat (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * get file information for a symbolic link
+   *
+   * Returns file information for the given "path".
+   * 
+   * This is the same as "g.stat" except that if "path" is a
+   * symbolic link, then the link is stat-ed, not the file it
+   * refers to.
+   * 
+   * This is the same as the lstat(2) system call.
+   * 
+   * @throws LibGuestFSException
+   */
+  public Stat lstat (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("lstat: handle is closed");
+    return _lstat (g, path);
+  }
+  private native Stat _lstat (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * get file system statistics
+   *
+   * Returns file system statistics for any mounted file
+   * system. "path" should be a file or directory in the
+   * mounted file system (typically it is the mount point
+   * itself, but it doesn't need to be).
+   * 
+   * This is the same as the statvfs(2) system call.
+   * 
+   * @throws LibGuestFSException
+   */
+  public StatVFS statvfs (String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("statvfs: handle is closed");
+    return _statvfs (g, path);
+  }
+  private native StatVFS _statvfs (long g, String path)
+    throws LibGuestFSException;
+
+  /**
+   * get ext2/ext3 superblock details
+   *
+   * This returns the contents of the ext2 or ext3 filesystem
+   * superblock on "device".
+   * 
+   * It is the same as running "tune2fs -l device". See
+   * tune2fs(8) manpage for more details. The list of fields
+   * returned isn't clearly defined, and depends on both the
+   * version of "tune2fs" that libguestfs was built against,
+   * and the filesystem itself.
+   * 
+   * @throws LibGuestFSException
+   */
+  public HashMap<String,String> tune2fs_l (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("tune2fs_l: handle is closed");
+    return _tune2fs_l (g, device);
+  }
+  private native HashMap<String,String> _tune2fs_l (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * set block device to read-only
+   *
+   * Sets the block device named "device" to read-only.
+   * 
+   * This uses the blockdev(8) command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void blockdev_setro (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("blockdev_setro: handle is closed");
+    _blockdev_setro (g, device);
+  }
+  private native void _blockdev_setro (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * set block device to read-write
+   *
+   * Sets the block device named "device" to read-write.
+   * 
+   * This uses the blockdev(8) command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void blockdev_setrw (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("blockdev_setrw: handle is closed");
+    _blockdev_setrw (g, device);
+  }
+  private native void _blockdev_setrw (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * is block device set to read-only
+   *
+   * Returns a boolean indicating if the block device is
+   * read-only (true if read-only, false if not).
+   * 
+   * This uses the blockdev(8) command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public boolean blockdev_getro (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("blockdev_getro: handle is closed");
+    return _blockdev_getro (g, device);
+  }
+  private native boolean _blockdev_getro (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * get sectorsize of block device
+   *
+   * This returns the size of sectors on a block device.
+   * Usually 512, but can be larger for modern devices.
+   * 
+   * (Note, this is not the size in sectors, use
+   * "g.blockdev_getsz" for that).
+   * 
+   * This uses the blockdev(8) command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public int blockdev_getss (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("blockdev_getss: handle is closed");
+    return _blockdev_getss (g, device);
+  }
+  private native int _blockdev_getss (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * get blocksize of block device
+   *
+   * This returns the block size of a device.
+   * 
+   * (Note this is different from both *size in blocks* and
+   * *filesystem block size*).
+   * 
+   * This uses the blockdev(8) command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public int blockdev_getbsz (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("blockdev_getbsz: handle is closed");
+    return _blockdev_getbsz (g, device);
+  }
+  private native int _blockdev_getbsz (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * set blocksize of block device
+   *
+   * This sets the block size of a device.
+   * 
+   * (Note this is different from both *size in blocks* and
+   * *filesystem block size*).
+   * 
+   * This uses the blockdev(8) command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void blockdev_setbsz (String device, int blocksize)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("blockdev_setbsz: handle is closed");
+    _blockdev_setbsz (g, device, blocksize);
+  }
+  private native void _blockdev_setbsz (long g, String device, int blocksize)
+    throws LibGuestFSException;
+
+  /**
+   * get total size of device in 512-byte sectors
+   *
+   * This returns the size of the device in units of 512-byte
+   * sectors (even if the sectorsize isn't 512 bytes ...
+   * weird).
+   * 
+   * See also "g.blockdev_getss" for the real sector size of
+   * the device, and "g.blockdev_getsize64" for the more
+   * useful *size in bytes*.
+   * 
+   * This uses the blockdev(8) command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public long blockdev_getsz (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("blockdev_getsz: handle is closed");
+    return _blockdev_getsz (g, device);
+  }
+  private native long _blockdev_getsz (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * get total size of device in bytes
+   *
+   * This returns the size of the device in bytes.
+   * 
+   * See also "g.blockdev_getsz".
+   * 
+   * This uses the blockdev(8) command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public long blockdev_getsize64 (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("blockdev_getsize64: handle is closed");
+    return _blockdev_getsize64 (g, device);
+  }
+  private native long _blockdev_getsize64 (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * flush device buffers
+   *
+   * This tells the kernel to flush internal buffers
+   * associated with "device".
+   * 
+   * This uses the blockdev(8) command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void blockdev_flushbufs (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("blockdev_flushbufs: handle is closed");
+    _blockdev_flushbufs (g, device);
+  }
+  private native void _blockdev_flushbufs (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * reread partition table
+   *
+   * Reread the partition table on "device".
+   * 
+   * This uses the blockdev(8) command.
+   * 
+   * @throws LibGuestFSException
+   */
+  public void blockdev_rereadpt (String device)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("blockdev_rereadpt: handle is closed");
+    _blockdev_rereadpt (g, device);
+  }
+  private native void _blockdev_rereadpt (long g, String device)
+    throws LibGuestFSException;
+
+  /**
+   * upload a file from the local machine
+   *
+   * Upload local file "filename" to "remotefilename" on the
+   * filesystem.
+   * 
+   * "filename" can also be a named pipe.
+   * 
+   * See also "g.download".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void upload (String filename, String remotefilename)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("upload: handle is closed");
+    _upload (g, filename, remotefilename);
+  }
+  private native void _upload (long g, String filename, String remotefilename)
+    throws LibGuestFSException;
+
+  /**
+   * download a file to the local machine
+   *
+   * Download file "remotefilename" and save it as "filename"
+   * on the local machine.
+   * 
+   * "filename" can also be a named pipe.
+   * 
+   * See also "g.upload", "g.cat".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void download (String remotefilename, String filename)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("download: handle is closed");
+    _download (g, remotefilename, filename);
+  }
+  private native void _download (long g, String remotefilename, String filename)
+    throws LibGuestFSException;
+
+  /**
+   * compute MD5, SHAx or CRC checksum of file
+   *
+   * This call computes the MD5, SHAx or CRC checksum of the
+   * file named "path".
+   * 
+   * The type of checksum to compute is given by the
+   * "csumtype" parameter which must have one of the
+   * following values:
+   * 
+   * "crc"
+   * Compute the cyclic redundancy check (CRC) specified
+   * by POSIX for the "cksum" command.
+   * 
+   * "md5"
+   * Compute the MD5 hash (using the "md5sum" program).
+   * 
+   * "sha1"
+   * Compute the SHA1 hash (using the "sha1sum" program).
+   * 
+   * "sha224"
+   * Compute the SHA224 hash (using the "sha224sum"
+   * program).
+   * 
+   * "sha256"
+   * Compute the SHA256 hash (using the "sha256sum"
+   * program).
+   * 
+   * "sha384"
+   * Compute the SHA384 hash (using the "sha384sum"
+   * program).
+   * 
+   * "sha512"
+   * Compute the SHA512 hash (using the "sha512sum"
+   * program).
+   * 
+   * The checksum is returned as a printable string.
+   * 
+   * @throws LibGuestFSException
+   */
+  public String checksum (String csumtype, String path)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("checksum: handle is closed");
+    return _checksum (g, csumtype, path);
+  }
+  private native String _checksum (long g, String csumtype, String path)
+    throws LibGuestFSException;
+
+  /**
+   * unpack tarfile to directory
+   *
+   * This command uploads and unpacks local file "tarfile"
+   * (an *uncompressed* tar file) into "directory".
+   * 
+   * To upload a compressed tarball, use "g.tgz_in".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void tar_in (String tarfile, String directory)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("tar_in: handle is closed");
+    _tar_in (g, tarfile, directory);
+  }
+  private native void _tar_in (long g, String tarfile, String directory)
+    throws LibGuestFSException;
+
+  /**
+   * pack directory into tarfile
+   *
+   * This command packs the contents of "directory" and
+   * downloads it to local file "tarfile".
+   * 
+   * To download a compressed tarball, use "g.tgz_out".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void tar_out (String directory, String tarfile)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("tar_out: handle is closed");
+    _tar_out (g, directory, tarfile);
+  }
+  private native void _tar_out (long g, String directory, String tarfile)
+    throws LibGuestFSException;
+
+  /**
+   * unpack compressed tarball to directory
+   *
+   * This command uploads and unpacks local file "tarball" (a
+   * *gzip compressed* tar file) into "directory".
+   * 
+   * To upload an uncompressed tarball, use "g.tar_in".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void tgz_in (String tarball, String directory)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("tgz_in: handle is closed");
+    _tgz_in (g, tarball, directory);
+  }
+  private native void _tgz_in (long g, String tarball, String directory)
+    throws LibGuestFSException;
+
+  /**
+   * pack directory into compressed tarball
+   *
+   * This command packs the contents of "directory" and
+   * downloads it to local file "tarball".
+   * 
+   * To download an uncompressed tarball, use "g.tar_out".
+   * 
+   * @throws LibGuestFSException
+   */
+  public void tgz_out (String directory, String tarball)
+    throws LibGuestFSException
+  {
+    if (g == 0)
+      throw new LibGuestFSException ("tgz_out: handle is closed");
+    _tgz_out (g, directory, tarball);
+  }
+  private native void _tgz_out (long g, String directory, String tarball)
+    throws LibGuestFSException;
+
+}
diff --git a/java/com/redhat/et/libguestfs/IntBool.java b/java/com/redhat/et/libguestfs/IntBool.java
new file mode 100644 (file)
index 0000000..23ea68f
--- /dev/null
@@ -0,0 +1,30 @@
+/* libguestfs Java bindings
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+package com.redhat.et.libguestfs;
+
+/**
+ * A pair (int, boolean)
+ *
+ * @author rjones
+ * @see Exception
+ */
+public class IntBool {
+    public int i;
+    public boolean b;
+}
diff --git a/java/com/redhat/et/libguestfs/LV.java b/java/com/redhat/et/libguestfs/LV.java
new file mode 100644 (file)
index 0000000..2489bde
--- /dev/null
@@ -0,0 +1,49 @@
+/* libguestfs generated file
+ * WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.
+ * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+package com.redhat.et.libguestfs;
+
+/**
+ * Libguestfs LV structure.
+ *
+ * @author rjones
+ * @see GuestFS
+ */
+public class LV {
+  public String lv_name;
+  public String lv_uuid;
+  public String lv_attr;
+  public long lv_major;
+  public long lv_minor;
+  public long lv_kernel_major;
+  public long lv_kernel_minor;
+  public long lv_size;
+  public long seg_count;
+  public String origin;
+  /* The next field is [0..100] or -1 meaning 'not present': */
+  public float snap_percent;
+  /* The next field is [0..100] or -1 meaning 'not present': */
+  public float copy_percent;
+  public String move_pv;
+  public String lv_tags;
+  public String mirror_log;
+  public String modules;
+}
diff --git a/java/com/redhat/et/libguestfs/LibGuestFSException.java b/java/com/redhat/et/libguestfs/LibGuestFSException.java
new file mode 100644 (file)
index 0000000..1c7a224
--- /dev/null
@@ -0,0 +1,36 @@
+/* libguestfs Java bindings
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+package com.redhat.et.libguestfs;
+
+/**
+ * This exception is thrown when some error occurs when using the
+ * libguestfs library.  The error message is always a simple
+ * printable string.
+ *
+ * @author rjones
+ * @see Exception
+ */
+public class LibGuestFSException extends Exception {
+    private static final long serialVersionUID = 1L;
+
+    public LibGuestFSException (String msg)
+    {
+       super (msg);
+    }
+}
diff --git a/java/com/redhat/et/libguestfs/PV.java b/java/com/redhat/et/libguestfs/PV.java
new file mode 100644 (file)
index 0000000..037cf07
--- /dev/null
@@ -0,0 +1,45 @@
+/* libguestfs generated file
+ * WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.
+ * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+package com.redhat.et.libguestfs;
+
+/**
+ * Libguestfs PV structure.
+ *
+ * @author rjones
+ * @see GuestFS
+ */
+public class PV {
+  public String pv_name;
+  public String pv_uuid;
+  public String pv_fmt;
+  public long pv_size;
+  public long dev_size;
+  public long pv_free;
+  public long pv_used;
+  public String pv_attr;
+  public long pv_pe_count;
+  public long pv_pe_alloc_count;
+  public String pv_tags;
+  public long pe_start;
+  public long pv_mda_count;
+  public long pv_mda_free;
+}
diff --git a/java/com/redhat/et/libguestfs/Stat.java b/java/com/redhat/et/libguestfs/Stat.java
new file mode 100644 (file)
index 0000000..925337a
--- /dev/null
@@ -0,0 +1,44 @@
+/* libguestfs generated file
+ * WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.
+ * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+package com.redhat.et.libguestfs;
+
+/**
+ * Libguestfs Stat structure.
+ *
+ * @author rjones
+ * @see GuestFS
+ */
+public class Stat {
+  public long dev;
+  public long ino;
+  public long mode;
+  public long nlink;
+  public long uid;
+  public long gid;
+  public long rdev;
+  public long size;
+  public long blksize;
+  public long blocks;
+  public long atime;
+  public long mtime;
+  public long ctime;
+}
diff --git a/java/com/redhat/et/libguestfs/StatVFS.java b/java/com/redhat/et/libguestfs/StatVFS.java
new file mode 100644 (file)
index 0000000..f99cfd1
--- /dev/null
@@ -0,0 +1,42 @@
+/* libguestfs generated file
+ * WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.
+ * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+package com.redhat.et.libguestfs;
+
+/**
+ * Libguestfs StatVFS structure.
+ *
+ * @author rjones
+ * @see GuestFS
+ */
+public class StatVFS {
+  public long bsize;
+  public long frsize;
+  public long blocks;
+  public long bfree;
+  public long bavail;
+  public long files;
+  public long ffree;
+  public long favail;
+  public long fsid;
+  public long flag;
+  public long namemax;
+}
diff --git a/java/com/redhat/et/libguestfs/VG.java b/java/com/redhat/et/libguestfs/VG.java
new file mode 100644 (file)
index 0000000..d89b633
--- /dev/null
@@ -0,0 +1,50 @@
+/* libguestfs generated file
+ * WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.
+ * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+package com.redhat.et.libguestfs;
+
+/**
+ * Libguestfs VG structure.
+ *
+ * @author rjones
+ * @see GuestFS
+ */
+public class VG {
+  public String vg_name;
+  public String vg_uuid;
+  public String vg_fmt;
+  public String vg_attr;
+  public long vg_size;
+  public long vg_free;
+  public String vg_sysid;
+  public long vg_extent_size;
+  public long vg_extent_count;
+  public long vg_free_count;
+  public long max_lv;
+  public long max_pv;
+  public long pv_count;
+  public long lv_count;
+  public long snap_count;
+  public long vg_seqno;
+  public String vg_tags;
+  public long vg_mda_count;
+  public long vg_mda_free;
+}
diff --git a/java/com_redhat_et_libguestfs_GuestFS.c b/java/com_redhat_et_libguestfs_GuestFS.c
new file mode 100644 (file)
index 0000000..d7f825d
--- /dev/null
@@ -0,0 +1,2131 @@
+/* libguestfs generated file
+ * WARNING: THIS FILE IS GENERATED BY 'src/generator.ml'.
+ * ANY CHANGES YOU MAKE TO THIS FILE WILL BE LOST.
+ *
+ * Copyright (C) 2009 Red Hat Inc.
+ *
+ * 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.
+ *
+ * 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.
+ *
+ * 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
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include "com_redhat_et_libguestfs_GuestFS.h"
+#include "guestfs.h"
+
+/* Note that this function returns.  The exception is not thrown
+ * until after the wrapper function returns.
+ */
+static void
+throw_exception (JNIEnv *env, const char *msg)
+{
+  jclass cl;
+  cl = (*env)->FindClass (env,
+                          "com/redhat/et/libguestfs/LibGuestFSException");
+  (*env)->ThrowNew (env, cl, msg);
+}
+
+JNIEXPORT jlong JNICALL
+Java_com_redhat_et_libguestfs_GuestFS__1create
+  (JNIEnv *env, jobject obj)
+{
+  guestfs_h *g;
+
+  g = guestfs_create ();
+  if (g == NULL) {
+    throw_exception (env, "GuestFS.create: failed to allocate handle");
+    return 0;
+  }
+  guestfs_set_error_handler (g, NULL, NULL);
+  return (jlong) g;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs_GuestFS__1close
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  guestfs_close (g);
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1launch
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_launch (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1wait_1ready
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_wait_ready (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1kill_1subprocess
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_kill_subprocess (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1add_1drive
+  (JNIEnv *env, jobject obj, jlong jg, jstring jfilename)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *filename;
+
+  filename = (*env)->GetStringUTFChars (env, jfilename, NULL);
+  r = guestfs_add_drive (g, filename);
+  (*env)->ReleaseStringUTFChars (env, jfilename, filename);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1add_1cdrom
+  (JNIEnv *env, jobject obj, jlong jg, jstring jfilename)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *filename;
+
+  filename = (*env)->GetStringUTFChars (env, jfilename, NULL);
+  r = guestfs_add_cdrom (g, filename);
+  (*env)->ReleaseStringUTFChars (env, jfilename, filename);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1config
+  (JNIEnv *env, jobject obj, jlong jg, jstring jqemuparam, jstring jqemuvalue)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *qemuparam;
+  const char *qemuvalue;
+
+  qemuparam = (*env)->GetStringUTFChars (env, jqemuparam, NULL);
+  qemuvalue = (*env)->GetStringUTFChars (env, jqemuvalue, NULL);
+  r = guestfs_config (g, qemuparam, qemuvalue);
+  (*env)->ReleaseStringUTFChars (env, jqemuparam, qemuparam);
+  (*env)->ReleaseStringUTFChars (env, jqemuvalue, qemuvalue);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1set_1path
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_set_path (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jstring JNICALL
+Java_com_redhat_et_libguestfs__1get_1path
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  const char *r;
+
+  r = guestfs_get_path (g);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  return (*env)->NewStringUTF (env, r);
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1set_1autosync
+  (JNIEnv *env, jobject obj, jlong jg, jboolean jautosync)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  int autosync;
+
+  autosync = jautosync;
+  r = guestfs_set_autosync (g, autosync);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jboolean JNICALL
+Java_com_redhat_et_libguestfs__1get_1autosync
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_get_autosync (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jboolean) r;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1set_1verbose
+  (JNIEnv *env, jobject obj, jlong jg, jboolean jverbose)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  int verbose;
+
+  verbose = jverbose;
+  r = guestfs_set_verbose (g, verbose);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jboolean JNICALL
+Java_com_redhat_et_libguestfs__1get_1verbose
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_get_verbose (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jboolean) r;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_com_redhat_et_libguestfs__1is_1ready
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_is_ready (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jboolean) r;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_com_redhat_et_libguestfs__1is_1config
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_is_config (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jboolean) r;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_com_redhat_et_libguestfs__1is_1launching
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_is_launching (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jboolean) r;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_com_redhat_et_libguestfs__1is_1busy
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_is_busy (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jboolean) r;
+}
+
+JNIEXPORT jint JNICALL
+Java_com_redhat_et_libguestfs__1get_1state
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_get_state (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jint) r;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1set_1busy
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_set_busy (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1set_1ready
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_set_ready (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1mount
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice, jstring jmountpoint)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+  const char *mountpoint;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  mountpoint = (*env)->GetStringUTFChars (env, jmountpoint, NULL);
+  r = guestfs_mount (g, device, mountpoint);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  (*env)->ReleaseStringUTFChars (env, jmountpoint, mountpoint);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1sync
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_sync (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1touch
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_touch (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jstring JNICALL
+Java_com_redhat_et_libguestfs__1cat
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jstring jr;
+  char *r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_cat (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  jr = (*env)->NewStringUTF (env, r);
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jstring JNICALL
+Java_com_redhat_et_libguestfs__1ll
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdirectory)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jstring jr;
+  char *r;
+  const char *directory;
+
+  directory = (*env)->GetStringUTFChars (env, jdirectory, NULL);
+  r = guestfs_ll (g, directory);
+  (*env)->ReleaseStringUTFChars (env, jdirectory, directory);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  jr = (*env)->NewStringUTF (env, r);
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1ls
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdirectory)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  const char *directory;
+  int i;
+
+  directory = (*env)->GetStringUTFChars (env, jdirectory, NULL);
+  r = guestfs_ls (g, directory);
+  (*env)->ReleaseStringUTFChars (env, jdirectory, directory);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1list_1devices
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  int i;
+
+  r = guestfs_list_devices (g);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1list_1partitions
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  int i;
+
+  r = guestfs_list_partitions (g);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1pvs
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  int i;
+
+  r = guestfs_pvs (g);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1vgs
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  int i;
+
+  r = guestfs_vgs (g);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1lvs
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  int i;
+
+  r = guestfs_lvs (g);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1pvs_1full
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  jclass cl;
+  jfieldID fl;
+  jobject jfl;
+  struct guestfs_lvm_pv_list *r;
+  int i;
+
+  r = guestfs_pvs_full (g);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  cl = (*env)->FindClass (env, "com/redhat/et/libguestfs/PV");
+  jr = (*env)->NewObjectArray (env, r->len, cl, NULL);
+  for (i = 0; i < r->len; ++i) {
+    jfl = (*env)->AllocObject (env, cl);
+    fl = (*env)->GetFieldID (env, cl, "pv_name", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].pv_name));
+    {
+      char s[33];
+      memcpy (s, r->val[i].pv_uuid, 32);
+      s[32] = 0;
+      fl = (*env)->GetFieldID (env, cl, "pv_uuid", "Ljava/lang/String;");
+      (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, s));
+    }
+    fl = (*env)->GetFieldID (env, cl, "pv_fmt", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].pv_fmt));
+    fl = (*env)->GetFieldID (env, cl, "pv_size", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].pv_size);
+    fl = (*env)->GetFieldID (env, cl, "dev_size", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].dev_size);
+    fl = (*env)->GetFieldID (env, cl, "pv_free", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].pv_free);
+    fl = (*env)->GetFieldID (env, cl, "pv_used", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].pv_used);
+    fl = (*env)->GetFieldID (env, cl, "pv_attr", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].pv_attr));
+    fl = (*env)->GetFieldID (env, cl, "pv_pe_count", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].pv_pe_count);
+    fl = (*env)->GetFieldID (env, cl, "pv_pe_alloc_count", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].pv_pe_alloc_count);
+    fl = (*env)->GetFieldID (env, cl, "pv_tags", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].pv_tags));
+    fl = (*env)->GetFieldID (env, cl, "pe_start", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].pe_start);
+    fl = (*env)->GetFieldID (env, cl, "pv_mda_count", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].pv_mda_count);
+    fl = (*env)->GetFieldID (env, cl, "pv_mda_free", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].pv_mda_free);
+    (*env)->SetObjectArrayElement (env, jfl, i, jfl);
+  }
+  guestfs_free_lvm_pv_list (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1vgs_1full
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  jclass cl;
+  jfieldID fl;
+  jobject jfl;
+  struct guestfs_lvm_vg_list *r;
+  int i;
+
+  r = guestfs_vgs_full (g);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  cl = (*env)->FindClass (env, "com/redhat/et/libguestfs/VG");
+  jr = (*env)->NewObjectArray (env, r->len, cl, NULL);
+  for (i = 0; i < r->len; ++i) {
+    jfl = (*env)->AllocObject (env, cl);
+    fl = (*env)->GetFieldID (env, cl, "vg_name", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].vg_name));
+    {
+      char s[33];
+      memcpy (s, r->val[i].vg_uuid, 32);
+      s[32] = 0;
+      fl = (*env)->GetFieldID (env, cl, "vg_uuid", "Ljava/lang/String;");
+      (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, s));
+    }
+    fl = (*env)->GetFieldID (env, cl, "vg_fmt", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].vg_fmt));
+    fl = (*env)->GetFieldID (env, cl, "vg_attr", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].vg_attr));
+    fl = (*env)->GetFieldID (env, cl, "vg_size", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].vg_size);
+    fl = (*env)->GetFieldID (env, cl, "vg_free", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].vg_free);
+    fl = (*env)->GetFieldID (env, cl, "vg_sysid", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].vg_sysid));
+    fl = (*env)->GetFieldID (env, cl, "vg_extent_size", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].vg_extent_size);
+    fl = (*env)->GetFieldID (env, cl, "vg_extent_count", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].vg_extent_count);
+    fl = (*env)->GetFieldID (env, cl, "vg_free_count", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].vg_free_count);
+    fl = (*env)->GetFieldID (env, cl, "max_lv", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].max_lv);
+    fl = (*env)->GetFieldID (env, cl, "max_pv", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].max_pv);
+    fl = (*env)->GetFieldID (env, cl, "pv_count", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].pv_count);
+    fl = (*env)->GetFieldID (env, cl, "lv_count", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].lv_count);
+    fl = (*env)->GetFieldID (env, cl, "snap_count", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].snap_count);
+    fl = (*env)->GetFieldID (env, cl, "vg_seqno", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].vg_seqno);
+    fl = (*env)->GetFieldID (env, cl, "vg_tags", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].vg_tags));
+    fl = (*env)->GetFieldID (env, cl, "vg_mda_count", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].vg_mda_count);
+    fl = (*env)->GetFieldID (env, cl, "vg_mda_free", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].vg_mda_free);
+    (*env)->SetObjectArrayElement (env, jfl, i, jfl);
+  }
+  guestfs_free_lvm_vg_list (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1lvs_1full
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  jclass cl;
+  jfieldID fl;
+  jobject jfl;
+  struct guestfs_lvm_lv_list *r;
+  int i;
+
+  r = guestfs_lvs_full (g);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  cl = (*env)->FindClass (env, "com/redhat/et/libguestfs/LV");
+  jr = (*env)->NewObjectArray (env, r->len, cl, NULL);
+  for (i = 0; i < r->len; ++i) {
+    jfl = (*env)->AllocObject (env, cl);
+    fl = (*env)->GetFieldID (env, cl, "lv_name", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].lv_name));
+    {
+      char s[33];
+      memcpy (s, r->val[i].lv_uuid, 32);
+      s[32] = 0;
+      fl = (*env)->GetFieldID (env, cl, "lv_uuid", "Ljava/lang/String;");
+      (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, s));
+    }
+    fl = (*env)->GetFieldID (env, cl, "lv_attr", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].lv_attr));
+    fl = (*env)->GetFieldID (env, cl, "lv_major", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].lv_major);
+    fl = (*env)->GetFieldID (env, cl, "lv_minor", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].lv_minor);
+    fl = (*env)->GetFieldID (env, cl, "lv_kernel_major", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].lv_kernel_major);
+    fl = (*env)->GetFieldID (env, cl, "lv_kernel_minor", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].lv_kernel_minor);
+    fl = (*env)->GetFieldID (env, cl, "lv_size", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].lv_size);
+    fl = (*env)->GetFieldID (env, cl, "seg_count", "J");
+    (*env)->SetLongField (env, jfl, fl, r->val[i].seg_count);
+    fl = (*env)->GetFieldID (env, cl, "origin", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].origin));
+    fl = (*env)->GetFieldID (env, cl, "snap_percent", "F");
+    (*env)->SetFloatField (env, jfl, fl, r->val[i].snap_percent);
+    fl = (*env)->GetFieldID (env, cl, "copy_percent", "F");
+    (*env)->SetFloatField (env, jfl, fl, r->val[i].copy_percent);
+    fl = (*env)->GetFieldID (env, cl, "move_pv", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].move_pv));
+    fl = (*env)->GetFieldID (env, cl, "lv_tags", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].lv_tags));
+    fl = (*env)->GetFieldID (env, cl, "mirror_log", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].mirror_log));
+    fl = (*env)->GetFieldID (env, cl, "modules", "Ljava/lang/String;");
+    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].modules));
+    (*env)->SetObjectArrayElement (env, jfl, i, jfl);
+  }
+  guestfs_free_lvm_lv_list (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1read_1lines
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  const char *path;
+  int i;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_read_lines (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1aug_1init
+  (JNIEnv *env, jobject obj, jlong jg, jstring jroot, jint jflags)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *root;
+  int flags;
+
+  root = (*env)->GetStringUTFChars (env, jroot, NULL);
+  flags = jflags;
+  r = guestfs_aug_init (g, root, flags);
+  (*env)->ReleaseStringUTFChars (env, jroot, root);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1aug_1close
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_aug_close (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jint JNICALL
+Java_com_redhat_et_libguestfs__1aug_1defvar
+  (JNIEnv *env, jobject obj, jlong jg, jstring jname, jstring jexpr)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *name;
+  const char *expr;
+
+  name = (*env)->GetStringUTFChars (env, jname, NULL);
+  expr = (*env)->GetStringUTFChars (env, jexpr, NULL);
+  r = guestfs_aug_defvar (g, name, expr);
+  (*env)->ReleaseStringUTFChars (env, jname, name);
+  (*env)->ReleaseStringUTFChars (env, jexpr, expr);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jint) r;
+}
+
+JNIEXPORT jobject JNICALL
+Java_com_redhat_et_libguestfs__1aug_1defnode
+  (JNIEnv *env, jobject obj, jlong jg, jstring jname, jstring jexpr, jstring jval)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobject jr;
+  jclass cl;
+  jfieldID fl;
+  struct guestfs_int_bool *r;
+  const char *name;
+  const char *expr;
+  const char *val;
+
+  name = (*env)->GetStringUTFChars (env, jname, NULL);
+  expr = (*env)->GetStringUTFChars (env, jexpr, NULL);
+  val = (*env)->GetStringUTFChars (env, jval, NULL);
+  r = guestfs_aug_defnode (g, name, expr, val);
+  (*env)->ReleaseStringUTFChars (env, jname, name);
+  (*env)->ReleaseStringUTFChars (env, jexpr, expr);
+  (*env)->ReleaseStringUTFChars (env, jval, val);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  cl = (*env)->FindClass (env, "com/redhat/et/libguestfs/IntBool");
+  jr = (*env)->AllocObject (env, cl);
+  fl = (*env)->GetFieldID (env, cl, "i", "I");
+  (*env)->SetIntField (env, jr, fl, r->i);
+  fl = (*env)->GetFieldID (env, cl, "i", "Z");
+  (*env)->SetBooleanField (env, jr, fl, r->b);
+  guestfs_free_int_bool (r);
+  return jr;
+}
+
+JNIEXPORT jstring JNICALL
+Java_com_redhat_et_libguestfs__1aug_1get
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jstring jr;
+  char *r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_aug_get (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  jr = (*env)->NewStringUTF (env, r);
+  free (r);
+  return jr;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1aug_1set
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath, jstring jval)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+  const char *val;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  val = (*env)->GetStringUTFChars (env, jval, NULL);
+  r = guestfs_aug_set (g, path, val);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  (*env)->ReleaseStringUTFChars (env, jval, val);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1aug_1insert
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath, jstring jlabel, jboolean jbefore)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+  const char *label;
+  int before;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  label = (*env)->GetStringUTFChars (env, jlabel, NULL);
+  before = jbefore;
+  r = guestfs_aug_insert (g, path, label, before);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  (*env)->ReleaseStringUTFChars (env, jlabel, label);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jint JNICALL
+Java_com_redhat_et_libguestfs__1aug_1rm
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_aug_rm (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jint) r;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1aug_1mv
+  (JNIEnv *env, jobject obj, jlong jg, jstring jsrc, jstring jdest)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *src;
+  const char *dest;
+
+  src = (*env)->GetStringUTFChars (env, jsrc, NULL);
+  dest = (*env)->GetStringUTFChars (env, jdest, NULL);
+  r = guestfs_aug_mv (g, src, dest);
+  (*env)->ReleaseStringUTFChars (env, jsrc, src);
+  (*env)->ReleaseStringUTFChars (env, jdest, dest);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1aug_1match
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  const char *path;
+  int i;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_aug_match (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1aug_1save
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_aug_save (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1aug_1load
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_aug_load (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1aug_1ls
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  const char *path;
+  int i;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_aug_ls (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1rm
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_rm (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1rmdir
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_rmdir (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1rm_1rf
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_rm_rf (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1mkdir
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_mkdir (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1mkdir_1p
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_mkdir_p (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1chmod
+  (JNIEnv *env, jobject obj, jlong jg, jint jmode, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  int mode;
+  const char *path;
+
+  mode = jmode;
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_chmod (g, mode, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1chown
+  (JNIEnv *env, jobject obj, jlong jg, jint jowner, jint jgroup, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  int owner;
+  int group;
+  const char *path;
+
+  owner = jowner;
+  group = jgroup;
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_chown (g, owner, group, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jboolean JNICALL
+Java_com_redhat_et_libguestfs__1exists
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_exists (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jboolean) r;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_com_redhat_et_libguestfs__1is_1file
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_is_file (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jboolean) r;
+}
+
+JNIEXPORT jboolean JNICALL
+Java_com_redhat_et_libguestfs__1is_1dir
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_is_dir (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jboolean) r;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1pvcreate
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_pvcreate (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1vgcreate
+  (JNIEnv *env, jobject obj, jlong jg, jstring jvolgroup, jobjectArray jphysvols)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *volgroup;
+  int physvols_len;
+  const char **physvols;
+  int i;
+
+  volgroup = (*env)->GetStringUTFChars (env, jvolgroup, NULL);
+  physvols_len = (*env)->GetArrayLength (env, jphysvols);
+  physvols = malloc (sizeof (char *) * (physvols_len+1));
+  for (i = 0; i < physvols_len; ++i) {
+    jobject o = (*env)->GetObjectArrayElement (env, jphysvols, i);
+    physvols[i] = (*env)->GetStringUTFChars (env, o, NULL);
+  }
+  physvols[physvols_len] = NULL;
+  r = guestfs_vgcreate (g, volgroup, physvols);
+  (*env)->ReleaseStringUTFChars (env, jvolgroup, volgroup);
+  for (i = 0; i < physvols_len; ++i) {
+    jobject o = (*env)->GetObjectArrayElement (env, jphysvols, i);
+    (*env)->ReleaseStringUTFChars (env, o, physvols[i]);
+  }
+  free (physvols);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1lvcreate
+  (JNIEnv *env, jobject obj, jlong jg, jstring jlogvol, jstring jvolgroup, jint jmbytes)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *logvol;
+  const char *volgroup;
+  int mbytes;
+
+  logvol = (*env)->GetStringUTFChars (env, jlogvol, NULL);
+  volgroup = (*env)->GetStringUTFChars (env, jvolgroup, NULL);
+  mbytes = jmbytes;
+  r = guestfs_lvcreate (g, logvol, volgroup, mbytes);
+  (*env)->ReleaseStringUTFChars (env, jlogvol, logvol);
+  (*env)->ReleaseStringUTFChars (env, jvolgroup, volgroup);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1mkfs
+  (JNIEnv *env, jobject obj, jlong jg, jstring jfstype, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *fstype;
+  const char *device;
+
+  fstype = (*env)->GetStringUTFChars (env, jfstype, NULL);
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_mkfs (g, fstype, device);
+  (*env)->ReleaseStringUTFChars (env, jfstype, fstype);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1sfdisk
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice, jint jcyls, jint jheads, jint jsectors, jobjectArray jlines)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+  int cyls;
+  int heads;
+  int sectors;
+  int lines_len;
+  const char **lines;
+  int i;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  cyls = jcyls;
+  heads = jheads;
+  sectors = jsectors;
+  lines_len = (*env)->GetArrayLength (env, jlines);
+  lines = malloc (sizeof (char *) * (lines_len+1));
+  for (i = 0; i < lines_len; ++i) {
+    jobject o = (*env)->GetObjectArrayElement (env, jlines, i);
+    lines[i] = (*env)->GetStringUTFChars (env, o, NULL);
+  }
+  lines[lines_len] = NULL;
+  r = guestfs_sfdisk (g, device, cyls, heads, sectors, lines);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  for (i = 0; i < lines_len; ++i) {
+    jobject o = (*env)->GetObjectArrayElement (env, jlines, i);
+    (*env)->ReleaseStringUTFChars (env, o, lines[i]);
+  }
+  free (lines);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1write_1file
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath, jstring jcontent, jint jsize)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *path;
+  const char *content;
+  int size;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  content = (*env)->GetStringUTFChars (env, jcontent, NULL);
+  size = jsize;
+  r = guestfs_write_file (g, path, content, size);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  (*env)->ReleaseStringUTFChars (env, jcontent, content);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1umount
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpathordevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *pathordevice;
+
+  pathordevice = (*env)->GetStringUTFChars (env, jpathordevice, NULL);
+  r = guestfs_umount (g, pathordevice);
+  (*env)->ReleaseStringUTFChars (env, jpathordevice, pathordevice);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1mounts
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  int i;
+
+  r = guestfs_mounts (g);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1umount_1all
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_umount_all (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1lvm_1remove_1all
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+
+  r = guestfs_lvm_remove_all (g);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jstring JNICALL
+Java_com_redhat_et_libguestfs__1file
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jstring jr;
+  char *r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_file (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  jr = (*env)->NewStringUTF (env, r);
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jstring JNICALL
+Java_com_redhat_et_libguestfs__1command
+  (JNIEnv *env, jobject obj, jlong jg, jobjectArray jarguments)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jstring jr;
+  char *r;
+  int arguments_len;
+  const char **arguments;
+  int i;
+
+  arguments_len = (*env)->GetArrayLength (env, jarguments);
+  arguments = malloc (sizeof (char *) * (arguments_len+1));
+  for (i = 0; i < arguments_len; ++i) {
+    jobject o = (*env)->GetObjectArrayElement (env, jarguments, i);
+    arguments[i] = (*env)->GetStringUTFChars (env, o, NULL);
+  }
+  arguments[arguments_len] = NULL;
+  r = guestfs_command (g, arguments);
+  for (i = 0; i < arguments_len; ++i) {
+    jobject o = (*env)->GetObjectArrayElement (env, jarguments, i);
+    (*env)->ReleaseStringUTFChars (env, o, arguments[i]);
+  }
+  free (arguments);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  jr = (*env)->NewStringUTF (env, r);
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobjectArray JNICALL
+Java_com_redhat_et_libguestfs__1command_1lines
+  (JNIEnv *env, jobject obj, jlong jg, jobjectArray jarguments)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobjectArray jr;
+  int r_len;
+  jclass cl;
+  jstring jstr;
+  char **r;
+  int arguments_len;
+  const char **arguments;
+  int i;
+
+  arguments_len = (*env)->GetArrayLength (env, jarguments);
+  arguments = malloc (sizeof (char *) * (arguments_len+1));
+  for (i = 0; i < arguments_len; ++i) {
+    jobject o = (*env)->GetObjectArrayElement (env, jarguments, i);
+    arguments[i] = (*env)->GetStringUTFChars (env, o, NULL);
+  }
+  arguments[arguments_len] = NULL;
+  r = guestfs_command_lines (g, arguments);
+  for (i = 0; i < arguments_len; ++i) {
+    jobject o = (*env)->GetObjectArrayElement (env, jarguments, i);
+    (*env)->ReleaseStringUTFChars (env, o, arguments[i]);
+  }
+  free (arguments);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  for (r_len = 0; r[r_len] != NULL; ++r_len) ;
+  cl = (*env)->FindClass (env, "java/lang/String");
+  jstr = (*env)->NewStringUTF (env, "");
+  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);
+  for (i = 0; i < r_len; ++i) {
+    jstr = (*env)->NewStringUTF (env, r[i]);
+    (*env)->SetObjectArrayElement (env, jr, i, jstr);
+    free (r[i]);
+  }
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobject JNICALL
+Java_com_redhat_et_libguestfs__1stat
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobject jr;
+  jclass cl;
+  jfieldID fl;
+  struct guestfs_stat *r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_stat (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  cl = (*env)->FindClass (env, "com/redhat/et/libguestfs/Stat");
+  jr = (*env)->AllocObject (env, cl);
+  fl = (*env)->GetFieldID (env, cl, "dev", "J");
+  (*env)->SetLongField (env, jr, fl, r->dev);
+  fl = (*env)->GetFieldID (env, cl, "ino", "J");
+  (*env)->SetLongField (env, jr, fl, r->ino);
+  fl = (*env)->GetFieldID (env, cl, "mode", "J");
+  (*env)->SetLongField (env, jr, fl, r->mode);
+  fl = (*env)->GetFieldID (env, cl, "nlink", "J");
+  (*env)->SetLongField (env, jr, fl, r->nlink);
+  fl = (*env)->GetFieldID (env, cl, "uid", "J");
+  (*env)->SetLongField (env, jr, fl, r->uid);
+  fl = (*env)->GetFieldID (env, cl, "gid", "J");
+  (*env)->SetLongField (env, jr, fl, r->gid);
+  fl = (*env)->GetFieldID (env, cl, "rdev", "J");
+  (*env)->SetLongField (env, jr, fl, r->rdev);
+  fl = (*env)->GetFieldID (env, cl, "size", "J");
+  (*env)->SetLongField (env, jr, fl, r->size);
+  fl = (*env)->GetFieldID (env, cl, "blksize", "J");
+  (*env)->SetLongField (env, jr, fl, r->blksize);
+  fl = (*env)->GetFieldID (env, cl, "blocks", "J");
+  (*env)->SetLongField (env, jr, fl, r->blocks);
+  fl = (*env)->GetFieldID (env, cl, "atime", "J");
+  (*env)->SetLongField (env, jr, fl, r->atime);
+  fl = (*env)->GetFieldID (env, cl, "mtime", "J");
+  (*env)->SetLongField (env, jr, fl, r->mtime);
+  fl = (*env)->GetFieldID (env, cl, "ctime", "J");
+  (*env)->SetLongField (env, jr, fl, r->ctime);
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobject JNICALL
+Java_com_redhat_et_libguestfs__1lstat
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobject jr;
+  jclass cl;
+  jfieldID fl;
+  struct guestfs_stat *r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_lstat (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  cl = (*env)->FindClass (env, "com/redhat/et/libguestfs/Stat");
+  jr = (*env)->AllocObject (env, cl);
+  fl = (*env)->GetFieldID (env, cl, "dev", "J");
+  (*env)->SetLongField (env, jr, fl, r->dev);
+  fl = (*env)->GetFieldID (env, cl, "ino", "J");
+  (*env)->SetLongField (env, jr, fl, r->ino);
+  fl = (*env)->GetFieldID (env, cl, "mode", "J");
+  (*env)->SetLongField (env, jr, fl, r->mode);
+  fl = (*env)->GetFieldID (env, cl, "nlink", "J");
+  (*env)->SetLongField (env, jr, fl, r->nlink);
+  fl = (*env)->GetFieldID (env, cl, "uid", "J");
+  (*env)->SetLongField (env, jr, fl, r->uid);
+  fl = (*env)->GetFieldID (env, cl, "gid", "J");
+  (*env)->SetLongField (env, jr, fl, r->gid);
+  fl = (*env)->GetFieldID (env, cl, "rdev", "J");
+  (*env)->SetLongField (env, jr, fl, r->rdev);
+  fl = (*env)->GetFieldID (env, cl, "size", "J");
+  (*env)->SetLongField (env, jr, fl, r->size);
+  fl = (*env)->GetFieldID (env, cl, "blksize", "J");
+  (*env)->SetLongField (env, jr, fl, r->blksize);
+  fl = (*env)->GetFieldID (env, cl, "blocks", "J");
+  (*env)->SetLongField (env, jr, fl, r->blocks);
+  fl = (*env)->GetFieldID (env, cl, "atime", "J");
+  (*env)->SetLongField (env, jr, fl, r->atime);
+  fl = (*env)->GetFieldID (env, cl, "mtime", "J");
+  (*env)->SetLongField (env, jr, fl, r->mtime);
+  fl = (*env)->GetFieldID (env, cl, "ctime", "J");
+  (*env)->SetLongField (env, jr, fl, r->ctime);
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobject JNICALL
+Java_com_redhat_et_libguestfs__1statvfs
+  (JNIEnv *env, jobject obj, jlong jg, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jobject jr;
+  jclass cl;
+  jfieldID fl;
+  struct guestfs_statvfs *r;
+  const char *path;
+
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_statvfs (g, path);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  cl = (*env)->FindClass (env, "com/redhat/et/libguestfs/StatVFS");
+  jr = (*env)->AllocObject (env, cl);
+  fl = (*env)->GetFieldID (env, cl, "bsize", "J");
+  (*env)->SetLongField (env, jr, fl, r->bsize);
+  fl = (*env)->GetFieldID (env, cl, "frsize", "J");
+  (*env)->SetLongField (env, jr, fl, r->frsize);
+  fl = (*env)->GetFieldID (env, cl, "blocks", "J");
+  (*env)->SetLongField (env, jr, fl, r->blocks);
+  fl = (*env)->GetFieldID (env, cl, "bfree", "J");
+  (*env)->SetLongField (env, jr, fl, r->bfree);
+  fl = (*env)->GetFieldID (env, cl, "bavail", "J");
+  (*env)->SetLongField (env, jr, fl, r->bavail);
+  fl = (*env)->GetFieldID (env, cl, "files", "J");
+  (*env)->SetLongField (env, jr, fl, r->files);
+  fl = (*env)->GetFieldID (env, cl, "ffree", "J");
+  (*env)->SetLongField (env, jr, fl, r->ffree);
+  fl = (*env)->GetFieldID (env, cl, "favail", "J");
+  (*env)->SetLongField (env, jr, fl, r->favail);
+  fl = (*env)->GetFieldID (env, cl, "fsid", "J");
+  (*env)->SetLongField (env, jr, fl, r->fsid);
+  fl = (*env)->GetFieldID (env, cl, "flag", "J");
+  (*env)->SetLongField (env, jr, fl, r->flag);
+  fl = (*env)->GetFieldID (env, cl, "namemax", "J");
+  (*env)->SetLongField (env, jr, fl, r->namemax);
+  free (r);
+  return jr;
+}
+
+JNIEXPORT jobject JNICALL
+Java_com_redhat_et_libguestfs__1tune2fs_1l
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  char **r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_tune2fs_l (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  throw_exception (env, "tune2fs_l: internal error: please let us know how to make a Java HashMap from JNI bindings!");
+  return NULL;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1blockdev_1setro
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_blockdev_setro (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1blockdev_1setrw
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_blockdev_setrw (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jboolean JNICALL
+Java_com_redhat_et_libguestfs__1blockdev_1getro
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_blockdev_getro (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jboolean) r;
+}
+
+JNIEXPORT jint JNICALL
+Java_com_redhat_et_libguestfs__1blockdev_1getss
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_blockdev_getss (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jint) r;
+}
+
+JNIEXPORT jint JNICALL
+Java_com_redhat_et_libguestfs__1blockdev_1getbsz
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_blockdev_getbsz (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jint) r;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1blockdev_1setbsz
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice, jint jblocksize)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+  int blocksize;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  blocksize = jblocksize;
+  r = guestfs_blockdev_setbsz (g, device, blocksize);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jlong JNICALL
+Java_com_redhat_et_libguestfs__1blockdev_1getsz
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int64_t r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_blockdev_getsz (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jlong) r;
+}
+
+JNIEXPORT jlong JNICALL
+Java_com_redhat_et_libguestfs__1blockdev_1getsize64
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int64_t r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_blockdev_getsize64 (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return 0;
+  }
+  return (jlong) r;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1blockdev_1flushbufs
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_blockdev_flushbufs (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1blockdev_1rereadpt
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdevice)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *device;
+
+  device = (*env)->GetStringUTFChars (env, jdevice, NULL);
+  r = guestfs_blockdev_rereadpt (g, device);
+  (*env)->ReleaseStringUTFChars (env, jdevice, device);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1upload
+  (JNIEnv *env, jobject obj, jlong jg, jstring jfilename, jstring jremotefilename)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *filename;
+  const char *remotefilename;
+
+  filename = (*env)->GetStringUTFChars (env, jfilename, NULL);
+  remotefilename = (*env)->GetStringUTFChars (env, jremotefilename, NULL);
+  r = guestfs_upload (g, filename, remotefilename);
+  (*env)->ReleaseStringUTFChars (env, jfilename, filename);
+  (*env)->ReleaseStringUTFChars (env, jremotefilename, remotefilename);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1download
+  (JNIEnv *env, jobject obj, jlong jg, jstring jremotefilename, jstring jfilename)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *remotefilename;
+  const char *filename;
+
+  remotefilename = (*env)->GetStringUTFChars (env, jremotefilename, NULL);
+  filename = (*env)->GetStringUTFChars (env, jfilename, NULL);
+  r = guestfs_download (g, remotefilename, filename);
+  (*env)->ReleaseStringUTFChars (env, jremotefilename, remotefilename);
+  (*env)->ReleaseStringUTFChars (env, jfilename, filename);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT jstring JNICALL
+Java_com_redhat_et_libguestfs__1checksum
+  (JNIEnv *env, jobject obj, jlong jg, jstring jcsumtype, jstring jpath)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  jstring jr;
+  char *r;
+  const char *csumtype;
+  const char *path;
+
+  csumtype = (*env)->GetStringUTFChars (env, jcsumtype, NULL);
+  path = (*env)->GetStringUTFChars (env, jpath, NULL);
+  r = guestfs_checksum (g, csumtype, path);
+  (*env)->ReleaseStringUTFChars (env, jcsumtype, csumtype);
+  (*env)->ReleaseStringUTFChars (env, jpath, path);
+  if (r == NULL) {
+    throw_exception (env, guestfs_last_error (g));
+    return NULL;
+  }
+  jr = (*env)->NewStringUTF (env, r);
+  free (r);
+  return jr;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1tar_1in
+  (JNIEnv *env, jobject obj, jlong jg, jstring jtarfile, jstring jdirectory)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *tarfile;
+  const char *directory;
+
+  tarfile = (*env)->GetStringUTFChars (env, jtarfile, NULL);
+  directory = (*env)->GetStringUTFChars (env, jdirectory, NULL);
+  r = guestfs_tar_in (g, tarfile, directory);
+  (*env)->ReleaseStringUTFChars (env, jtarfile, tarfile);
+  (*env)->ReleaseStringUTFChars (env, jdirectory, directory);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1tar_1out
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdirectory, jstring jtarfile)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *directory;
+  const char *tarfile;
+
+  directory = (*env)->GetStringUTFChars (env, jdirectory, NULL);
+  tarfile = (*env)->GetStringUTFChars (env, jtarfile, NULL);
+  r = guestfs_tar_out (g, directory, tarfile);
+  (*env)->ReleaseStringUTFChars (env, jdirectory, directory);
+  (*env)->ReleaseStringUTFChars (env, jtarfile, tarfile);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1tgz_1in
+  (JNIEnv *env, jobject obj, jlong jg, jstring jtarball, jstring jdirectory)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *tarball;
+  const char *directory;
+
+  tarball = (*env)->GetStringUTFChars (env, jtarball, NULL);
+  directory = (*env)->GetStringUTFChars (env, jdirectory, NULL);
+  r = guestfs_tgz_in (g, tarball, directory);
+  (*env)->ReleaseStringUTFChars (env, jtarball, tarball);
+  (*env)->ReleaseStringUTFChars (env, jdirectory, directory);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs__1tgz_1out
+  (JNIEnv *env, jobject obj, jlong jg, jstring jdirectory, jstring jtarball)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  int r;
+  const char *directory;
+  const char *tarball;
+
+  directory = (*env)->GetStringUTFChars (env, jdirectory, NULL);
+  tarball = (*env)->GetStringUTFChars (env, jtarball, NULL);
+  r = guestfs_tgz_out (g, directory, tarball);
+  (*env)->ReleaseStringUTFChars (env, jdirectory, directory);
+  (*env)->ReleaseStringUTFChars (env, jtarball, tarball);
+  if (r == -1) {
+    throw_exception (env, guestfs_last_error (g));
+    return ;
+  }
+}
+
index bdd032c..7ea2806 100755 (executable)
@@ -5218,6 +5218,8 @@ class GuestFS:
 
 (* Useful if you need the longdesc POD text as plain text.  Returns a
  * list of lines.
+ *
+ * This is the slowest thing about autogeneration.
  *)
 and pod2text ~width name longdesc =
   let filename, chan = Filename.open_temp_file "gen" ".tmp" in
@@ -5480,6 +5482,514 @@ and generate_ruby_lvm_code typ cols =
   pr "  guestfs_free_lvm_%s_list (r);\n" typ;
   pr "  return rv;\n"
 
+(* Generate Java bindings GuestFS.java file. *)
+and generate_java_java () =
+  generate_header CStyle LGPLv2;
+
+  pr "\
+package com.redhat.et.libguestfs;
+
+import java.util.HashMap;
+import com.redhat.et.libguestfs.LibGuestFSException;
+import com.redhat.et.libguestfs.PV;
+import com.redhat.et.libguestfs.VG;
+import com.redhat.et.libguestfs.LV;
+import com.redhat.et.libguestfs.Stat;
+import com.redhat.et.libguestfs.StatVFS;
+import com.redhat.et.libguestfs.IntBool;
+
+/**
+ * The GuestFS object is a libguestfs handle.
+ *
+ * @author rjones
+ */
+public class GuestFS {
+  // Load the native code.
+  static {
+    System.loadLibrary (\"guestfs_jni\");
+  }
+
+  /**
+   * The native guestfs_h pointer.
+   */
+  long g;
+
+  /**
+   * Create a libguestfs handle.
+   *
+   * @throws LibGuestFSException
+   */
+  public GuestFS () throws LibGuestFSException
+  {
+    g = _create ();
+  }
+  private native long _create () throws LibGuestFSException;
+
+  /**
+   * Close a libguestfs handle.
+   *
+   * You can also leave handles to be collected by the garbage
+   * collector, but this method ensures that the resources used
+   * by the handle are freed up immediately.  If you call any
+   * other methods after closing the handle, you will get an
+   * exception.
+   *
+   * @throws LibGuestFSException
+   */
+  public void close () throws LibGuestFSException
+  {
+    if (g != 0)
+      _close (g);
+    g = 0;
+  }
+  private native void _close (long g) throws LibGuestFSException;
+
+  public void finalize () throws LibGuestFSException
+  {
+    close ();
+  }
+
+";
+
+  List.iter (
+    fun (name, style, _, flags, _, shortdesc, longdesc) ->
+      let doc = replace_str longdesc "C<guestfs_" "C<g." in
+      let doc =
+       if List.mem ProtocolLimitWarning flags then
+         doc ^ "\n\n" ^ protocol_limit_warning
+       else doc in
+      let doc =
+       if List.mem DangerWillRobinson flags then
+         doc ^ "\n\n" ^ danger_will_robinson
+       else doc in
+      let doc = pod2text ~width:60 name doc in
+      let doc = String.concat "\n   * " doc in
+
+      pr "  /**\n";
+      pr "   * %s\n" shortdesc;
+      pr "   *\n";
+      pr "   * %s\n" doc;
+      pr "   * @throws LibGuestFSException\n";
+      pr "   */\n";
+      pr "  ";
+      generate_java_prototype ~public:true ~semicolon:false name style;
+      pr "\n";
+      pr "  {\n";
+      pr "    if (g == 0)\n";
+      pr "      throw new LibGuestFSException (\"%s: handle is closed\");\n"
+       name;
+      pr "    ";
+      if fst style <> RErr then pr "return ";
+      pr "_%s " name;
+      generate_call_args ~handle:"g" (snd style);
+      pr ";\n";
+      pr "  }\n";
+      pr "  ";
+      generate_java_prototype ~privat:true ~native:true name style;
+      pr "\n";
+      pr "\n";
+  ) all_functions;
+
+  pr "}\n"
+
+and generate_java_prototype ?(public=false) ?(privat=false) ?(native=false)
+    ?(semicolon=true) name style =
+  if privat then pr "private ";
+  if public then pr "public ";
+  if native then pr "native ";
+
+  (* return type *)
+  (match fst style with
+   | RErr -> pr "void ";
+   | RInt _ -> pr "int ";
+   | RInt64 _ -> pr "long ";
+   | RBool _ -> pr "boolean ";
+   | RConstString _ | RString _ -> pr "String ";
+   | RStringList _ -> pr "String[] ";
+   | RIntBool _ -> pr "IntBool ";
+   | RPVList _ -> pr "PV[] ";
+   | RVGList _ -> pr "VG[] ";
+   | RLVList _ -> pr "LV[] ";
+   | RStat _ -> pr "Stat ";
+   | RStatVFS _ -> pr "StatVFS ";
+   | RHashtable _ -> pr "HashMap<String,String> ";
+  );
+
+  if native then pr "_%s " name else pr "%s " name;
+  pr "(";
+  let needs_comma = ref false in
+  if native then (
+    pr "long g";
+    needs_comma := true
+  );
+
+  (* args *)
+  List.iter (
+    fun arg ->
+      if !needs_comma then pr ", ";
+      needs_comma := true;
+
+      match arg with
+      | String n
+      | OptString n
+      | FileIn n
+      | FileOut n ->
+         pr "String %s" n
+      | StringList n ->
+         pr "String[] %s" n
+      | Bool n ->
+         pr "boolean %s" n
+      | Int n ->
+         pr "int %s" n
+  ) (snd style);
+
+  pr ")\n";
+  pr "    throws LibGuestFSException";
+  if semicolon then pr ";"
+
+and generate_java_struct typ cols =
+  generate_header CStyle LGPLv2;
+
+  pr "\
+package com.redhat.et.libguestfs;
+
+/**
+ * Libguestfs %s structure.
+ *
+ * @author rjones
+ * @see GuestFS
+ */
+public class %s {
+" typ typ;
+
+  List.iter (
+    function
+    | name, `String
+    | name, `UUID -> pr "  public String %s;\n" name
+    | name, `Bytes
+    | name, `Int -> pr "  public long %s;\n" name
+    | name, `OptPercent ->
+       pr "  /* The next field is [0..100] or -1 meaning 'not present': */\n";
+       pr "  public float %s;\n" name
+  ) cols;
+
+  pr "}\n"
+
+and generate_java_c () =
+  generate_header CStyle LGPLv2;
+
+  pr "\
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+#include \"com_redhat_et_libguestfs_GuestFS.h\"
+#include \"guestfs.h\"
+
+/* Note that this function returns.  The exception is not thrown
+ * until after the wrapper function returns.
+ */
+static void
+throw_exception (JNIEnv *env, const char *msg)
+{
+  jclass cl;
+  cl = (*env)->FindClass (env,
+                          \"com/redhat/et/libguestfs/LibGuestFSException\");
+  (*env)->ThrowNew (env, cl, msg);
+}
+
+JNIEXPORT jlong JNICALL
+Java_com_redhat_et_libguestfs_GuestFS__1create
+  (JNIEnv *env, jobject obj)
+{
+  guestfs_h *g;
+
+  g = guestfs_create ();
+  if (g == NULL) {
+    throw_exception (env, \"GuestFS.create: failed to allocate handle\");
+    return 0;
+  }
+  guestfs_set_error_handler (g, NULL, NULL);
+  return (jlong) g;
+}
+
+JNIEXPORT void JNICALL
+Java_com_redhat_et_libguestfs_GuestFS__1close
+  (JNIEnv *env, jobject obj, jlong jg)
+{
+  guestfs_h *g = (guestfs_h *) jg;
+  guestfs_close (g);
+}
+
+";
+
+  List.iter (
+    fun (name, style, _, _, _, _, _) ->
+      pr "JNIEXPORT ";
+      (match fst style with
+       | RErr -> pr "void ";
+       | RInt _ -> pr "jint ";
+       | RInt64 _ -> pr "jlong ";
+       | RBool _ -> pr "jboolean ";
+       | RConstString _ | RString _ -> pr "jstring ";
+       | RIntBool _ | RStat _ | RStatVFS _ | RHashtable _ ->
+          pr "jobject ";
+       | RStringList _ | RPVList _ | RVGList _ | RLVList _ ->
+          pr "jobjectArray ";
+      );
+      pr "JNICALL\n";
+      pr "Java_com_redhat_et_libguestfs_";
+      pr "%s" (replace_str ("_" ^ name) "_" "_1");
+      pr "\n";
+      pr "  (JNIEnv *env, jobject obj, jlong jg";
+      List.iter (
+       function
+       | String n
+       | OptString n
+       | FileIn n
+       | FileOut n ->
+           pr ", jstring j%s" n
+       | StringList n ->
+           pr ", jobjectArray j%s" n
+       | Bool n ->
+           pr ", jboolean j%s" n
+       | Int n ->
+           pr ", jint j%s" n
+      ) (snd style);
+      pr ")\n";
+      pr "{\n";
+      pr "  guestfs_h *g = (guestfs_h *) jg;\n";
+      let error_code, no_ret =
+       match fst style with
+       | RErr -> pr "  int r;\n"; "-1", ""
+       | RBool _
+       | RInt _ -> pr "  int r;\n"; "-1", "0"
+       | RInt64 _ -> pr "  int64_t r;\n"; "-1", "0"
+       | RConstString _ -> pr "  const char *r;\n"; "NULL", "NULL"
+       | RString _ ->
+           pr "  jstring jr;\n";
+           pr "  char *r;\n"; "NULL", "NULL"
+       | RStringList _ ->
+           pr "  jobjectArray jr;\n";
+           pr "  int r_len;\n";
+           pr "  jclass cl;\n";
+           pr "  jstring jstr;\n";
+           pr "  char **r;\n"; "NULL", "NULL"
+       | RIntBool _ ->
+           pr "  jobject jr;\n";
+           pr "  jclass cl;\n";
+           pr "  jfieldID fl;\n";
+           pr "  struct guestfs_int_bool *r;\n"; "NULL", "NULL"
+       | RStat _ ->
+           pr "  jobject jr;\n";
+           pr "  jclass cl;\n";
+           pr "  jfieldID fl;\n";
+           pr "  struct guestfs_stat *r;\n"; "NULL", "NULL"
+       | RStatVFS _ ->
+           pr "  jobject jr;\n";
+           pr "  jclass cl;\n";
+           pr "  jfieldID fl;\n";
+           pr "  struct guestfs_statvfs *r;\n"; "NULL", "NULL"
+       | RPVList _ ->
+           pr "  jobjectArray jr;\n";
+           pr "  jclass cl;\n";
+           pr "  jfieldID fl;\n";
+           pr "  jobject jfl;\n";
+           pr "  struct guestfs_lvm_pv_list *r;\n"; "NULL", "NULL"
+       | RVGList _ ->
+           pr "  jobjectArray jr;\n";
+           pr "  jclass cl;\n";
+           pr "  jfieldID fl;\n";
+           pr "  jobject jfl;\n";
+           pr "  struct guestfs_lvm_vg_list *r;\n"; "NULL", "NULL"
+       | RLVList _ ->
+           pr "  jobjectArray jr;\n";
+           pr "  jclass cl;\n";
+           pr "  jfieldID fl;\n";
+           pr "  jobject jfl;\n";
+           pr "  struct guestfs_lvm_lv_list *r;\n"; "NULL", "NULL"
+       | RHashtable _ -> pr "  char **r;\n"; "NULL", "NULL" in
+      List.iter (
+       function
+       | String n
+       | OptString n
+       | FileIn n
+       | FileOut n ->
+           pr "  const char *%s;\n" n
+       | StringList n ->
+           pr "  int %s_len;\n" n;
+           pr "  const char **%s;\n" n
+       | Bool n
+       | Int n ->
+           pr "  int %s;\n" n
+      ) (snd style);
+
+      let needs_i =
+       (match fst style with
+        | RStringList _ | RPVList _ | RVGList _ | RLVList _ -> true
+        | RErr _ | RBool _ | RInt _ | RInt64 _ | RConstString _
+        | RString _ | RIntBool _ | RStat _ | RStatVFS _
+        | RHashtable _ -> false) ||
+       List.exists (function StringList _ -> true | _ -> false) (snd style) in
+      if needs_i then
+       pr "  int i;\n";
+
+      pr "\n";
+
+      (* Get the parameters. *)
+      List.iter (
+       function
+       | String n
+       | OptString n
+       | FileIn n
+       | FileOut n ->
+           pr "  %s = (*env)->GetStringUTFChars (env, j%s, NULL);\n" n n
+       | StringList n ->
+           pr "  %s_len = (*env)->GetArrayLength (env, j%s);\n" n n;
+           pr "  %s = malloc (sizeof (char *) * (%s_len+1));\n" n n;
+           pr "  for (i = 0; i < %s_len; ++i) {\n" n;
+           pr "    jobject o = (*env)->GetObjectArrayElement (env, j%s, i);\n"
+             n;
+           pr "    %s[i] = (*env)->GetStringUTFChars (env, o, NULL);\n" n;
+           pr "  }\n";
+           pr "  %s[%s_len] = NULL;\n" n n;
+       | Bool n
+       | Int n ->
+           pr "  %s = j%s;\n" n n
+      ) (snd style);
+
+      (* Make the call. *)
+      pr "  r = guestfs_%s " name;
+      generate_call_args ~handle:"g" (snd style);
+      pr ";\n";
+
+      (* Release the parameters. *)
+      List.iter (
+       function
+       | String n
+       | OptString n
+       | FileIn n
+       | FileOut n ->
+           pr "  (*env)->ReleaseStringUTFChars (env, j%s, %s);\n" n n
+       | StringList n ->
+           pr "  for (i = 0; i < %s_len; ++i) {\n" n;
+           pr "    jobject o = (*env)->GetObjectArrayElement (env, j%s, i);\n"
+             n;
+           pr "    (*env)->ReleaseStringUTFChars (env, o, %s[i]);\n" n;
+           pr "  }\n";
+           pr "  free (%s);\n" n
+       | Bool n
+       | Int n -> ()
+      ) (snd style);
+
+      (* Check for errors. *)
+      pr "  if (r == %s) {\n" error_code;
+      pr "    throw_exception (env, guestfs_last_error (g));\n";
+      pr "    return %s;\n" no_ret;
+      pr "  }\n";
+
+      (* Return value. *)
+      (match fst style with
+       | RErr -> ()
+       | RInt _ -> pr "  return (jint) r;\n"
+       | RBool _ -> pr "  return (jboolean) r;\n"
+       | RInt64 _ -> pr "  return (jlong) r;\n"
+       | RConstString _ -> pr "  return (*env)->NewStringUTF (env, r);\n"
+       | RString _ ->
+          pr "  jr = (*env)->NewStringUTF (env, r);\n";
+          pr "  free (r);\n";
+          pr "  return jr;\n"
+       | RStringList _ ->
+          pr "  for (r_len = 0; r[r_len] != NULL; ++r_len) ;\n";
+          pr "  cl = (*env)->FindClass (env, \"java/lang/String\");\n";
+          pr "  jstr = (*env)->NewStringUTF (env, \"\");\n";
+          pr "  jr = (*env)->NewObjectArray (env, r_len, cl, jstr);\n";
+          pr "  for (i = 0; i < r_len; ++i) {\n";
+          pr "    jstr = (*env)->NewStringUTF (env, r[i]);\n";
+          pr "    (*env)->SetObjectArrayElement (env, jr, i, jstr);\n";
+          pr "    free (r[i]);\n";
+          pr "  }\n";
+          pr "  free (r);\n";
+          pr "  return jr;\n"
+       | RIntBool _ ->
+          pr "  cl = (*env)->FindClass (env, \"com/redhat/et/libguestfs/IntBool\");\n";
+          pr "  jr = (*env)->AllocObject (env, cl);\n";
+          pr "  fl = (*env)->GetFieldID (env, cl, \"i\", \"I\");\n";
+          pr "  (*env)->SetIntField (env, jr, fl, r->i);\n";
+          pr "  fl = (*env)->GetFieldID (env, cl, \"i\", \"Z\");\n";
+          pr "  (*env)->SetBooleanField (env, jr, fl, r->b);\n";
+          pr "  guestfs_free_int_bool (r);\n";
+          pr "  return jr;\n"
+       | RStat _ ->
+          pr "  cl = (*env)->FindClass (env, \"com/redhat/et/libguestfs/Stat\");\n";
+          pr "  jr = (*env)->AllocObject (env, cl);\n";
+          List.iter (
+            function
+            | name, `Int ->
+                pr "  fl = (*env)->GetFieldID (env, cl, \"%s\", \"J\");\n"
+                  name;
+                pr "  (*env)->SetLongField (env, jr, fl, r->%s);\n" name;
+          ) stat_cols;
+          pr "  free (r);\n";
+          pr "  return jr;\n"
+       | RStatVFS _ ->
+          pr "  cl = (*env)->FindClass (env, \"com/redhat/et/libguestfs/StatVFS\");\n";
+          pr "  jr = (*env)->AllocObject (env, cl);\n";
+          List.iter (
+            function
+            | name, `Int ->
+                pr "  fl = (*env)->GetFieldID (env, cl, \"%s\", \"J\");\n"
+                  name;
+                pr "  (*env)->SetLongField (env, jr, fl, r->%s);\n" name;
+          ) statvfs_cols;
+          pr "  free (r);\n";
+          pr "  return jr;\n"
+       | RPVList _ ->
+          generate_java_lvm_return "pv" "PV" pv_cols
+       | RVGList _ ->
+          generate_java_lvm_return "vg" "VG" vg_cols
+       | RLVList _ ->
+          generate_java_lvm_return "lv" "LV" lv_cols
+       | RHashtable _ ->
+          (* XXX *)
+          pr "  throw_exception (env, \"%s: internal error: please let us know how to make a Java HashMap from JNI bindings!\");\n" name;
+          pr "  return NULL;\n"
+      );
+
+      pr "}\n";
+      pr "\n"
+  ) all_functions
+
+and generate_java_lvm_return typ jtyp cols =
+  pr "  cl = (*env)->FindClass (env, \"com/redhat/et/libguestfs/%s\");\n" jtyp;
+  pr "  jr = (*env)->NewObjectArray (env, r->len, cl, NULL);\n";
+  pr "  for (i = 0; i < r->len; ++i) {\n";
+  pr "    jfl = (*env)->AllocObject (env, cl);\n";
+  List.iter (
+    function
+    | name, `String ->
+       pr "    fl = (*env)->GetFieldID (env, cl, \"%s\", \"Ljava/lang/String;\");\n" name;
+       pr "    (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, r->val[i].%s));\n" name;
+    | name, `UUID ->
+       pr "    {\n";
+       pr "      char s[33];\n";
+       pr "      memcpy (s, r->val[i].%s, 32);\n" name;
+       pr "      s[32] = 0;\n";
+       pr "      fl = (*env)->GetFieldID (env, cl, \"%s\", \"Ljava/lang/String;\");\n" name;
+       pr "      (*env)->SetObjectField (env, jfl, fl, (*env)->NewStringUTF (env, s));\n";
+       pr "    }\n";
+    | name, (`Bytes|`Int) ->
+       pr "    fl = (*env)->GetFieldID (env, cl, \"%s\", \"J\");\n" name;
+       pr "    (*env)->SetLongField (env, jfl, fl, r->val[i].%s);\n" name;
+    | name, `OptPercent ->
+       pr "    fl = (*env)->GetFieldID (env, cl, \"%s\", \"F\");\n" name;
+       pr "    (*env)->SetFloatField (env, jfl, fl, r->val[i].%s);\n" name;
+  ) cols;
+  pr "    (*env)->SetObjectArrayElement (env, jfl, i, jfl);\n";
+  pr "  }\n";
+  pr "  guestfs_free_lvm_%s_list (r);\n" typ;
+  pr "  return jr;\n"
+
 let output_to filename =
   let filename_new = filename ^ ".new" in
   chan := open_out filename_new;
@@ -5583,3 +6093,31 @@ Run it from the top source directory using the command
   let close = output_to "ruby/ext/guestfs/_guestfs.c" in
   generate_ruby_c ();
   close ();
+
+  let close = output_to "java/com/redhat/et/libguestfs/GuestFS.java" in
+  generate_java_java ();
+  close ();
+
+  let close = output_to "java/com/redhat/et/libguestfs/PV.java" in
+  generate_java_struct "PV" pv_cols;
+  close ();
+
+  let close = output_to "java/com/redhat/et/libguestfs/VG.java" in
+  generate_java_struct "VG" vg_cols;
+  close ();
+
+  let close = output_to "java/com/redhat/et/libguestfs/LV.java" in
+  generate_java_struct "LV" lv_cols;
+  close ();
+
+  let close = output_to "java/com/redhat/et/libguestfs/Stat.java" in
+  generate_java_struct "Stat" stat_cols;
+  close ();
+
+  let close = output_to "java/com/redhat/et/libguestfs/StatVFS.java" in
+  generate_java_struct "StatVFS" statvfs_cols;
+  close ();
+
+  let close = output_to "java/com_redhat_et_libguestfs_GuestFS.c" in
+  generate_java_c ();
+  close ();