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