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);
  }