xref: /openbmc/linux/Documentation/admin-guide/java.rst (revision 9095bf25ea08135a5b74875dd0e3eeaddc4218a0)
19d85025bSMauro Carvalho ChehabJava(tm) Binary Kernel Support for Linux v1.03
29d85025bSMauro Carvalho Chehab----------------------------------------------
39d85025bSMauro Carvalho Chehab
49d85025bSMauro Carvalho ChehabLinux beats them ALL! While all other OS's are TALKING about direct
59d85025bSMauro Carvalho Chehabsupport of Java Binaries in the OS, Linux is doing it!
69d85025bSMauro Carvalho Chehab
79d85025bSMauro Carvalho ChehabYou can execute Java applications and Java Applets just like any
89d85025bSMauro Carvalho Chehabother program after you have done the following:
99d85025bSMauro Carvalho Chehab
109d85025bSMauro Carvalho Chehab1) You MUST FIRST install the Java Developers Kit for Linux.
119d85025bSMauro Carvalho Chehab   The Java on Linux HOWTO gives the details on getting and
129d85025bSMauro Carvalho Chehab   installing this. This HOWTO can be found at:
139d85025bSMauro Carvalho Chehab
149d85025bSMauro Carvalho Chehab	ftp://sunsite.unc.edu/pub/Linux/docs/HOWTO/Java-HOWTO
159d85025bSMauro Carvalho Chehab
169d85025bSMauro Carvalho Chehab   You should also set up a reasonable CLASSPATH environment
179d85025bSMauro Carvalho Chehab   variable to use Java applications that make use of any
189d85025bSMauro Carvalho Chehab   nonstandard classes (not included in the same directory
199d85025bSMauro Carvalho Chehab   as the application itself).
209d85025bSMauro Carvalho Chehab
219d85025bSMauro Carvalho Chehab2) You have to compile BINFMT_MISC either as a module or into
229d85025bSMauro Carvalho Chehab   the kernel (``CONFIG_BINFMT_MISC``) and set it up properly.
239d85025bSMauro Carvalho Chehab   If you choose to compile it as a module, you will have
249d85025bSMauro Carvalho Chehab   to insert it manually with modprobe/insmod, as kmod
259d85025bSMauro Carvalho Chehab   cannot easily be supported with binfmt_misc.
269d85025bSMauro Carvalho Chehab   Read the file 'binfmt_misc.txt' in this directory to know
279d85025bSMauro Carvalho Chehab   more about the configuration process.
289d85025bSMauro Carvalho Chehab
299d85025bSMauro Carvalho Chehab3) Add the following configuration items to binfmt_misc
309d85025bSMauro Carvalho Chehab   (you should really have read ``binfmt_misc.txt`` now):
319d85025bSMauro Carvalho Chehab   support for Java applications::
329d85025bSMauro Carvalho Chehab
339d85025bSMauro Carvalho Chehab     ':Java:M::\xca\xfe\xba\xbe::/usr/local/bin/javawrapper:'
349d85025bSMauro Carvalho Chehab
359d85025bSMauro Carvalho Chehab   support for executable Jar files::
369d85025bSMauro Carvalho Chehab
379d85025bSMauro Carvalho Chehab     ':ExecutableJAR:E::jar::/usr/local/bin/jarwrapper:'
389d85025bSMauro Carvalho Chehab
399d85025bSMauro Carvalho Chehab   support for Java Applets::
409d85025bSMauro Carvalho Chehab
419d85025bSMauro Carvalho Chehab     ':Applet:E::html::/usr/bin/appletviewer:'
429d85025bSMauro Carvalho Chehab
439d85025bSMauro Carvalho Chehab   or the following, if you want to be more selective::
449d85025bSMauro Carvalho Chehab
459d85025bSMauro Carvalho Chehab     ':Applet:M::<!--applet::/usr/bin/appletviewer:'
469d85025bSMauro Carvalho Chehab
479d85025bSMauro Carvalho Chehab   Of course you have to fix the path names. The path/file names given in this
489d85025bSMauro Carvalho Chehab   document match the Debian 2.1 system. (i.e. jdk installed in ``/usr``,
499d85025bSMauro Carvalho Chehab   custom wrappers from this document in ``/usr/local``)
509d85025bSMauro Carvalho Chehab
519d85025bSMauro Carvalho Chehab   Note, that for the more selective applet support you have to modify
529d85025bSMauro Carvalho Chehab   existing html-files to contain ``<!--applet-->`` in the first line
539d85025bSMauro Carvalho Chehab   (``<`` has to be the first character!) to let this work!
549d85025bSMauro Carvalho Chehab
559d85025bSMauro Carvalho Chehab   For the compiled Java programs you need a wrapper script like the
569d85025bSMauro Carvalho Chehab   following (this is because Java is broken in case of the filename
579d85025bSMauro Carvalho Chehab   handling), again fix the path names, both in the script and in the
589d85025bSMauro Carvalho Chehab   above given configuration string.
599d85025bSMauro Carvalho Chehab
609d85025bSMauro Carvalho Chehab   You, too, need the little program after the script. Compile like::
619d85025bSMauro Carvalho Chehab
629d85025bSMauro Carvalho Chehab	gcc -O2 -o javaclassname javaclassname.c
639d85025bSMauro Carvalho Chehab
649d85025bSMauro Carvalho Chehab   and stick it to ``/usr/local/bin``.
659d85025bSMauro Carvalho Chehab
669d85025bSMauro Carvalho Chehab   Both the javawrapper shellscript and the javaclassname program
679d85025bSMauro Carvalho Chehab   were supplied by Colin J. Watson <cjw44@cam.ac.uk>.
689d85025bSMauro Carvalho Chehab
69*07a37ba5SJani NikulaJavawrapper shell script:
70*07a37ba5SJani Nikula
71*07a37ba5SJani Nikula.. code-block:: sh
729d85025bSMauro Carvalho Chehab
739d85025bSMauro Carvalho Chehab  #!/bin/bash
749d85025bSMauro Carvalho Chehab  # /usr/local/bin/javawrapper - the wrapper for binfmt_misc/java
759d85025bSMauro Carvalho Chehab
769d85025bSMauro Carvalho Chehab  if [ -z "$1" ]; then
779d85025bSMauro Carvalho Chehab	exec 1>&2
789d85025bSMauro Carvalho Chehab	echo Usage: $0 class-file
799d85025bSMauro Carvalho Chehab	exit 1
809d85025bSMauro Carvalho Chehab  fi
819d85025bSMauro Carvalho Chehab
829d85025bSMauro Carvalho Chehab  CLASS=$1
839d85025bSMauro Carvalho Chehab  FQCLASS=`/usr/local/bin/javaclassname $1`
849d85025bSMauro Carvalho Chehab  FQCLASSN=`echo $FQCLASS | sed -e 's/^.*\.\([^.]*\)$/\1/'`
859d85025bSMauro Carvalho Chehab  FQCLASSP=`echo $FQCLASS | sed -e 's-\.-/-g' -e 's-^[^/]*$--' -e 's-/[^/]*$--'`
869d85025bSMauro Carvalho Chehab
879d85025bSMauro Carvalho Chehab  # for example:
889d85025bSMauro Carvalho Chehab  # CLASS=Test.class
899d85025bSMauro Carvalho Chehab  # FQCLASS=foo.bar.Test
909d85025bSMauro Carvalho Chehab  # FQCLASSN=Test
919d85025bSMauro Carvalho Chehab  # FQCLASSP=foo/bar
929d85025bSMauro Carvalho Chehab
939d85025bSMauro Carvalho Chehab  unset CLASSBASE
949d85025bSMauro Carvalho Chehab
959d85025bSMauro Carvalho Chehab  declare -i LINKLEVEL=0
969d85025bSMauro Carvalho Chehab
979d85025bSMauro Carvalho Chehab  while :; do
989d85025bSMauro Carvalho Chehab	if [ "`basename $CLASS .class`" == "$FQCLASSN" ]; then
999d85025bSMauro Carvalho Chehab		# See if this directory works straight off
1009d85025bSMauro Carvalho Chehab		cd -L `dirname $CLASS`
1019d85025bSMauro Carvalho Chehab		CLASSDIR=$PWD
1029d85025bSMauro Carvalho Chehab		cd $OLDPWD
1039d85025bSMauro Carvalho Chehab		if echo $CLASSDIR | grep -q "$FQCLASSP$"; then
1049d85025bSMauro Carvalho Chehab			CLASSBASE=`echo $CLASSDIR | sed -e "s.$FQCLASSP$.."`
1059d85025bSMauro Carvalho Chehab			break;
1069d85025bSMauro Carvalho Chehab		fi
1079d85025bSMauro Carvalho Chehab		# Try dereferencing the directory name
1089d85025bSMauro Carvalho Chehab		cd -P `dirname $CLASS`
1099d85025bSMauro Carvalho Chehab		CLASSDIR=$PWD
1109d85025bSMauro Carvalho Chehab		cd $OLDPWD
1119d85025bSMauro Carvalho Chehab		if echo $CLASSDIR | grep -q "$FQCLASSP$"; then
1129d85025bSMauro Carvalho Chehab			CLASSBASE=`echo $CLASSDIR | sed -e "s.$FQCLASSP$.."`
1139d85025bSMauro Carvalho Chehab			break;
1149d85025bSMauro Carvalho Chehab		fi
1159d85025bSMauro Carvalho Chehab		# If no other possible filename exists
1169d85025bSMauro Carvalho Chehab		if [ ! -L $CLASS ]; then
1179d85025bSMauro Carvalho Chehab			exec 1>&2
1189d85025bSMauro Carvalho Chehab			echo $0:
1199d85025bSMauro Carvalho Chehab			echo "  $CLASS should be in a" \
1209d85025bSMauro Carvalho Chehab			     "directory tree called $FQCLASSP"
1219d85025bSMauro Carvalho Chehab			exit 1
1229d85025bSMauro Carvalho Chehab		fi
1239d85025bSMauro Carvalho Chehab	fi
1249d85025bSMauro Carvalho Chehab	if [ ! -L $CLASS ]; then break; fi
1259d85025bSMauro Carvalho Chehab	# Go down one more level of symbolic links
1269d85025bSMauro Carvalho Chehab	let LINKLEVEL+=1
1279d85025bSMauro Carvalho Chehab	if [ $LINKLEVEL -gt 5 ]; then
1289d85025bSMauro Carvalho Chehab		exec 1>&2
1299d85025bSMauro Carvalho Chehab		echo $0:
1309d85025bSMauro Carvalho Chehab		echo "  Too many symbolic links encountered"
1319d85025bSMauro Carvalho Chehab		exit 1
1329d85025bSMauro Carvalho Chehab	fi
1339d85025bSMauro Carvalho Chehab	CLASS=`ls --color=no -l $CLASS | sed -e 's/^.* \([^ ]*\)$/\1/'`
1349d85025bSMauro Carvalho Chehab  done
1359d85025bSMauro Carvalho Chehab
1369d85025bSMauro Carvalho Chehab  if [ -z "$CLASSBASE" ]; then
1379d85025bSMauro Carvalho Chehab	if [ -z "$FQCLASSP" ]; then
1389d85025bSMauro Carvalho Chehab		GOODNAME=$FQCLASSN.class
1399d85025bSMauro Carvalho Chehab	else
1409d85025bSMauro Carvalho Chehab		GOODNAME=$FQCLASSP/$FQCLASSN.class
1419d85025bSMauro Carvalho Chehab	fi
1429d85025bSMauro Carvalho Chehab	exec 1>&2
1439d85025bSMauro Carvalho Chehab	echo $0:
1449d85025bSMauro Carvalho Chehab	echo "  $FQCLASS should be in a file called $GOODNAME"
1459d85025bSMauro Carvalho Chehab	exit 1
1469d85025bSMauro Carvalho Chehab  fi
1479d85025bSMauro Carvalho Chehab
1489d85025bSMauro Carvalho Chehab  if ! echo $CLASSPATH | grep -q "^\(.*:\)*$CLASSBASE\(:.*\)*"; then
1499d85025bSMauro Carvalho Chehab	# class is not in CLASSPATH, so prepend dir of class to CLASSPATH
1509d85025bSMauro Carvalho Chehab	if [ -z "${CLASSPATH}" ] ; then
1519d85025bSMauro Carvalho Chehab		export CLASSPATH=$CLASSBASE
1529d85025bSMauro Carvalho Chehab	else
1539d85025bSMauro Carvalho Chehab		export CLASSPATH=$CLASSBASE:$CLASSPATH
1549d85025bSMauro Carvalho Chehab	fi
1559d85025bSMauro Carvalho Chehab  fi
1569d85025bSMauro Carvalho Chehab
1579d85025bSMauro Carvalho Chehab  shift
1589d85025bSMauro Carvalho Chehab  /usr/bin/java $FQCLASS "$@"
1599d85025bSMauro Carvalho Chehab
160*07a37ba5SJani Nikulajavaclassname.c:
161*07a37ba5SJani Nikula
162*07a37ba5SJani Nikula.. code-block:: c
1639d85025bSMauro Carvalho Chehab
1649d85025bSMauro Carvalho Chehab  /* javaclassname.c
1659d85025bSMauro Carvalho Chehab   *
1669d85025bSMauro Carvalho Chehab   * Extracts the class name from a Java class file; intended for use in a Java
1679d85025bSMauro Carvalho Chehab   * wrapper of the type supported by the binfmt_misc option in the Linux kernel.
1689d85025bSMauro Carvalho Chehab   *
1699d85025bSMauro Carvalho Chehab   * Copyright (C) 1999 Colin J. Watson <cjw44@cam.ac.uk>.
1709d85025bSMauro Carvalho Chehab   *
1719d85025bSMauro Carvalho Chehab   * This program is free software; you can redistribute it and/or modify
1729d85025bSMauro Carvalho Chehab   * it under the terms of the GNU General Public License as published by
1739d85025bSMauro Carvalho Chehab   * the Free Software Foundation; either version 2 of the License, or
1749d85025bSMauro Carvalho Chehab   * (at your option) any later version.
1759d85025bSMauro Carvalho Chehab   *
1769d85025bSMauro Carvalho Chehab   * This program is distributed in the hope that it will be useful,
1779d85025bSMauro Carvalho Chehab   * but WITHOUT ANY WARRANTY; without even the implied warranty of
1789d85025bSMauro Carvalho Chehab   * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1799d85025bSMauro Carvalho Chehab   * GNU General Public License for more details.
1809d85025bSMauro Carvalho Chehab   *
1819d85025bSMauro Carvalho Chehab   * You should have received a copy of the GNU General Public License
1829d85025bSMauro Carvalho Chehab   * along with this program; if not, write to the Free Software
1839d85025bSMauro Carvalho Chehab   * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
1849d85025bSMauro Carvalho Chehab   */
1859d85025bSMauro Carvalho Chehab
1869d85025bSMauro Carvalho Chehab  #include <stdlib.h>
1879d85025bSMauro Carvalho Chehab  #include <stdio.h>
1889d85025bSMauro Carvalho Chehab  #include <stdarg.h>
1899d85025bSMauro Carvalho Chehab  #include <sys/types.h>
1909d85025bSMauro Carvalho Chehab
1919d85025bSMauro Carvalho Chehab  /* From Sun's Java VM Specification, as tag entries in the constant pool. */
1929d85025bSMauro Carvalho Chehab
1939d85025bSMauro Carvalho Chehab  #define CP_UTF8 1
1949d85025bSMauro Carvalho Chehab  #define CP_INTEGER 3
1959d85025bSMauro Carvalho Chehab  #define CP_FLOAT 4
1969d85025bSMauro Carvalho Chehab  #define CP_LONG 5
1979d85025bSMauro Carvalho Chehab  #define CP_DOUBLE 6
1989d85025bSMauro Carvalho Chehab  #define CP_CLASS 7
1999d85025bSMauro Carvalho Chehab  #define CP_STRING 8
2009d85025bSMauro Carvalho Chehab  #define CP_FIELDREF 9
2019d85025bSMauro Carvalho Chehab  #define CP_METHODREF 10
2029d85025bSMauro Carvalho Chehab  #define CP_INTERFACEMETHODREF 11
2039d85025bSMauro Carvalho Chehab  #define CP_NAMEANDTYPE 12
2049d85025bSMauro Carvalho Chehab  #define CP_METHODHANDLE 15
2059d85025bSMauro Carvalho Chehab  #define CP_METHODTYPE 16
2069d85025bSMauro Carvalho Chehab  #define CP_INVOKEDYNAMIC 18
2079d85025bSMauro Carvalho Chehab
2089d85025bSMauro Carvalho Chehab  /* Define some commonly used error messages */
2099d85025bSMauro Carvalho Chehab
2109d85025bSMauro Carvalho Chehab  #define seek_error() error("%s: Cannot seek\n", program)
2119d85025bSMauro Carvalho Chehab  #define corrupt_error() error("%s: Class file corrupt\n", program)
2129d85025bSMauro Carvalho Chehab  #define eof_error() error("%s: Unexpected end of file\n", program)
2139d85025bSMauro Carvalho Chehab  #define utf8_error() error("%s: Only ASCII 1-255 supported\n", program);
2149d85025bSMauro Carvalho Chehab
2159d85025bSMauro Carvalho Chehab  char *program;
2169d85025bSMauro Carvalho Chehab
2179d85025bSMauro Carvalho Chehab  long *pool;
2189d85025bSMauro Carvalho Chehab
2199d85025bSMauro Carvalho Chehab  u_int8_t read_8(FILE *classfile);
2209d85025bSMauro Carvalho Chehab  u_int16_t read_16(FILE *classfile);
2219d85025bSMauro Carvalho Chehab  void skip_constant(FILE *classfile, u_int16_t *cur);
2229d85025bSMauro Carvalho Chehab  void error(const char *format, ...);
2239d85025bSMauro Carvalho Chehab  int main(int argc, char **argv);
2249d85025bSMauro Carvalho Chehab
2259d85025bSMauro Carvalho Chehab  /* Reads in an unsigned 8-bit integer. */
2269d85025bSMauro Carvalho Chehab  u_int8_t read_8(FILE *classfile)
2279d85025bSMauro Carvalho Chehab  {
2289d85025bSMauro Carvalho Chehab	int b = fgetc(classfile);
2299d85025bSMauro Carvalho Chehab	if(b == EOF)
2309d85025bSMauro Carvalho Chehab		eof_error();
2319d85025bSMauro Carvalho Chehab	return (u_int8_t)b;
2329d85025bSMauro Carvalho Chehab  }
2339d85025bSMauro Carvalho Chehab
2349d85025bSMauro Carvalho Chehab  /* Reads in an unsigned 16-bit integer. */
2359d85025bSMauro Carvalho Chehab  u_int16_t read_16(FILE *classfile)
2369d85025bSMauro Carvalho Chehab  {
2379d85025bSMauro Carvalho Chehab	int b1, b2;
2389d85025bSMauro Carvalho Chehab	b1 = fgetc(classfile);
2399d85025bSMauro Carvalho Chehab	if(b1 == EOF)
2409d85025bSMauro Carvalho Chehab		eof_error();
2419d85025bSMauro Carvalho Chehab	b2 = fgetc(classfile);
2429d85025bSMauro Carvalho Chehab	if(b2 == EOF)
2439d85025bSMauro Carvalho Chehab		eof_error();
2449d85025bSMauro Carvalho Chehab	return (u_int16_t)((b1 << 8) | b2);
2459d85025bSMauro Carvalho Chehab  }
2469d85025bSMauro Carvalho Chehab
2479d85025bSMauro Carvalho Chehab  /* Reads in a value from the constant pool. */
2489d85025bSMauro Carvalho Chehab  void skip_constant(FILE *classfile, u_int16_t *cur)
2499d85025bSMauro Carvalho Chehab  {
2509d85025bSMauro Carvalho Chehab	u_int16_t len;
2519d85025bSMauro Carvalho Chehab	int seekerr = 1;
2529d85025bSMauro Carvalho Chehab	pool[*cur] = ftell(classfile);
2539d85025bSMauro Carvalho Chehab	switch(read_8(classfile))
2549d85025bSMauro Carvalho Chehab	{
2559d85025bSMauro Carvalho Chehab	case CP_UTF8:
2569d85025bSMauro Carvalho Chehab		len = read_16(classfile);
2579d85025bSMauro Carvalho Chehab		seekerr = fseek(classfile, len, SEEK_CUR);
2589d85025bSMauro Carvalho Chehab		break;
2599d85025bSMauro Carvalho Chehab	case CP_CLASS:
2609d85025bSMauro Carvalho Chehab	case CP_STRING:
2619d85025bSMauro Carvalho Chehab	case CP_METHODTYPE:
2629d85025bSMauro Carvalho Chehab		seekerr = fseek(classfile, 2, SEEK_CUR);
2639d85025bSMauro Carvalho Chehab		break;
2649d85025bSMauro Carvalho Chehab	case CP_METHODHANDLE:
2659d85025bSMauro Carvalho Chehab		seekerr = fseek(classfile, 3, SEEK_CUR);
2669d85025bSMauro Carvalho Chehab		break;
2679d85025bSMauro Carvalho Chehab	case CP_INTEGER:
2689d85025bSMauro Carvalho Chehab	case CP_FLOAT:
2699d85025bSMauro Carvalho Chehab	case CP_FIELDREF:
2709d85025bSMauro Carvalho Chehab	case CP_METHODREF:
2719d85025bSMauro Carvalho Chehab	case CP_INTERFACEMETHODREF:
2729d85025bSMauro Carvalho Chehab	case CP_NAMEANDTYPE:
2739d85025bSMauro Carvalho Chehab	case CP_INVOKEDYNAMIC:
2749d85025bSMauro Carvalho Chehab		seekerr = fseek(classfile, 4, SEEK_CUR);
2759d85025bSMauro Carvalho Chehab		break;
2769d85025bSMauro Carvalho Chehab	case CP_LONG:
2779d85025bSMauro Carvalho Chehab	case CP_DOUBLE:
2789d85025bSMauro Carvalho Chehab		seekerr = fseek(classfile, 8, SEEK_CUR);
2799d85025bSMauro Carvalho Chehab		++(*cur);
2809d85025bSMauro Carvalho Chehab		break;
2819d85025bSMauro Carvalho Chehab	default:
2829d85025bSMauro Carvalho Chehab		corrupt_error();
2839d85025bSMauro Carvalho Chehab	}
2849d85025bSMauro Carvalho Chehab	if(seekerr)
2859d85025bSMauro Carvalho Chehab		seek_error();
2869d85025bSMauro Carvalho Chehab  }
2879d85025bSMauro Carvalho Chehab
2889d85025bSMauro Carvalho Chehab  void error(const char *format, ...)
2899d85025bSMauro Carvalho Chehab  {
2909d85025bSMauro Carvalho Chehab	va_list ap;
2919d85025bSMauro Carvalho Chehab	va_start(ap, format);
2929d85025bSMauro Carvalho Chehab	vfprintf(stderr, format, ap);
2939d85025bSMauro Carvalho Chehab	va_end(ap);
2949d85025bSMauro Carvalho Chehab	exit(1);
2959d85025bSMauro Carvalho Chehab  }
2969d85025bSMauro Carvalho Chehab
2979d85025bSMauro Carvalho Chehab  int main(int argc, char **argv)
2989d85025bSMauro Carvalho Chehab  {
2999d85025bSMauro Carvalho Chehab	FILE *classfile;
3009d85025bSMauro Carvalho Chehab	u_int16_t cp_count, i, this_class, classinfo_ptr;
3019d85025bSMauro Carvalho Chehab	u_int8_t length;
3029d85025bSMauro Carvalho Chehab
3039d85025bSMauro Carvalho Chehab	program = argv[0];
3049d85025bSMauro Carvalho Chehab
3059d85025bSMauro Carvalho Chehab	if(!argv[1])
3069d85025bSMauro Carvalho Chehab		error("%s: Missing input file\n", program);
3079d85025bSMauro Carvalho Chehab	classfile = fopen(argv[1], "rb");
3089d85025bSMauro Carvalho Chehab	if(!classfile)
3099d85025bSMauro Carvalho Chehab		error("%s: Error opening %s\n", program, argv[1]);
3109d85025bSMauro Carvalho Chehab
3119d85025bSMauro Carvalho Chehab	if(fseek(classfile, 8, SEEK_SET))  /* skip magic and version numbers */
3129d85025bSMauro Carvalho Chehab		seek_error();
3139d85025bSMauro Carvalho Chehab	cp_count = read_16(classfile);
3149d85025bSMauro Carvalho Chehab	pool = calloc(cp_count, sizeof(long));
3159d85025bSMauro Carvalho Chehab	if(!pool)
3169d85025bSMauro Carvalho Chehab		error("%s: Out of memory for constant pool\n", program);
3179d85025bSMauro Carvalho Chehab
3189d85025bSMauro Carvalho Chehab	for(i = 1; i < cp_count; ++i)
3199d85025bSMauro Carvalho Chehab		skip_constant(classfile, &i);
3209d85025bSMauro Carvalho Chehab	if(fseek(classfile, 2, SEEK_CUR))	/* skip access flags */
3219d85025bSMauro Carvalho Chehab		seek_error();
3229d85025bSMauro Carvalho Chehab
3239d85025bSMauro Carvalho Chehab	this_class = read_16(classfile);
3249d85025bSMauro Carvalho Chehab	if(this_class < 1 || this_class >= cp_count)
3259d85025bSMauro Carvalho Chehab		corrupt_error();
3269d85025bSMauro Carvalho Chehab	if(!pool[this_class] || pool[this_class] == -1)
3279d85025bSMauro Carvalho Chehab		corrupt_error();
3289d85025bSMauro Carvalho Chehab	if(fseek(classfile, pool[this_class] + 1, SEEK_SET))
3299d85025bSMauro Carvalho Chehab		seek_error();
3309d85025bSMauro Carvalho Chehab
3319d85025bSMauro Carvalho Chehab	classinfo_ptr = read_16(classfile);
3329d85025bSMauro Carvalho Chehab	if(classinfo_ptr < 1 || classinfo_ptr >= cp_count)
3339d85025bSMauro Carvalho Chehab		corrupt_error();
3349d85025bSMauro Carvalho Chehab	if(!pool[classinfo_ptr] || pool[classinfo_ptr] == -1)
3359d85025bSMauro Carvalho Chehab		corrupt_error();
3369d85025bSMauro Carvalho Chehab	if(fseek(classfile, pool[classinfo_ptr] + 1, SEEK_SET))
3379d85025bSMauro Carvalho Chehab		seek_error();
3389d85025bSMauro Carvalho Chehab
3399d85025bSMauro Carvalho Chehab	length = read_16(classfile);
3409d85025bSMauro Carvalho Chehab	for(i = 0; i < length; ++i)
3419d85025bSMauro Carvalho Chehab	{
3429d85025bSMauro Carvalho Chehab		u_int8_t x = read_8(classfile);
3439d85025bSMauro Carvalho Chehab		if((x & 0x80) || !x)
3449d85025bSMauro Carvalho Chehab		{
3459d85025bSMauro Carvalho Chehab			if((x & 0xE0) == 0xC0)
3469d85025bSMauro Carvalho Chehab			{
3479d85025bSMauro Carvalho Chehab				u_int8_t y = read_8(classfile);
3489d85025bSMauro Carvalho Chehab				if((y & 0xC0) == 0x80)
3499d85025bSMauro Carvalho Chehab				{
3509d85025bSMauro Carvalho Chehab					int c = ((x & 0x1f) << 6) + (y & 0x3f);
3519d85025bSMauro Carvalho Chehab					if(c) putchar(c);
3529d85025bSMauro Carvalho Chehab					else utf8_error();
3539d85025bSMauro Carvalho Chehab				}
3549d85025bSMauro Carvalho Chehab				else utf8_error();
3559d85025bSMauro Carvalho Chehab			}
3569d85025bSMauro Carvalho Chehab			else utf8_error();
3579d85025bSMauro Carvalho Chehab		}
3589d85025bSMauro Carvalho Chehab		else if(x == '/') putchar('.');
3599d85025bSMauro Carvalho Chehab		else putchar(x);
3609d85025bSMauro Carvalho Chehab	}
3619d85025bSMauro Carvalho Chehab	putchar('\n');
3629d85025bSMauro Carvalho Chehab	free(pool);
3639d85025bSMauro Carvalho Chehab	fclose(classfile);
3649d85025bSMauro Carvalho Chehab	return 0;
3659d85025bSMauro Carvalho Chehab  }
3669d85025bSMauro Carvalho Chehab
3679d85025bSMauro Carvalho Chehabjarwrapper::
3689d85025bSMauro Carvalho Chehab
3699d85025bSMauro Carvalho Chehab  #!/bin/bash
3709d85025bSMauro Carvalho Chehab  # /usr/local/java/bin/jarwrapper - the wrapper for binfmt_misc/jar
3719d85025bSMauro Carvalho Chehab
3729d85025bSMauro Carvalho Chehab  java -jar $1
3739d85025bSMauro Carvalho Chehab
3749d85025bSMauro Carvalho Chehab
3759d85025bSMauro Carvalho ChehabNow simply ``chmod +x`` the ``.class``, ``.jar`` and/or ``.html`` files you
3769d85025bSMauro Carvalho Chehabwant to execute.
3779d85025bSMauro Carvalho Chehab
3789d85025bSMauro Carvalho ChehabTo add a Java program to your path best put a symbolic link to the main
3799d85025bSMauro Carvalho Chehab.class file into /usr/bin (or another place you like) omitting the .class
3809d85025bSMauro Carvalho Chehabextension. The directory containing the original .class file will be
3819d85025bSMauro Carvalho Chehabadded to your CLASSPATH during execution.
3829d85025bSMauro Carvalho Chehab
3839d85025bSMauro Carvalho Chehab
3849d85025bSMauro Carvalho ChehabTo test your new setup, enter in the following simple Java app, and name
385*07a37ba5SJani Nikulait "HelloWorld.java":
386*07a37ba5SJani Nikula
387*07a37ba5SJani Nikula.. code-block:: java
3889d85025bSMauro Carvalho Chehab
3899d85025bSMauro Carvalho Chehab	class HelloWorld {
3909d85025bSMauro Carvalho Chehab		public static void main(String args[]) {
3919d85025bSMauro Carvalho Chehab			System.out.println("Hello World!");
3929d85025bSMauro Carvalho Chehab		}
3939d85025bSMauro Carvalho Chehab	}
3949d85025bSMauro Carvalho Chehab
3959d85025bSMauro Carvalho ChehabNow compile the application with::
3969d85025bSMauro Carvalho Chehab
3979d85025bSMauro Carvalho Chehab	javac HelloWorld.java
3989d85025bSMauro Carvalho Chehab
3999d85025bSMauro Carvalho ChehabSet the executable permissions of the binary file, with::
4009d85025bSMauro Carvalho Chehab
4019d85025bSMauro Carvalho Chehab	chmod 755 HelloWorld.class
4029d85025bSMauro Carvalho Chehab
4039d85025bSMauro Carvalho ChehabAnd then execute it::
4049d85025bSMauro Carvalho Chehab
4059d85025bSMauro Carvalho Chehab	./HelloWorld.class
4069d85025bSMauro Carvalho Chehab
4079d85025bSMauro Carvalho Chehab
4089d85025bSMauro Carvalho ChehabTo execute Java Jar files, simple chmod the ``*.jar`` files to include
4099d85025bSMauro Carvalho Chehabthe execution bit, then just do::
4109d85025bSMauro Carvalho Chehab
4119d85025bSMauro Carvalho Chehab       ./Application.jar
4129d85025bSMauro Carvalho Chehab
4139d85025bSMauro Carvalho Chehab
4149d85025bSMauro Carvalho ChehabTo execute Java Applets, simple chmod the ``*.html`` files to include
4159d85025bSMauro Carvalho Chehabthe execution bit, then just do::
4169d85025bSMauro Carvalho Chehab
4179d85025bSMauro Carvalho Chehab	./Applet.html
4189d85025bSMauro Carvalho Chehab
4199d85025bSMauro Carvalho Chehab
4209d85025bSMauro Carvalho Chehaboriginally by Brian A. Lantz, brian@lantz.com
4219d85025bSMauro Carvalho Chehabheavily edited for binfmt_misc by Richard Günther
4229d85025bSMauro Carvalho Chehabnew scripts by Colin J. Watson <cjw44@cam.ac.uk>
4239d85025bSMauro Carvalho Chehabadded executable Jar file support by Kurt Huwig <kurt@iku-netz.de>
424