summarylogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrederik “Freso” S. Olesen2016-08-24 13:00:27 +0200
committerFrederik “Freso” S. Olesen2016-08-24 13:03:22 +0200
commit2a0c62da93c78685bd1e2bf1afc4e5014026dcf2 (patch)
tree05c9d986f5c9bf37723a0cc10f10a324627f9fad
parentac459c9bec410bb26820d1a73675c5ff86efd13f (diff)
downloadaur-2a0c62da93c78685bd1e2bf1afc4e5014026dcf2.tar.gz
binfmt-java 1-1
Based on binfmt-wine PKGBUILD from AUR, basically copying the files from https://wiki.archlinux.org/index.php/Binfmt_misc_for_Java straight over.
-rw-r--r--.SRCINFO32
-rw-r--r--Applet.conf1
-rw-r--r--ExecutableJAR.conf1
-rw-r--r--Java.conf1
-rw-r--r--PKGBUILD33
-rw-r--r--binfmt-java.install (renamed from binfmt-wine.install)0
-rw-r--r--jarwrapper6
-rw-r--r--javaclassname.c194
-rw-r--r--javawrapper88
-rw-r--r--wine.conf2
10 files changed, 336 insertions, 22 deletions
diff --git a/.SRCINFO b/.SRCINFO
index f51d182d2052..bb20d946bb9d 100644
--- a/.SRCINFO
+++ b/.SRCINFO
@@ -1,15 +1,27 @@
-pkgbase = binfmt-wine
- pkgdesc = register wine interpreter
- pkgver = 1.2
+# Generated by mksrcinfo v8
+# Wed Aug 24 11:03:22 UTC 2016
+pkgbase = binfmt-java
+ pkgdesc = register Java runners
+ pkgver = 1
pkgrel = 1
- url = http://man7.org/linux/man-pages/man8/systemd-binfmt.8.html
- install = binfmt-wine.install
+ url = https://wiki.archlinux.org/index.php/Binfmt_misc_for_Java
+ install = binfmt-java.install
arch = any
- license = GPL
- depends = wine
+ license = FDL1.3
+ depends = java-runtime
depends = systemd
- source = wine.conf
- md5sums = 599bc907c9ae3fa371e8032b6db735dc
+ source = Applet.conf
+ source = ExecutableJAR.conf
+ source = Java.conf
+ source = jarwrapper
+ source = javawrapper
+ source = javaclassname.c
+ md5sums = a9385f6b3eb01b7433fef2741f1ce4c2
+ md5sums = f2244ff951ce7318d0d6a94e3fdfa001
+ md5sums = c05fb16044abfded174d8a4b17ce7d7c
+ md5sums = f5e6a48ef18b92b23a59bc51f60e310f
+ md5sums = 87f5c8c8dc4705493221be97654f2e13
+ md5sums = c6ec75405623591f8c0dead3fa3c3595
-pkgname = binfmt-wine
+pkgname = binfmt-java
diff --git a/Applet.conf b/Applet.conf
new file mode 100644
index 000000000000..2d6073a86e0b
--- /dev/null
+++ b/Applet.conf
@@ -0,0 +1 @@
+:Applet:E::html::/opt/java/bin/appletviewer:
diff --git a/ExecutableJAR.conf b/ExecutableJAR.conf
new file mode 100644
index 000000000000..7afcdcf0b22d
--- /dev/null
+++ b/ExecutableJAR.conf
@@ -0,0 +1 @@
+:ExecutableJAR:E::jar::/usr/local/bin/jarwrapper:
diff --git a/Java.conf b/Java.conf
new file mode 100644
index 000000000000..4656b6403a2c
--- /dev/null
+++ b/Java.conf
@@ -0,0 +1 @@
+:Java:M::\xca\xfe\xba\xbe::/usr/local/bin/javawrapper:
diff --git a/PKGBUILD b/PKGBUILD
index 46137377c84a..08601551cdbe 100644
--- a/PKGBUILD
+++ b/PKGBUILD
@@ -1,16 +1,29 @@
-pkgname=binfmt-wine
-pkgver=1.2
+pkgname=binfmt-java
+pkgver=1
pkgrel=1
-pkgdesc="register wine interpreter"
+pkgdesc='register Java runners'
arch=(any)
-url="http://man7.org/linux/man-pages/man8/systemd-binfmt.8.html"
-license=(GPL)
-depends=('wine' 'systemd')
-source=("wine.conf")
-md5sums=('599bc907c9ae3fa371e8032b6db735dc')
+url='https://wiki.archlinux.org/index.php/Binfmt_misc_for_Java'
+license=('FDL1.3')
+depends=('java-runtime' 'systemd')
+source=('Applet.conf' 'ExecutableJAR.conf' 'Java.conf'
+ 'jarwrapper' 'javawrapper' 'javaclassname.c')
+md5sums=('a9385f6b3eb01b7433fef2741f1ce4c2'
+ 'f2244ff951ce7318d0d6a94e3fdfa001'
+ 'c05fb16044abfded174d8a4b17ce7d7c'
+ 'f5e6a48ef18b92b23a59bc51f60e310f'
+ '87f5c8c8dc4705493221be97654f2e13'
+ 'c6ec75405623591f8c0dead3fa3c3595')
install=$pkgname.install
-package () {
+build (){
cd "$srcdir"
- install -Dm 644 wine.conf "$pkgdir/usr/lib/binfmt.d/wine.conf"
+ gcc $CFLAGS $CPPFLAGS -o javaclassname javaclassname.c
+}
+
+package (){
+ cd "$srcdir"
+ install -d "$pkgdir/usr/lib/binfmt.d" "$pkgdir/usr/local/bin"
+ install -m644 'Applet.conf' 'ExecutableJAR.conf' 'Java.conf' "$pkgdir/usr/lib/binfmt.d/"
+ install -m755 'jarwrapper' 'javawrapper' 'javaclassname' "$pkgdir/usr/local/bin/"
}
diff --git a/binfmt-wine.install b/binfmt-java.install
index 7e3da32454e6..7e3da32454e6 100644
--- a/binfmt-wine.install
+++ b/binfmt-java.install
diff --git a/jarwrapper b/jarwrapper
new file mode 100644
index 000000000000..ae544c687ef9
--- /dev/null
+++ b/jarwrapper
@@ -0,0 +1,6 @@
+#!/bin/bash
+# /usr/local/bin/jarwrapper - the wrapper for binfmt_misc/jar
+
+# set path to java using JAVA_HOME if available, otherwise assume it's on the PATH
+JAVA_PATH=${JAVA_HOME:+$JAVA_HOME/jre/bin/}java
+$JAVA_PATH -jar "$@"
diff --git a/javaclassname.c b/javaclassname.c
new file mode 100644
index 000000000000..51f368609b41
--- /dev/null
+++ b/javaclassname.c
@@ -0,0 +1,194 @@
+/* javaclassname.c
+ *
+ * Extracts the class name from a Java class file; intended for use in a Java
+ * wrapper of the type supported by the binfmt_misc option in the Linux kernel.
+ *
+ * Copyright (C) 1999 Colin J. Watson <cjw44@cam.ac.uk>.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program 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 General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+#include <stdarg.h>
+#include <sys/types.h>
+
+/* From Sun's Java VM Specification, as tag entries in the constant pool. */
+
+#define CP_UTF8 1
+#define CP_INTEGER 3
+#define CP_FLOAT 4
+#define CP_LONG 5
+#define CP_DOUBLE 6
+#define CP_CLASS 7
+#define CP_STRING 8
+#define CP_FIELDREF 9
+#define CP_METHODREF 10
+#define CP_INTERFACEMETHODREF 11
+#define CP_NAMEANDTYPE 12
+
+/* Define some commonly used error messages */
+
+#define seek_error() error("%s: Cannot seek\n", program)
+#define corrupt_error() error("%s: Class file corrupt\n", program)
+#define eof_error() error("%s: Unexpected end of file\n", program)
+#define utf8_error() error("%s: Only ASCII 1-255 supported\n", program);
+
+char *program;
+
+long *pool;
+
+u_int8_t read_8(FILE *classfile);
+u_int16_t read_16(FILE *classfile);
+void skip_constant(FILE *classfile, u_int16_t *cur);
+void error(const char *format, ...);
+int main(int argc, char **argv);
+
+/* Reads in an unsigned 8-bit integer. */
+u_int8_t read_8(FILE *classfile)
+{
+ int b = fgetc(classfile);
+ if(b == EOF)
+ eof_error();
+ return (u_int8_t)b;
+}
+
+/* Reads in an unsigned 16-bit integer. */
+u_int16_t read_16(FILE *classfile)
+{
+ int b1, b2;
+ b1 = fgetc(classfile);
+ if(b1 == EOF)
+ eof_error();
+ b2 = fgetc(classfile);
+ if(b2 == EOF)
+ eof_error();
+ return (u_int16_t)((b1 << 8) | b2);
+}
+
+/* Reads in a value from the constant pool. */
+void skip_constant(FILE *classfile, u_int16_t *cur)
+{
+ u_int16_t len;
+ int seekerr = 1;
+ pool[*cur] = ftell(classfile);
+ switch(read_8(classfile))
+ {
+ case CP_UTF8:
+ len = read_16(classfile);
+ seekerr = fseek(classfile, len, SEEK_CUR);
+ break;
+ case CP_CLASS:
+ case CP_STRING:
+ seekerr = fseek(classfile, 2, SEEK_CUR);
+ break;
+ case CP_INTEGER:
+ case CP_FLOAT:
+ case CP_FIELDREF:
+ case CP_METHODREF:
+ case CP_INTERFACEMETHODREF:
+ case CP_NAMEANDTYPE:
+ seekerr = fseek(classfile, 4, SEEK_CUR);
+ break;
+ case CP_LONG:
+ case CP_DOUBLE:
+ seekerr = fseek(classfile, 8, SEEK_CUR);
+ ++(*cur);
+ break;
+ default:
+ corrupt_error();
+ }
+ if(seekerr)
+ seek_error();
+}
+
+void error(const char *format, ...)
+{
+ va_list ap;
+ va_start(ap, format);
+ vfprintf(stderr, format, ap);
+ va_end(ap);
+ exit(1);
+}
+
+int main(int argc, char **argv)
+{
+ FILE *classfile;
+ u_int16_t cp_count, i, this_class, classinfo_ptr;
+ u_int8_t length;
+
+ program = argv[0];
+
+ if(!argv[1])
+ error("%s: Missing input file\n", program);
+ classfile = fopen(argv[1], "rb");
+ if(!classfile)
+ error("%s: Error opening %s\n", program, argv[1]);
+
+ if(fseek(classfile, 8, SEEK_SET)) /* skip magic and version numbers */
+ seek_error();
+ cp_count = read_16(classfile);
+ pool = calloc(cp_count, sizeof(long));
+ if(!pool)
+ error("%s: Out of memory for constant pool\n", program);
+
+ for(i = 1; i < cp_count; ++i)
+ skip_constant(classfile, &i);
+ if(fseek(classfile, 2, SEEK_CUR)) /* skip access flags */
+ seek_error();
+
+ this_class = read_16(classfile);
+ if(this_class < 1 || this_class >= cp_count)
+ corrupt_error();
+ if(!pool[this_class] || pool[this_class] == -1)
+ corrupt_error();
+ if(fseek(classfile, pool[this_class] + 1, SEEK_SET))
+ seek_error();
+
+ classinfo_ptr = read_16(classfile);
+ if(classinfo_ptr < 1 || classinfo_ptr >= cp_count)
+ corrupt_error();
+ if(!pool[classinfo_ptr] || pool[classinfo_ptr] == -1)
+ corrupt_error();
+ if(fseek(classfile, pool[classinfo_ptr] + 1, SEEK_SET))
+ seek_error();
+
+ length = read_16(classfile);
+ for(i = 0; i < length; ++i)
+ {
+ u_int8_t x = read_8(classfile);
+ if((x & 0x80) || !x)
+ {
+ if((x & 0xE0) == 0xC0)
+ {
+ u_int8_t y = read_8(classfile);
+ if((y & 0xC0) == 0x80)
+ {
+ int c = ((x & 0x1f) << 6) + (y & 0x3f);
+ if(c) putchar(c);
+ else utf8_error();
+ }
+ else utf8_error();
+ }
+ else utf8_error();
+ }
+ else if(x == '/') putchar('.');
+ else putchar(x);
+ }
+ putchar('\n');
+ free(pool);
+ fclose(classfile);
+ return 0;
+}
diff --git a/javawrapper b/javawrapper
new file mode 100644
index 000000000000..bfb67faec7e9
--- /dev/null
+++ b/javawrapper
@@ -0,0 +1,88 @@
+#!/bin/bash
+# /usr/local/bin/javawrapper - the wrapper for binfmt_misc/java
+
+if [ -z "$1" ]; then
+ exec 1>&2
+ echo Usage: $0 class-file
+ exit 1
+fi
+
+CLASS=$1
+FQCLASS=`/usr/local/bin/javaclassname $1`
+FQCLASSN=`echo $FQCLASS | sed -e 's/^.*\.\([^.]*\)$/\1/'`
+FQCLASSP=`echo $FQCLASS | sed -e 's-\.-/-g' -e 's-^[^/]*$--' -e 's-/[^/]*$--'`
+
+# for example:
+# CLASS=Test.class
+# FQCLASS=foo.bar.Test
+# FQCLASSN=Test
+# FQCLASSP=foo/bar
+
+unset CLASSBASE
+
+declare -i LINKLEVEL=0
+
+while :; do
+ if [ "`basename $CLASS .class`" == "$FQCLASSN" ]; then
+ # See if this directory works straight off
+ cd -L `dirname $CLASS`
+ CLASSDIR=$PWD
+ cd $OLDPWD
+ if echo $CLASSDIR | grep -q "$FQCLASSP$"; then
+ CLASSBASE=`echo $CLASSDIR | sed -e "s.$FQCLASSP$.."`
+ break;
+ fi
+ # Try dereferencing the directory name
+ cd -P `dirname $CLASS`
+ CLASSDIR=$PWD
+ cd $OLDPWD
+ if echo $CLASSDIR | grep -q "$FQCLASSP$"; then
+ CLASSBASE=`echo $CLASSDIR | sed -e "s.$FQCLASSP$.."`
+ break;
+ fi
+ # If no other possible filename exists
+ if [ ! -L $CLASS ]; then
+ exec 1>&2
+ echo $0:
+ echo " $CLASS should be in a" \
+ "directory tree called $FQCLASSP"
+ exit 1
+ fi
+ fi
+ if [ ! -L $CLASS ]; then break; fi
+ # Go down one more level of symbolic links
+ let LINKLEVEL+=1
+ if [ $LINKLEVEL -gt 5 ]; then
+ exec 1>&2
+ echo $0:
+ echo " Too many symbolic links encountered"
+ exit 1
+ fi
+ CLASS=`ls --color=no -l $CLASS | sed -e 's/^.* \([^ ]*\)$/\1/'`
+done
+
+if [ -z "$CLASSBASE" ]; then
+ if [ -z "$FQCLASSP" ]; then
+ GOODNAME=$FQCLASSN.class
+ else
+ GOODNAME=$FQCLASSP/$FQCLASSN.class
+ fi
+ exec 1>&2
+ echo $0:
+ echo " $FQCLASS should be in a file called $GOODNAME"
+ exit 1
+fi
+
+if ! echo $CLASSPATH | grep -q "^\(.*:\)*$CLASSBASE\(:.*\)*"; then
+ # class is not in CLASSPATH, so prepend dir of class to CLASSPATH
+ if [ -z "${CLASSPATH}" ] ; then
+ export CLASSPATH=$CLASSBASE
+ else
+ export CLASSPATH=$CLASSBASE:$CLASSPATH
+ fi
+fi
+
+shift
+# set path to java using JAVA_HOME if available, otherwise assume it's on the PATH
+JAVA_PATH=${JAVA_HOME:+$JAVA_HOME/jre/bin/}java
+$JAVA_PATH $FQCLASS "$@"
diff --git a/wine.conf b/wine.conf
deleted file mode 100644
index 4d4307336587..000000000000
--- a/wine.conf
+++ /dev/null
@@ -1,2 +0,0 @@
-# Start WINE on Windows executables
-:DOSWin:M::MZ::/usr/bin/wine: