Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 04 Mar 1997 16:41:57 +0100
From:      Eivind Eklund <eivind@dimaga.com>
To:        Adrian Chadd <adrian@obiwan.aceonline.com.au>
Cc:        hackers@freebsd.org, emulation@freebsd.org
Subject:   Re: Re : latest Java support source for FreeBSD..
Message-ID:  <3.0.32.19970304164156.0092a2d0@dimaga.com>

next in thread | raw e-mail | index | archive | help
At 06:19 PM 3/4/97 +0800, Adrian Chadd wrote:
>
>Ok here it is.
>If people like the idea of making it a lkm, then combine it with joerg's
>lkm patch and go from there.
>
>Test it, find bugs, and tell me asap so I can go forth and fix them.. this
>might be a good addition to the 2.2-rel *grin*
>
>Also - I'll finish the appletviewer support tonight.
>
>Adrian.
>
>-- Begin /usr/sys/sys/kern/imgact_jave.c
>/*-
> * Copyright (c) 1997 Adrian Chadd
> * All rights reserved.

It would be very nice if you deleted this line, as presently you're not
even allowing me to read the code you're sending to the mailing list ;-)
(If you deleted the line, I believe you would get the effect of having the
BSD copyright for the entire file)

> *
> * Based heavily on /sys/kern/imgact_shell.c which is:
> * Copyright (c) 1993, David Greenman
> *
> * Redistribution and use in source and binary forms, with or without
> * modification, are permitted provided that the following conditions
> * are met:
> * 1. Redistributions of source code must retain the above copyright
> *    notice, this list of conditions and the following disclaimer
> *    in this position and unchanged.
> * 2. Redistributions in binary form must reproduce the above copyright
> *    notice, this list of conditions and the following disclaimer in the
> *    documentation and/or other materials provided with the distribution.
> * 3. The name of the author may not be used to endorse or promote products
> *   derived from this software withough specific prior written permission
> *
> * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
> * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
> * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
> * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
> * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
> * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
> * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> *
> */
>
>#include <sys/param.h>
>#include <sys/systm.h>
>#include <sys/sysproto.h>
>#include <sys/resourcevar.h> 
>#include <sys/exec.h>  
>#include <sys/imgact.h>
>#include <sys/kernel.h>
>#include <machine/endian.h>
>#include <sys/syslog.h>
>#include <sys/sysctl.h>
>
> 
>
>/* Lets set up reasonable defaults for the system variables
>** kern.java.interpreter and kern.java.appletviewer
>*/
>
>
>static char interpreter[256] = "/usr/local/jdk/bin/i386/java";
>static char appletviewer[256] = "/usr/local/jdk/bin/i386/appletviewer";
>static char classpath[256] =
"/usr/local/jdk/classes:/usr/local/jdk/lib/classes.zip";
>
>SYSCTL_NODE(_kern, OID_AUTO, java, CTLFLAG_RW, 0, "Kernel Java support");
>
>SYSCTL_STRING(_kern_java, OID_AUTO, interpreter, CTLFLAG_RW, interpreter,
sizeof(interpreter), "Path to Java interpreter");
>SYSCTL_STRING(_kern_java, OID_AUTO, appletviewer, CTLFLAG_RW,
appletviewer, sizeof(appletviewer), "Path to Java appletviewer");
>SYSCTL_STRING(_kern_java, OID_AUTO, classpath, CTLFLAG_RW, classpath,
sizeof(classpath), "Path to Java classes");
>
>extern int	exec_java_imgact __P((struct image_params *iparams));
>int		dirname(const char *, char *, int);
>int		basename(const char *, char *, int);
>char *		strstr(const char *, const char *);
>
>
>
>/* Some utility crap */
>
>
>int dirname(const char *string, char *newstring, int maxlen)
>
>{
>	char *p;
>	int ch;
>	char str[256];
>
>	strncpy(str, string, 250);
>	str[250] = '\0';
>
>
>	/*
>	 * (1) If string is //, skip steps (2) through (5).
>	 * (2) If string consists entirely of slash characters, string
>	 *     shall be set to a single slash character.  In this case,
>	 *     skip steps (3) through (8).
>	 */
>	for (p = str;; ++p) {
>		if (!*p) {
>			if (p > str)
>				(void)strcpy(newstring, "/");
>			else
>				(void)strcpy(newstring, ".");
>			return(0);
>		}
>		if (*p != '/')
>			break;
>	}
>
>	/*
>	 * (3) If there are any trailing slash characters in string, they
>	 *     shall be removed.
>	 */
>	for (; *p; ++p);
>	while (*--p == '/')
>		continue;
>	*++p = '\0';
>
>	/*
>	 * (4) If there are no slash characters remaining in string,
>	 *     string shall be set to a single period character.  In this
>	 *     case skip steps (5) through (8).
>	 *
>	 * (5) If there are any trailing nonslash characters in string,
>	 *     they shall be removed.
>	 */
>	while (--p >= str)
>		if (*p == '/')
>			break;
>	++p;
>	if (p == str) {
>		(void)strcpy(newstring, ".");
>		return(0);
>	}
>
>	/*
>	 * (6) If the remaining string is //, it is implementation defined
>	 *     whether steps (7) and (8) are skipped or processed.
>	 *
>	 * This case has already been handled, as part of steps (1) and (2).
>	 */
>
>	/*
>	 * (7) If there are any trailing slash characters in string, they
>	 *     shall be removed.
>	 */
>	while (--p >= str)
>		if (*p != '/')
>			break;
>	++p;
>
>	/*
>	 * (8) If the remaining string is empty, string shall be set to
>	 *     a single slash character.
>	 */
>	*p = '\0';
>  
>	if (p == str) {
>		strcpy(newstring, "/");
>	} else {
>		strncpy(newstring, str, maxlen);
>		newstring[maxlen] = '\0';
>	}
>	return(0);
>}
>
>
>
>
>int basename(const char *string, char *newstring, int maxlen)
>{
>
>	int ch;
>	char *p;
>	char str[256];
> 
>	strncpy(str, string, 250);
>	str[250] = '\0';
>
>
>
>	/*
>	 * (1) If string is // it is implementation defined whether steps (2)
>	 *     through (5) are skipped or processed.
>	 *
>	 * (2) If string consists entirely of slash characters, string shall
>	 *     be set to a single slash character.  In this case, skip steps
>	 *     (3) through (5).
>	 */
>	for (p = str;; ++p) {
>		if (!*p) {
>			if (p > str)
>				(void)strcpy(newstring, "/");
>			else
>				(void)strcpy(newstring, "");
>			return(0);
>		}
>		if (*p != '/')
>			break;
>	}
>
>	/*
>	 * (3) If there are any trailing slash characters in string, they
>	 *     shall be removed.
>	 */
>	for (; *p; ++p)
>		continue;
>	while (*--p == '/')
>		continue;
>	*++p = '\0';
>
>	/*
>	 * (4) If there are any slash characters remaining in string, the
>	 *     prefix of string up to an including the last slash character
>	 *     in string shall be removed.
>	 */
>	while (--p >= str)
>		if (*p == '/')
>			break;
>	++p;
>
>	/*
>	 * (5) If the suffix operand is present, is not identical to the
>	 *     characters remaining in string, and is identical to a suffix
>	 *     of the characters remaining in string, the suffix suffix
>	 *     shall be removed from string.
>	 */
>	if (++*str) {
>		int suffixlen, stringlen, off;
>
>		suffixlen = strlen(str);
>		stringlen = strlen(p);
>
>		if (suffixlen < stringlen) {
>			off = stringlen - suffixlen;
>			if (!strcmp(p + off, str))
>				p[off] = '\0';
>		}
>	}
>	(void)strncpy(newstring, p, maxlen);
>	return(0);
>}
>
>
>/*
> * Find the first occurrence of find in s.
> */
>char *
>strstr(s, find)
>	register const char *s, *find;
>{
>	register char c, sc;
>	register size_t len;
>
>	if ((c = *find++) != 0) {
>		len = strlen(find);
>		do {
>			do {
>				if ((sc = *s++) == 0)
>					return (NULL);
>			} while (sc != c);
>		} while (strncmp(s, find, len) != 0);
>		s--;
>	}
>	return ((char *)s);
>}
>
>
>/* The real thing */
>int
>exec_java_imgact(imgp)
>    struct image_params *imgp;
>{ 
>
>        const char *image_header = imgp->image_header; 
>        const char *ihp, *line_endp;
>        char *interp;
>	static char javabin_name[256];
>	static char javabin_path[256];
>	static char cpathstr[256];
>	static char javatmp[256];
>
>
>	/* A java binary? */
>
>	if ((image_header[0] != '\xca') || (image_header[1] != '\xfe') ||
>	  (image_header[2] != '\xba') || (image_header[3] != '\xbe')) {
>#ifdef DEBUG
>		printf("Failed to run a java binary : invalid signature?\n");
>		return(-1);
>#endif
>	}
>
>	/* Ok, its a java binary, so lets tell the world */
>
>	/* Firstly split the path to the binary up into path and filename */
>
>	basename(imgp->uap->fname, javabin_name, sizeof(javabin_name));
>	dirname(imgp->uap->fname, javabin_path, sizeof(javabin_path));
>
>	/* Now we are going to take the filename, and if it doesn't contain
>	** a .class then return with a "non-executable" error */
>	if (strstr(javabin_name, ".class") == NULL) {
>		return -1;
>	}
>
>	/* Ok so we'll assume (stupidly) that the .class is at the end of the
>	** filename, so lets copy the filename over minus the last 6 chars */
>
>	strncpy(javatmp, javabin_name, strlen(javabin_name) - 6);
>	strcpy(javabin_name, javatmp);
>
>
>	/* Since its interpreted we'll tag it as such. */
>	imgp->interpreted = 1;
>	
>	/* And we'll set the interpreter name here too (would help) */
>	strncpy(imgp->interpreter_name, interpreter,
sizeof(imgp->interpreter_name));
>
>	/* now lets make up our -classpath arguement */
>	sprintf(cpathstr, "%s -classpath %s:%s", interpreter, classpath,
javabin_path);
>
>	/* Now lets write this into the strings space, just like in the
>	** _shell.c file... */
>
>	ihp = cpathstr;
>	line_endp = cpathstr + strlen(cpathstr);
>
>	while (ihp < line_endp) {
>		while ((*ihp == ' ') || (*ihp == '\t')) ihp++;
>		
>		if (ihp < line_endp) {
>			while ((ihp < line_endp) && (*ihp != ' ') && (*ihp != '\t')) {
>				*imgp->stringp++ = *ihp++;
>				imgp->stringspace--;
>			}
>			*imgp->stringp++ = 0;
>			imgp->stringspace--;
>	
>			imgp->argc++;
>		}
>
>	}
>	
>	strcpy(imgp->uap->fname, javabin_name);
>	suword(imgp->uap->argv, (int)imgp->uap->fname);
>
>	return (0);
>
>}
>
>/*      
> * Tell kern_execve.c about it, with a little help from the linker.
> * Since `const' objects end up in the text segment, TEXT_SET is the
> * correct directive to use. 
> */      
>const struct execsw java_execsw = { exec_java_imgact, "\xca\xfe\xba\xbe" };
>TEXT_SET(execsw_set, java_execsw);
>
>
>
>
>

Eivind Eklund perhaps@yes.no http://maybe.yes.no/perhaps/ eivind@freebsd.org



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?3.0.32.19970304164156.0092a2d0>