From 7f818fa00c3d019146c7178f152408038d4a4d52 Mon Sep 17 00:00:00 2001 From: Richard Jones Date: Tue, 21 Apr 2009 21:14:55 +0100 Subject: [PATCH 1/1] Java bindings compile, not tested. --- .gitignore | 5 + HACKING | 3 + configure.ac | 14 + java/Makefile.am | 54 +- java/com/redhat/et/libguestfs/GuestFS.java | 2083 +++++++++++++++++++ java/com/redhat/et/libguestfs/IntBool.java | 30 + java/com/redhat/et/libguestfs/LV.java | 49 + .../redhat/et/libguestfs/LibGuestFSException.java | 36 + java/com/redhat/et/libguestfs/PV.java | 45 + java/com/redhat/et/libguestfs/Stat.java | 44 + java/com/redhat/et/libguestfs/StatVFS.java | 42 + java/com/redhat/et/libguestfs/VG.java | 50 + java/com_redhat_et_libguestfs_GuestFS.c | 2131 ++++++++++++++++++++ src/generator.ml | 538 +++++ 14 files changed, 5122 insertions(+), 2 deletions(-) create mode 100644 java/com/redhat/et/libguestfs/GuestFS.java create mode 100644 java/com/redhat/et/libguestfs/IntBool.java create mode 100644 java/com/redhat/et/libguestfs/LV.java create mode 100644 java/com/redhat/et/libguestfs/LibGuestFSException.java create mode 100644 java/com/redhat/et/libguestfs/PV.java create mode 100644 java/com/redhat/et/libguestfs/Stat.java create mode 100644 java/com/redhat/et/libguestfs/StatVFS.java create mode 100644 java/com/redhat/et/libguestfs/VG.java create mode 100644 java/com_redhat_et_libguestfs_GuestFS.c diff --git a/.gitignore b/.gitignore index e41c076..25d8a02 100644 --- a/.gitignore +++ b/.gitignore @@ -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 --- 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. diff --git a/configure.ac b/configure.ac index 5270a67..3a59e65 100644 --- a/configure.ac +++ b/configure.ac @@ -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"]) diff --git a/java/Makefile.am b/java/Makefile.am index 7e8786d..68f1d78 100644 --- a/java/Makefile.am +++ b/java/Makefile.am @@ -15,11 +15,61 @@ # 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 index 0000000..8c2265e --- /dev/null +++ b/java/com/redhat/et/libguestfs/GuestFS.java @@ -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 + * , 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 . + * + * @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 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 _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 index 0000000..23ea68f --- /dev/null +++ b/java/com/redhat/et/libguestfs/IntBool.java @@ -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 index 0000000..2489bde --- /dev/null +++ b/java/com/redhat/et/libguestfs/LV.java @@ -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 index 0000000..1c7a224 --- /dev/null +++ b/java/com/redhat/et/libguestfs/LibGuestFSException.java @@ -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 index 0000000..037cf07 --- /dev/null +++ b/java/com/redhat/et/libguestfs/PV.java @@ -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 index 0000000..925337a --- /dev/null +++ b/java/com/redhat/et/libguestfs/Stat.java @@ -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 index 0000000..f99cfd1 --- /dev/null +++ b/java/com/redhat/et/libguestfs/StatVFS.java @@ -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 index 0000000..d89b633 --- /dev/null +++ b/java/com/redhat/et/libguestfs/VG.java @@ -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 index 0000000..d7f825d --- /dev/null +++ b/java/com_redhat_et_libguestfs_GuestFS.c @@ -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 +#include +#include + +#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 ; + } +} + diff --git a/src/generator.ml b/src/generator.ml index bdd032c..7ea2806 100755 --- a/src/generator.ml +++ b/src/generator.ml @@ -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 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 "; + ); + + 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 +#include +#include + +#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 (); -- 1.8.3.1