apr-commits mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From gst...@apache.org
Subject cvs commit: apr/threadproc/win32 proc.c
Date Mon, 28 Jan 2002 21:58:16 GMT
gstein      02/01/28 13:58:16

  Modified:    include  apr_thread_proc.h
               threadproc/beos proc.c
               threadproc/netware proc.c
               threadproc/os2 proc.c
               threadproc/unix proc.c
               threadproc/win32 proc.c
  Log:
  Add a couple new command types to process creation:
  
      APR_PROGRAM_ENV: start the program using the caller's environment
      APR_PROGRAM_PATH: search PATH for the program, use caller's env
  
  (the normal APR_PROGRAM isolates the env and does not use PATH)
  
  The BeOS, OS/2, and Win32 implementations are incomplete. These two
  new forms just default back to APR_PROGRAM for now. (although BeOS
  doesn't even distinguish between APR_SHELLCMD and APR_PROGRAM!)
  
  On Unix and Netware, these map into execv() and execvp() calls.
  
  Also clarified some doc for the enums in apr_thread_proc.h a bit.
  
  Revision  Changes    Path
  1.79      +25 -8     apr/include/apr_thread_proc.h
  
  Index: apr_thread_proc.h
  ===================================================================
  RCS file: /home/cvs/apr/include/apr_thread_proc.h,v
  retrieving revision 1.78
  retrieving revision 1.79
  diff -u -r1.78 -r1.79
  --- apr_thread_proc.h	27 Dec 2001 17:02:59 -0000	1.78
  +++ apr_thread_proc.h	28 Jan 2002 21:58:15 -0000	1.79
  @@ -71,7 +71,7 @@
   #endif /* __cplusplus */
   /**
    * @file apr_thread_proc.h
  - * @brief APR Thread Library
  + * @brief APR Thread and Process Library
    */
   /**
    * @defgroup APR_Thread Thread Library
  @@ -79,15 +79,28 @@
    * @{
    */
   
  -typedef enum {APR_SHELLCMD, APR_PROGRAM} apr_cmdtype_e;
  -typedef enum {APR_WAIT, APR_NOWAIT} apr_wait_how_e;
  +typedef enum {
  +    APR_SHELLCMD,       /**< use the shell to invoke the program */
  +    APR_PROGRAM,        /**< invoke the program directly, no copied env */
  +    APR_PROGRAM_ENV,    /**< invoke the program, replicating our environment */
  +    APR_PROGRAM_PATH    /**< find program on PATH, use our environment */
  +} apr_cmdtype_e;
  +
  +typedef enum {
  +    APR_WAIT,           /**< wait for the specified process to finish */
  +    APR_NOWAIT          /**< do not wait -- just see if it has finished */
  +} apr_wait_how_e;
  +
   /* I am specifically calling out the values so that the macros below make
    * more sense.  Yes, I know I don't need to, but I am hoping this makes what
    * I am doing more clear.  If you want to add more reasons to exit, continue
    * to use bitmasks.
    */
  -typedef enum {APR_PROC_EXIT = 1, APR_PROC_SIGNAL = 2, 
  -              APR_PROC_SIGNAL_CORE = 4} apr_exit_why_e;
  +typedef enum {
  +    APR_PROC_EXIT = 1,          /**< process exited normally */
  +    APR_PROC_SIGNAL = 2,        /**< process exited due to a signal */
  +    APR_PROC_SIGNAL_CORE = 4    /**< process exited and dumped a core file */
  +} apr_exit_why_e;
   
   #define APR_PROC_CHECK_EXIT(x)        (x & APR_PROC_EXIT)
   #define APR_PROC_CHECK_SIGNALED(x)    (x & APR_PROC_SIGNAL)
  @@ -428,8 +441,10 @@
    * @param attr The procattr we care about. 
    * @param cmd The type of command.  One of:
    * <PRE>
  - *            APR_SHELLCMD --  Shell script
  - *            APR_PROGRAM  --  Executable program   (default) 
  + *            APR_SHELLCMD     --  Shell script
  + *            APR_PROGRAM      --  Executable program   (default) 
  + *            APR_PROGRAM_ENV  --  Executable program, copy environment
  + *            APR_PROGRAM_PATH --  Executable program on PATH, copy env
    * </PRE>
    */
   APR_DECLARE(apr_status_t) apr_procattr_cmdtype_set(apr_procattr_t *attr,
  @@ -477,7 +492,9 @@
    * @param const_args the arguments to pass to the new program.  The first 
    *                   one should be the program name.
    * @param env The new environment table for the new process.  This 
  - *            should be a list of NULL-terminated strings.
  + *            should be a list of NULL-terminated strings. This argument
  + *            is ignored for APR_PROGRAM_ENV and APR_PROGRAM_PATH types
  + *            of commands.
    * @param attr the procattr we should use to determine how to create the new
    *         process
    * @param cont The pool to use. 
  
  
  
  1.44      +2 -0      apr/threadproc/beos/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/beos/proc.c,v
  retrieving revision 1.43
  retrieving revision 1.44
  diff -u -r1.43 -r1.44
  --- proc.c	14 Dec 2001 01:12:25 -0000	1.43
  +++ proc.c	28 Jan 2002 21:58:15 -0000	1.44
  @@ -249,6 +249,8 @@
       }
       newargs[nargs] = NULL;
   
  +    /* ### we should be looking at attr->cmdtype in here... */
  +
       newproc = load_image(nargs, (const char**)newargs, (const char**)env);
   
       /* load_image copies the data so now we can free it... */
  
  
  
  1.5       +14 -1     apr/threadproc/netware/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/netware/proc.c,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- proc.c	8 Jan 2002 21:00:37 -0000	1.4
  +++ proc.c	28 Jan 2002 21:58:15 -0000	1.5
  @@ -349,11 +349,24 @@
               }
               execve(SHELL_PATH, (char * const *) newargs, (char * const *)env);
           }
  -        else {
  +        else if (attr->cmdtype == APR_PROGRAM) {
               if (attr->detached) {
                   apr_proc_detach();
               }
               execve(progname, (char * const *)args, (char * const *)env);
  +        }
  +        else if (attr->cmdtype == APR_PROGRAM_ENV) {
  +            if (attr->detached) {
  +                apr_proc_detach();
  +            }
  +            execv(progname, (char * const *)args);
  +        }
  +        else {
  +            /* APR_PROGRAM_PATH */
  +            if (attr->detached) {
  +                apr_proc_detach();
  +            }
  +            execvp(progname, (char * const *)args);
           }
           exit(-1);  /* if we get here, there is a problem, so exit with an */ 
                      /* error code. */
  
  
  
  1.48      +2 -0      apr/threadproc/os2/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/os2/proc.c,v
  retrieving revision 1.47
  retrieving revision 1.48
  diff -u -r1.47 -r1.48
  --- proc.c	26 Oct 2001 02:31:04 -0000	1.47
  +++ proc.c	28 Jan 2002 21:58:15 -0000	1.48
  @@ -345,6 +345,8 @@
       if (extension == NULL || strchr(extension, '/') || strchr(extension, '\\'))
           extension = "";
   
  +    /* ### how to handle APR_PROGRAM_ENV and APR_PROGRAM_PATH? */
  +
       if (attr->cmdtype == APR_SHELLCMD || strcasecmp(extension, ".cmd") == 0) {
           strcpy(interpreter, "#!" SHELL_PATH);
           extra_arg = "/C";
  
  
  
  1.55      +14 -1     apr/threadproc/unix/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/unix/proc.c,v
  retrieving revision 1.54
  retrieving revision 1.55
  diff -u -r1.54 -r1.55
  --- proc.c	25 Jan 2002 02:21:43 -0000	1.54
  +++ proc.c	28 Jan 2002 21:58:15 -0000	1.55
  @@ -366,11 +366,24 @@
               }
               execve(SHELL_PATH, (char * const *) newargs, (char * const *)env);
           }
  -        else {
  +        else if (attr->cmdtype == APR_PROGRAM) {
               if (attr->detached) {
                   apr_proc_detach();
               }
               execve(progname, (char * const *)args, (char * const *)env);
  +        }
  +        else if (attr->cmdtype == APR_PROGRAM_ENV) {
  +            if (attr->detached) {
  +                apr_proc_detach();
  +            }
  +            execv(progname, (char * const *)args);
  +        }
  +        else {
  +            /* APR_PROGRAM_PATH */
  +            if (attr->detached) {
  +                apr_proc_detach();
  +            }
  +            execvp(progname, (char * const *)args);
           }
           exit(-1);  /* if we get here, there is a problem, so exit with an */ 
                      /* error code. */
  
  
  
  1.62      +2 -0      apr/threadproc/win32/proc.c
  
  Index: proc.c
  ===================================================================
  RCS file: /home/cvs/apr/threadproc/win32/proc.c,v
  retrieving revision 1.61
  retrieving revision 1.62
  diff -u -r1.61 -r1.62
  --- proc.c	28 Jan 2002 15:56:08 -0000	1.61
  +++ proc.c	28 Jan 2002 21:58:16 -0000	1.62
  @@ -343,6 +343,8 @@
           i++;
       }
   
  +    /* ### how to handle APR_PROGRAM_ENV and APR_PROGRAM_PATH? */
  +
       if (attr->cmdtype == APR_SHELLCMD) {
           char *shellcmd = getenv("COMSPEC");
           if (!shellcmd)
  
  
  

Mime
View raw message