You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@tomcat.apache.org by pi...@apache.org on 2001/06/26 03:36:50 UTC
cvs commit: jakarta-tomcat-4.0/service/native home.c
pier 01/06/25 18:36:50
Added: service/native home.c
Log:
Full UNIX service implementation checkin
Revision Changes Path
1.1 jakarta-tomcat-4.0/service/native/home.c
Index: home.c
===================================================================
/* ========================================================================= *
* *
* The Apache Software License, Version 1.1 *
* *
* Copyright (c) 1999-2001 The Apache Software Foundation. *
* All rights reserved. *
* *
* ========================================================================= *
* *
* Redistribution and use in source and binary forms, with or without modi- *
* fication, are permitted provided that the following conditions are met: *
* *
* 1. Redistributions of source code must retain the above copyright notice *
* notice, this list of conditions and the following disclaimer. *
* *
* 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 end-user documentation included with the redistribution, if any, *
* must include the following acknowlegement: *
* *
* "This product includes software developed by the Apache Software *
* Foundation <http://www.apache.org/>." *
* *
* Alternately, this acknowlegement may appear in the software itself, if *
* and wherever such third-party acknowlegements normally appear. *
* *
* 4. The names "The Jakarta Project", "WebApp", and "Apache Software *
* Foundation" must not be used to endorse or promote products derived *
* from this software without prior written permission. For written *
* permission, please contact <ap...@apache.org>. *
* *
* 5. Products derived from this software may not be called "Apache" nor may *
* "Apache" appear in their names without prior written permission of the *
* Apache Software Foundation. *
* *
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED 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 APACHE SOFTWARE FOUNDATION OR ITS CONTRIBUTORS 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. *
* *
* ========================================================================= *
* *
* This software consists of voluntary contributions made by many indivi- *
* duals on behalf of the Apache Software Foundation. For more information *
* on the Apache Software Foundation, please see <http://www.apache.org/>. *
* *
* ========================================================================= */
/* @version $Id: home.c,v 1.1 2001/06/26 01:36:49 pier Exp $ */
#include "jsvc.h"
/* Check if a path is a directory */
static bool checkdir(char *path) {
struct stat home;
if (path==NULL) return(false);
if (stat(path,&home)!=0) return(false);
if (S_ISDIR(home.st_mode)) return(true);
return(false);
}
/* Check if a path is a file */
static bool checkfile(char *path) {
struct stat home;
if (path==NULL) return(false);
if (stat(path,&home)!=0) return(false);
if (S_ISREG(home.st_mode)) return(true);
return(false);
}
/* Parse a VM configuration file */
static bool parse(home_data *data) {
FILE *cfgf=fopen(data->cfgf,"r");
char *ret=NULL;
char buf[1024];
if (cfgf==NULL) return(false);
data->jvms=(home_jvm **)malloc(256*sizeof(home_jvm *));
while((ret=fgets(buf,1024,cfgf))!=NULL) {
char *tmp=strchr(ret,'#');
int pos;
/* Clear the string at the first occurrence of '#' */
if (tmp!=NULL) tmp[0]='\0';
/* Trim the string (including leading '-' chars */
while((ret[0]==' ')||(ret[0]=='\t')||(ret[0]=='-')) ret++;
pos=strlen(ret);
while(pos>=0) {
if ((ret[pos]=='\r')||(ret[pos]=='\n')||(ret[pos]=='\t')||
(ret[pos]=='\0')||(ret[pos]==' ')) {
ret[pos--]='\0';
} else break;
}
/* Did we find something significant? */
if (strlen(ret)>0) {
char *libf=NULL;
int x=0;
log_debug("Found VM %s definition in configuration",ret);
while(location_jvm_configured[x]!=NULL) {
char *orig=location_jvm_configured[x];
char temp[1024];
char repl[1024];
int k;
k=replace(temp,1024,orig,"$JAVA_HOME",data->path);
if (k!=0) {
log_error("Can't replace home in VM library (%d)",k);
return(false);
}
k=replace(repl,1024,temp,"$VM_NAME",ret);
if (k!=0) {
log_error("Can't replace name in VM library (%d)",k);
return(false);
}
log_debug("Checking library %s",repl);
if (checkfile(repl)) {
libf=strdup(repl);
break;
}
x++;
}
if (libf==NULL) {
log_error("Cannot locate library for VM %s (skipping)",ret);
} else {
data->jvms[data->jnum]=(home_jvm *)malloc(sizeof(home_jvm));
data->jvms[data->jnum]->name=strdup(ret);
data->jvms[data->jnum]->libr=libf;
data->jnum++;
data->jvms[data->jnum]=NULL;
}
}
}
return(true);
}
/* Build a Java Home structure for a path */
static home_data *build(char *path) {
home_data *data=NULL;
char *cfgf=NULL;
char buf[1024];
int x=0;
int k=0;
if (path==NULL) return(NULL);
log_debug("Attempting to locate Java Home in %s",path);
if (checkdir(path)==false) {
log_debug("Path %s is not a directory",path);
return(NULL);
}
while(location_jvm_cfg[x]!=NULL) {
if ((k=replace(buf,1024,location_jvm_cfg[x],"$JAVA_HOME",path))!=0) {
log_error("Error replacing values for jvm.cfg (%d)",k);
return(NULL);
}
log_debug("Attempting to locate VM configuration file %s",buf);
if(checkfile(buf)==true) {
log_debug("Found VM configuration file at %s",buf);
cfgf=strdup(buf);
break;
}
x++;
}
data=(home_data *)malloc(sizeof(home_data));
data->path=strdup(path);
data->cfgf=cfgf;
data->jvms=NULL;
data->jnum=0;
/* We don't have a jvm.cfg configuration file, so all we have to do is
trying to locate the "default" Java Virtual Machine library */
if (cfgf==NULL) {
log_debug("VM configuration file not found");
x=0;
while(location_jvm_default[x]!=NULL) {
char *libr=location_jvm_default[x];
if ((k=replace(buf,1024,libr,"$JAVA_HOME",path))!=0) {
log_error("Error replacing values for JVM library (%d)",k);
return(NULL);
}
log_debug("Attempting to locate VM library %s",buf);
if (checkfile(buf)==true) {
data->jvms=(home_jvm **)malloc(2*sizeof(home_jvm *));
data->jvms[0]=(home_jvm *)malloc(sizeof(home_jvm));
data->jvms[0]->name=NULL;
data->jvms[0]->libr=strdup(buf);
data->jvms[1]=NULL;
data->jnum=1;
return(data);
}
x++;
}
return(data);
}
/* If we got here, we most definitely found a jvm.cfg file */
if (parse(data)==false) {
log_error("Cannot parse VM configuration file %s",data->cfgf);
}
return(data);
}
/* Find the Java Home */
static home_data *find(char *path) {
home_data *data=NULL;
int x=0;
if (path==NULL) {
log_debug("Home not specified on command line, using environment");
path=getenv("JAVA_HOME");
}
if (path==NULL) {
log_debug("Home not on command line or in environment, searching");
while (location_home[x]!=NULL) {
if ((data=build(location_home[x]))!=NULL) {
log_debug("Java Home located in %s",data->path);
return(data);
}
x++;
}
} else {
if ((data=build(path))!=NULL) {
log_debug("Java Home located in %s",data->path);
return(data);
}
}
return(NULL);
}
/* Main entry point: locate home and dump structure */
home_data *home(char *path) {
home_data *data=find(path);
int x=0;
if (data==NULL) {
log_error("Cannot locate Java Home");
return(NULL);
}
if (log_debug_flag==true) {
log_debug("+-- DUMPING JAVA HOME STRUCTURE ------------------------");
log_debug("| Java Home: \"%s\"",data->path);
log_debug("| Java VM Config.: \"%s\"",data->cfgf);
log_debug("| Found JVMs: %d",data->jnum);
for (x=0; x<data->jnum; x++) {
home_jvm *jvm=data->jvms[x];
log_debug("| JVM Name: \"%s\"",jvm->name);
log_debug("| \"%s\"",jvm->libr);
}
log_debug("+-------------------------------------------------------");
}
return(data);
}