patch-1.3.100 linux/fs/binfmt_java.c
Next file: linux/fs/exec.c
Previous file: linux/fs/affs/namei.c
Back to the patch index
Back to the overall index
- Lines: 188
- Date:
Wed May 8 18:28:01 1996
- Orig file:
v1.3.99/linux/fs/binfmt_java.c
- Orig date:
Thu Jan 1 02:00:00 1970
diff -u --recursive --new-file v1.3.99/linux/fs/binfmt_java.c linux/fs/binfmt_java.c
@@ -0,0 +1,187 @@
+/*
+ * linux/fs/binfmt_java.c
+ *
+ * Copyright (C) 1996 Brian A. Lantz
+ * derived from binfmt_script.c
+ */
+
+#include <linux/module.h>
+#include <linux/string.h>
+#include <linux/stat.h>
+#include <linux/malloc.h>
+#include <linux/binfmts.h>
+#include <paths.h>
+
+#define _PATH_JAVA "/usr/local/java/bin/java"
+#define _PATH_APPLET "/usr/local/java/bin/appletviewer"
+#define _PATH_BASH "/bin/bash"
+
+static int do_load_script(struct linux_binprm *bprm,struct pt_regs *regs)
+{
+ char *cp, *interp, *i_name;
+ int retval;
+ unsigned char *ucp = (unsigned char *) bprm->buf;
+ if ((ucp[0] != 0xca) || (ucp[1] != 0xfe) || (ucp[2] != 0xba) || (ucp[3] != 0xbe))
+ return -ENOEXEC;
+
+ iput(bprm->inode);
+ bprm->dont_iput=1;
+
+ /*
+ * OK, we've set the interpreter name
+ * Splice in (1) the interpreter's name for argv[0] (_PATH_BASH)
+ * (2) the name of the java wrapper for argv[1] (_PATH_JAVA)
+ * (3) filename of Java class (replace argv[0])
+ * without leading path or trailing '.class'
+ *
+ * This is done in reverse order, because of how the
+ * user environment and arguments are stored.
+ */
+ remove_arg_zero(bprm);
+ if ((cp = strstr (bprm->filename, ".class")) != NULL)
+ *cp = 0;
+ if ((i_name = strrchr (bprm->filename, '/')) != NULL)
+ i_name++;
+ else
+ i_name = bprm->filename;
+ bprm->p = copy_strings(1, &i_name, bprm->page, bprm->p, 2);
+ bprm->argc++;
+
+ strcpy (bprm->buf, _PATH_JAVA);
+ cp = bprm->buf;
+ bprm->p = copy_strings(1, &cp, bprm->page, bprm->p, 2);
+ bprm->argc++;
+
+ strcpy (bprm->buf, _PATH_BASH);
+ interp = bprm->buf;
+ if ((i_name = strrchr (bprm->buf, '/')) != NULL)
+ i_name++;
+ else
+ i_name = bprm->buf;
+ bprm->p = copy_strings(1, &i_name, bprm->page, bprm->p, 2);
+ bprm->argc++;
+ if (!bprm->p)
+ return -E2BIG;
+ /*
+ * OK, now restart the process with the interpreter's inode.
+ * Note that we use open_namei() as the name is now in kernel
+ * space, and we don't need to copy it.
+ */
+ retval = open_namei(interp, 0, 0, &bprm->inode, NULL);
+ if (retval)
+ return retval;
+ bprm->dont_iput=0;
+ retval=prepare_binprm(bprm);
+ if(retval<0)
+ return retval;
+
+ return search_binary_handler(bprm,regs);
+}
+
+static int do_load_applet(struct linux_binprm *bprm,struct pt_regs *regs)
+{
+ char *cp, *interp, *i_name;
+ int retval;
+ if (strncmp (bprm->buf, "<!--applet", 10))
+ return -ENOEXEC;
+
+ iput(bprm->inode);
+ bprm->dont_iput=1;
+
+ /*
+ * OK, we've set the interpreter name
+ * Splice in (1) the interpreter's name for argv[0] (_PATH_BSHELL)
+ * (2) the name of the appletviewer wrapper for argv[1] (_PATH_APPLET)
+ * (3) filename of html file (replace argv[0])
+ *
+ * This is done in reverse order, because of how the
+ * user environment and arguments are stored.
+ */
+ remove_arg_zero(bprm);
+ i_name = bprm->filename;
+ bprm->p = copy_strings(1, &i_name, bprm->page, bprm->p, 2);
+ bprm->argc++;
+
+ strcpy (bprm->buf, _PATH_APPLET);
+ cp = bprm->buf;
+ bprm->p = copy_strings(1, &cp, bprm->page, bprm->p, 2);
+ bprm->argc++;
+
+ strcpy (bprm->buf, _PATH_BSHELL);
+ interp = bprm->buf;
+ if ((i_name = strrchr (bprm->buf, '/')) != NULL)
+ i_name++;
+ else
+ i_name = bprm->buf;
+ bprm->p = copy_strings(1, &i_name, bprm->page, bprm->p, 2);
+ bprm->argc++;
+ if (!bprm->p)
+ return -E2BIG;
+ /*
+ * OK, now restart the process with the interpreter's inode.
+ * Note that we use open_namei() as the name is now in kernel
+ * space, and we don't need to copy it.
+ */
+ retval = open_namei(interp, 0, 0, &bprm->inode, NULL);
+ if (retval)
+ return retval;
+ bprm->dont_iput=0;
+ retval=prepare_binprm(bprm);
+ if(retval<0)
+ return retval;
+
+ return search_binary_handler(bprm,regs);
+}
+
+static int load_script(struct linux_binprm *bprm,struct pt_regs *regs)
+{
+ int retval;
+ MOD_INC_USE_COUNT;
+ retval = do_load_script(bprm,regs);
+ MOD_DEC_USE_COUNT;
+ return retval;
+}
+
+struct linux_binfmt java_format = {
+#ifndef MODULE
+ NULL, 0, load_script, NULL, NULL
+#else
+ NULL, &mod_use_count_, load_script, NULL, NULL
+#endif
+};
+
+static int load_applet(struct linux_binprm *bprm,struct pt_regs *regs)
+{
+ int retval;
+ MOD_INC_USE_COUNT;
+ retval = do_load_applet(bprm,regs);
+ MOD_DEC_USE_COUNT;
+ return retval;
+}
+
+struct linux_binfmt applet_format = {
+#ifndef MODULE
+ NULL, 0, load_applet, NULL, NULL
+#else
+ NULL, &mod_use_count_, load_applet, NULL, NULL
+#endif
+};
+
+int init_java_binfmt(void) {
+ printk(KERN_INFO "JAVA Binary support v1.01 for Linux 1.3.98 (C)1996 Brian A. Lantz\n");
+ register_binfmt(&java_format);
+ return register_binfmt(&applet_format);
+}
+
+#ifdef MODULE
+int init_module(void)
+{
+ return init_java_binfmt();
+}
+
+void cleanup_module( void) {
+ printk(KERN_INFO "Removing JAVA Binary support...\n");
+ unregister_binfmt(&java_format);
+ unregister_binfmt(&applet_format);
+}
+#endif
FUNET's LINUX-ADM group, linux-adm@nic.funet.fi
TCL-scripts by Sam Shen, slshen@lbl.gov
with Sam's (original) version of this