pier        01/06/25 18:35:39

  Added:       service/native arguments.c
  Log:
  Full UNIX service implementation checkin
  
  Revision  Changes    Path
  1.1                  jakarta-tomcat-4.0/service/native/arguments.c
  
  Index: arguments.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 <[EMAIL PROTECTED]>.                        *
   *                                                                           *
   * 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: arguments.c,v 1.1 2001/06/26 01:35:38 pier Exp $ */
  #include "jsvc.h"
  
  /* Return the argument of a command line option */
  static char *optional(int argc, char *argv[], int argi) {
  
      argi++;
      if (argi>=argc) return(NULL);
      if (argv[argi]==NULL) return(NULL);
      if (argv[argi][0]=='-') return(NULL);
      return(strdup(argv[argi]));
  }
  
  /* Parse command line arguments */
  static arg_data *parse(int argc, char *argv[]) {
      arg_data *args=NULL;
      char *temp=NULL;
      char *cmnd=NULL;
      int tlen=0;
      int x=0;
  
      /* Create the default command line arguments */
      args=(arg_data *)malloc(sizeof(arg_data));
      args->pidf="/var/run/jsvc.pid"; // The default PID file
      args->user=NULL;            // No user switching by default
      args->dtch=true;            // Do detach from parent
      args->vers=false;           // Don't display version
      args->help=false;           // Don't display help
      args->chck=false;           // Don't do a check-only startup
      args->name=NULL;            // No VM version name
      args->home=NULL;            // No default JAVA_HOME
      args->onum=0;               // Zero arguments, but let's have some room
      args->opts=(char **)malloc(argc*sizeof(char *));
      args->clas=NULL;            // No class predefined
      args->anum=0;               // Zero class specific arguments but make room
      args->args=(char **)malloc(argc*sizeof(char *));
  
      /* Set up the command name */
      cmnd=strrchr(argv[0],'/');
      if (cmnd==NULL) cmnd=argv[0];
      else cmnd++;
      log_prog=strdup(cmnd);
  
      /* Iterate thru command line arguments */
      for (x=1; x<argc; x++) {
  
          if ((strcmp(argv[x],"-cp")==0)||(strcmp(argv[x],"-classpath")==0)) {
              temp=optional(argc,argv,x++);
              if (temp==NULL) {
                  log_error("Invalid classpath specified");
                  return(NULL);
              }
              tlen=strlen(temp)+20;
              args->opts[args->onum]=(char *)malloc(tlen*sizeof(char));
              sprintf(args->opts[args->onum],"-Djava.class.path=%s",temp);
              args->onum++;
  
          } else if (strcmp(argv[x],"-jvm")==0) {
              args->name=optional(argc,argv,x++);
              if (args->name==NULL) {
                  log_error("Invalid Java VM name specified");
                  return(NULL);
              }
  
          } else if (strcmp(argv[x],"-home")==0) {
              args->home=optional(argc,argv,x++);
              if (args->home==NULL) {
                  log_error("Invalid Java Home specified");
                  return(NULL);
              }
  
          } else if (strcmp(argv[x],"-user")==0) {
              args->user=optional(argc,argv,x++);
              if (args->user==NULL) {
                  log_error("Invalid user name specified");
                  return(NULL);
              }
  
          } else if (strcmp(argv[x],"-version")==0) {
              args->vers=true;
              args->dtch=false;
  
          } else if ((strcmp(argv[x],"-?")==0)||(strcmp(argv[x],"-help")==0)) {
              args->help=true;
              args->dtch=false;
              return(args);
  
          } else if (strcmp(argv[x],"-X")==0) {
              log_error("Option -X currently unsupported");
              log_error("Please use \"java -X\" to see your extra VM options");
  
          } else if (strcmp(argv[x],"-debug")==0) {
              log_debug_flag=true;
  
          } else if (strcmp(argv[x],"-check")==0) {
              args->chck=true;
              args->dtch=false;
  
          } else if (strcmp(argv[x],"-nodetach")==0) {
              args->dtch=false;
  
          } else if (strcmp(argv[x],"-pidfile")==0) {
              args->pidf=optional(argc,argv,x++);
              if (args->pidf==NULL) {
                  log_error("Invalid PID file specified");
                  return(NULL);
              }
  
          } else if (strstr(argv[x],"-verbose")==argv[x]) {
              args->opts[args->onum++]=strdup(argv[x]);
  
          } else if (strcmp(argv[x],"-D")==0) {
              log_error("Parameter -D must be followed by <name>=<value>");
              return(NULL);
  
          } else if (strstr(argv[x],"-D")==argv[x]) {
              temp=strchr(argv[x],'=');
              if (temp==NULL) {
                  log_error("Parameter -D must contain one '=' character");
                  return(NULL);
              }
              if (temp==argv[x]+2) {
                  log_error("A property name must be specified before '='");
                  return(NULL);
              }
              args->opts[args->onum++]=strdup(argv[x]);
  
          } else if (strstr(argv[x],"-X")==argv[x]) {
              args->opts[args->onum++]=strdup(argv[x]);
  
          } else if (strstr(argv[x],"-")==argv[x]) {
              log_error("Invalid option %s",argv[x]);
              return(NULL);
  
          } else {
              args->clas=strdup(argv[x]);
              break;
          }
      }
  
      if (args->clas==NULL) {
          log_error("No class specified");
          return(NULL);
      }
  
      x++;
      while (x<argc) args->args[args->anum++]=strdup(argv[x++]);
  
      return(args);
  }
  
  /* Main entry point: parse command line arguments and dump them */
  arg_data *arguments(int argc, char *argv[]) {
      arg_data *args=parse(argc,argv);
      int x=0;
  
      if (args==NULL) {
          log_error("Cannot parse command line arguments");
          return(NULL);
      }
  
      if (log_debug_flag==true) {
          char *temp;
  
          log_debug("+-- DUMPING PARSED COMMAND LINE ARGUMENTS --------------");
  
          switch (args->dtch) {
              case false: temp="False"; break;
              case true: temp="True"; break;
              default: temp="[Error]"; break;
          }
          log_debug("| Detach:          %s",temp);
  
          switch (args->vers) {
              case false: temp="No"; break;
              case true: temp="Yes"; break;
              default: temp="[Error]"; break;
          }
          log_debug("| Show Version:    %s",temp);
  
          switch (args->help) {
              case false: temp="No"; break;
              case true: temp="Yes"; break;
              default: temp="[Error]"; break;
          }
          log_debug("| Show Help:       %s",temp);
  
          switch (args->chck) {
              case true: temp="Enabled"; break;
              case false: temp="Disabled"; break;
              default: temp="[Error]"; break;
          }
          log_debug("| Check Only:      %s",temp);
  
          log_debug("| JVM Name:        \"%s\"",args->name);
          log_debug("| Java Home:       \"%s\"",args->home);
          log_debug("| PID File:        \"%s\"",args->pidf);
          log_debug("| User Name:       \"%s\"",args->user);
  
          log_debug("| Extra Options:   %d",args->onum);
          for (x=0; x<args->onum; x++) log_debug("|   \"%s\"",args->opts[x]);
  
          log_debug("| Class Invoked:   \"%s\"",args->clas);
  
          log_debug("| Class Arguments: %d",args->anum);
          for (x=0; x<args->anum; x++)log_debug("|   \"%s\"",args->args[x]);
          log_debug("+-------------------------------------------------------");
      }
  
      return(args);
  }
  
  
  

Reply via email to