You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by rb...@hyperreal.org on 1999/12/31 02:27:48 UTC

cvs commit: apache-2.0/src/main util_script.c

rbb         99/12/30 17:27:46

  Modified:    src/include util_script.h
               src/main util_script.c
  Log:
  Get rid of ap_call_exec.  It has been #if 0'ed out for a long time, and we
  never call it, so I'm taking it out all together now.
  
  Revision  Changes    Path
  1.5       +0 -2      apache-2.0/src/include/util_script.h
  
  Index: util_script.h
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/include/util_script.h,v
  retrieving revision 1.4
  retrieving revision 1.5
  diff -u -r1.4 -r1.5
  --- util_script.h	1999/10/31 09:26:03	1.4
  +++ util_script.h	1999/12/31 01:27:35	1.5
  @@ -81,8 +81,6 @@
   				       int (*getsfunc) (char *, int, void *),
   				       void *getsfunc_data);
   API_EXPORT(void) ap_send_size(ap_ssize_t size, request_rec *r);
  -API_EXPORT(int) ap_call_exec(request_rec *r, ap_child_info_t *pinfo, char *argv0, char **env,
  -                          int shellcmd);
   
   #ifdef __cplusplus
   }
  
  
  
  1.21      +0 -411    apache-2.0/src/main/util_script.c
  
  Index: util_script.c
  ===================================================================
  RCS file: /home/cvs/apache-2.0/src/main/util_script.c,v
  retrieving revision 1.20
  retrieving revision 1.21
  diff -u -r1.20 -r1.21
  --- util_script.c	1999/12/20 16:38:35	1.20
  +++ util_script.c	1999/12/31 01:27:43	1.21
  @@ -682,414 +682,3 @@
   }
   #endif
   
  -#if 0
  -API_EXPORT(int) ap_call_exec(request_rec *r, ap_child_info_t *pinfo, char *argv0,
  -			     char **env, int shellcmd)
  -{
  -    int pid = 0;
  -    int errfileno = STDERR_FILENO;
  -
  -#if !defined(WIN32) && !defined(OS2)
  -    /* the fd on r->server->error_log is closed, but we need somewhere to
  -     * put the error messages from the log_* functions. So, we use stderr,
  -     * since that is better than allowing errors to go unnoticed.  Don't do
  -     * this on Win32, though, since we haven't fork()'d.
  -     */
  -    ap_put_os_file(&r->server->error_log, &errfileno, r->pool);
  -#endif
  -
  -    /* TODO: all that RLimit stuff should become part of the spawning API,
  -     * and not something in the core_dir_config... define a special rlimit
  -     * structure and pass it in here.
  -     */
  -
  -#ifdef OS2
  -    {
  -	/* Additions by Alec Kloss, to allow exec'ing of scripts under OS/2 */
  -	int is_script = 0;
  -	char interpreter[2048];	/* hope it's enough for the interpreter path */
  -	char error_object[260];
  -	FILE *program;
  -        char *cmdline = r->filename, *cmdline_pos;
  -        int cmdlen;
  -	char *args = "", *args_end;
  -	ULONG rc;
  -        RESULTCODES rescodes;
  -        int env_len, e;
  -        char *env_block, *env_block_pos;
  -
  -	if (r->args && r->args[0] && !strchr(r->args, '='))
  -	    args = r->args;
  -	    
  -	program = fopen(r->filename, "rt");
  -	
  -	if (!program) {
  -	    ap_log_rerror(APLOG_MARK, APLOG_ERR, r, "fopen(%s) failed",
  -			 r->filename);
  -	    return (pid);
  -	}
  -	
  -	fgets(interpreter, sizeof(interpreter), program);
  -	fclose(program);
  -	
  -	if (!strncmp(interpreter, "#!", 2)) {
  -	    is_script = 1;
  -            interpreter[strlen(interpreter) - 1] = '\0';
  -            if (interpreter[2] != '/' && interpreter[2] != '\\' && interpreter[3] != ':') {
  -                char buffer[300];
  -                if (DosSearchPath(SEARCH_ENVIRONMENT, "PATH", interpreter+2, buffer, sizeof(buffer)) == 0) {
  -                    strcpy(interpreter+2, buffer);
  -                } else {
  -                    strcat(interpreter, ".exe");
  -                    if (DosSearchPath(SEARCH_ENVIRONMENT, "PATH", interpreter+2, buffer, sizeof(buffer)) == 0) {
  -                        strcpy(interpreter+2, buffer);
  -                    }
  -                }
  -            }
  -	}
  -
  -        if (is_script) {
  -            cmdline = ap_pstrcat(r->pool, interpreter+2, " ", r->filename, NULL);
  -        }
  -        else if (strstr(strupr(r->filename), ".CMD") > 0) {
  -            /* Special case to allow use of REXX commands as scripts. */
  -            os2pathname(r->filename);
  -            cmdline = ap_pstrcat(r->pool, SHELL_PATH, " /C ", r->filename, NULL);
  -        }
  -        else {
  -            cmdline = r->filename;
  -	}
  -	
  -        args = ap_pstrdup(r->pool, args);
  -        ap_unescape_url(args);
  -        args = ap_double_quotes(r->pool, args);
  -        args_end = args + strlen(args);
  -
  -        if (args_end - args > 4000) { /* cmd.exe won't handle lines longer than 4k */
  -            args_end = args + 4000;
  -            *args_end = 0;
  -        }
  -
  -        /* +4 = 1 space between progname and args, 2 for double null at end, 2 for possible quote on first arg */
  -        cmdlen = strlen(cmdline) + strlen(args) + 4; 
  -        cmdline_pos = cmdline;
  -
  -        while (*cmdline_pos) {
  -            cmdlen += 2 * (*cmdline_pos == '+');  /* Allow space for each arg to be quoted */
  -            cmdline_pos++;
  -        }
  -
  -        cmdline = ap_pstrndup(r->pool, cmdline, cmdlen);
  -        cmdline_pos = cmdline + strlen(cmdline);
  -
  -	while (args < args_end) {
  -            char *arg;
  -	    
  -            arg = ap_getword_nc(r->pool, &args, '+');
  -
  -            if (strpbrk(arg, "&|<> "))
  -                arg = ap_pstrcat(r->pool, "\"", arg, "\"", NULL);
  -
  -            *(cmdline_pos++) = ' ';
  -            strcpy(cmdline_pos, arg);
  -            cmdline_pos += strlen(cmdline_pos);
  -        }
  -
  -        *(++cmdline_pos) = 0; /* Add required second terminator */
  -	args = strchr(cmdline, ' ');
  -	
  -	if (args) {
  -	    *args = 0;
  -	    args++;
  -	}
  -
  -        /* Create environment block from list of envariables */
  -        for (env_len=1, e=0; env[e]; e++)
  -            env_len += strlen(env[e]) + 1;
  -
  -        env_block = ap_palloc(r->pool, env_len);
  -        env_block_pos = env_block;
  -
  -        for (e=0; env[e]; e++) {
  -            strcpy(env_block_pos, env[e]);
  -            env_block_pos += strlen(env_block_pos) + 1;
  -        }
  -
  -        *env_block_pos = 0; /* environment block is terminated by a double null */
  -
  -	rc = DosExecPgm(error_object, sizeof(error_object), EXEC_ASYNC, cmdline, env_block, &rescodes, cmdline);
  -	
  -	if (rc) {
  -            ap_log_rerror(APLOG_MARK, APLOG_ERR, r, "DosExecPgm(%s %s) failed, %s - %s",
  -                          cmdline, args ? args : "", ap_os_error_message(rc), error_object );
  -	    return -1;
  -	}
  -	
  -	return rescodes.codeTerminate;
  -    }
  -#elif defined(WIN32)
  -    {
  -        /* Adapted from Alec Kloss' work for OS/2 */
  -        char *interpreter = NULL;
  -        char *arguments = NULL;
  -        char *ext = NULL;
  -        char *exename = NULL;
  -        char *s = NULL;
  -        char *quoted_filename;
  -        char *pCommand;
  -        char *pEnvBlock, *pNext;
  -
  -        int i;
  -        int iEnvBlockLen;
  -
  -        file_type_e fileType;
  -
  -        STARTUPINFO si;
  -        PROCESS_INFORMATION pi;
  -
  -        memset(&si, 0, sizeof(si));
  -        memset(&pi, 0, sizeof(pi));
  -
  -        pid = -1;
  -
  -        if (!shellcmd) {
  -
  -            fileType = ap_get_win32_interpreter(r, &interpreter);
  -
  -            if (fileType == eFileTypeUNKNOWN) {
  -                ap_log_rerror(APLOG_MARK, APLOG_ERR|APLOG_NOERRNO, r,
  -                              "%s is not executable; ensure interpreted scripts have "
  -                              "\"#!\" first line", 
  -                              r->filename);
  -                return (pid);
  -            }
  -
  -            /*
  -             * Look at the arguments...
  -             */
  -            arguments = "";
  -            if ((r->args) && (r->args[0]) && !strchr(r->args, '=')) { 
  -                /* If we are in this leg, there are some other arguments
  -                 * that we must include in the execution of the CGI.
  -                 * Because CreateProcess is the way it is, we have to
  -                 * create a command line like format for the execution
  -                 * of the CGI.  This means we need to create on long
  -                 * string with the executable and arguments.
  -                 *
  -                 * The arguments string comes in the request structure,
  -                 * and each argument is separated by a '+'.  We'll replace
  -                 * these pluses with spaces.
  -                 */
  -
  -                int iStringSize = 0;
  -                int x;
  -	    
  -                /*
  -                 *  Duplicate the request structure string so we don't change it.
  -                 */                                   
  -                arguments = ap_pstrdup(r->pool, r->args);
  -                
  -                /*
  -                 *  Change the '+' to ' '
  -                 */
  -                for (x=0; arguments[x]; x++) {
  -                    if ('+' == arguments[x]) {
  -                        arguments[x] = ' ';
  -                    }
  -                }
  -       
  -                /*
  -                 * We need to unescape any characters that are 
  -                 * in the arguments list.
  -                 */
  -                ap_unescape_url(arguments);
  -                arguments = ap_escape_shell_cmd(r->pool, arguments);
  -            }
  -
  -            /*
  -             * We have the interpreter (if there is one) and we have 
  -             * the arguments (if there are any).
  -             * Build the command string to pass to CreateProcess. 
  -             */
  -            quoted_filename = ap_pstrcat(r->pool, "\"", r->filename, "\"", NULL);
  -            if (interpreter && *interpreter) {
  -                pCommand = ap_pstrcat(r->pool, interpreter, " ", 
  -                                      quoted_filename, " ", arguments, NULL);
  -            }
  -            else {
  -                pCommand = ap_pstrcat(r->pool, quoted_filename, " ", arguments, NULL);
  -            }
  -
  -         } else {
  -
  -            char *shell_cmd = "CMD.EXE /C ";
  -            OSVERSIONINFO osver;
  -            osver.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
  -         
  -            /*
  -             * Use CMD.EXE for NT, COMMAND.COM for WIN95
  -             */
  -            if (GetVersionEx(&osver)) {
  -                if (osver.dwPlatformId != VER_PLATFORM_WIN32_NT) {
  -                    shell_cmd = "COMMAND.COM /C ";
  -                }
  -            }       
  -            pCommand = ap_pstrcat(r->pool, shell_cmd, argv0, NULL);
  -        }
  -
  -        /*
  -         * Make child process use hPipeOutputWrite as standard out,
  -         * and make sure it does not show on screen.
  -         */
  -        si.cb = sizeof(si);
  -        si.dwFlags     = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
  -        si.wShowWindow = SW_HIDE;
  -        si.hStdInput   = pinfo->hPipeInputRead;
  -        si.hStdOutput  = pinfo->hPipeOutputWrite;
  -        si.hStdError   = pinfo->hPipeErrorWrite;
  -  
  -        /*
  -         * Win32's CreateProcess call requires that the environment
  -         * be passed in an environment block, a null terminated block of
  -         * null terminated strings.
  -         */  
  -        i = 0;
  -        iEnvBlockLen = 1;
  -        while (env[i]) {
  -            iEnvBlockLen += strlen(env[i]) + 1;
  -            i++;
  -        }
  -  
  -        pEnvBlock = (char *)ap_pcalloc(r->pool,iEnvBlockLen);
  -    
  -        i = 0;
  -        pNext = pEnvBlock;
  -        while (env[i]) {
  -            strcpy(pNext, env[i]);
  -            pNext = pNext + strlen(pNext) + 1;
  -            i++;
  -        }
  -
  -        if (CreateProcess(NULL, pCommand, NULL, NULL, TRUE, DETACHED_PROCESS, pEnvBlock,
  -                          ap_make_dirstr_parent(r->pool, r->filename),
  -                          &si, &pi)) {
  -            if (fileType == eFileTypeEXE16) {
  -                /* Hack to get 16-bit CGI's working. It works for all the 
  -                 * standard modules shipped with Apache. pi.dwProcessId is 0 
  -                 * for 16-bit CGIs and all the Unix specific code that calls 
  -                 * ap_call_exec interprets this as a failure case. And we can't 
  -                 * use -1 either because it is mapped to 0 by the caller.
  -                 */
  -                pid = -2;
  -            }
  -            else {
  -                pid = pi.dwProcessId;
  -                /*
  -                 * We must close the handles to the new process and its main thread
  -                 * to prevent handle and memory leaks.
  -                 */ 
  -                CloseHandle(pi.hProcess);
  -                CloseHandle(pi.hThread);
  -            }
  -        }
  -        return (pid);
  -    }
  -
  -#else
  -    /* TODO: reimplement suexec */
  -#if 0
  -    if (ap_suexec_enabled
  -	&& ((r->server->server_uid != ap_user_id)
  -	    || (r->server->server_gid != ap_group_id)
  -	    || (!strncmp("/~", r->uri, 2)))) {
  -
  -	char *execuser, *grpname;
  -	struct passwd *pw;
  -	struct group *gr;
  -
  -	if (!strncmp("/~", r->uri, 2)) {
  -	    gid_t user_gid;
  -	    char *username = ap_pstrdup(r->pool, r->uri + 2);
  -	    char *pos = strchr(username, '/');
  -
  -	    if (pos) {
  -		*pos = '\0';
  -	    }
  -
  -	    if ((pw = getpwnam(username)) == NULL) {
  -		ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
  -			     "getpwnam: invalid username %s", username);
  -		return (pid);
  -	    }
  -	    execuser = ap_pstrcat(r->pool, "~", pw->pw_name, NULL);
  -	    user_gid = pw->pw_gid;
  -
  -	    if ((gr = getgrgid(user_gid)) == NULL) {
  -	        if ((grpname = ap_palloc(r->pool, 16)) == NULL) {
  -		    return (pid);
  -		}
  -		else {
  -		    ap_snprintf(grpname, 16, "%ld", (long) user_gid);
  -		}
  -	    }
  -	    else {
  -		grpname = gr->gr_name;
  -	    }
  -	}
  -	else {
  -	    if ((pw = getpwuid(r->server->server_uid)) == NULL) {
  -		ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
  -			     "getpwuid: invalid userid %ld",
  -			     (long) r->server->server_uid);
  -		return (pid);
  -	    }
  -	    execuser = ap_pstrdup(r->pool, pw->pw_name);
  -
  -	    if ((gr = getgrgid(r->server->server_gid)) == NULL) {
  -		ap_log_rerror(APLOG_MARK, APLOG_ERR, r,
  -			     "getgrgid: invalid groupid %ld",
  -			     (long) r->server->server_gid);
  -		return (pid);
  -	    }
  -	    grpname = gr->gr_name;
  -	}
  -
  -	if (shellcmd) {
  -	    execle(SUEXEC_BIN, SUEXEC_BIN, execuser, grpname, argv0,
  -		   NULL, env);
  -	}
  -
  -	else if ((!r->args) || (!r->args[0]) || strchr(r->args, '=')) {
  -	    execle(SUEXEC_BIN, SUEXEC_BIN, execuser, grpname, argv0,
  -		   NULL, env);
  -	}
  -
  -	else {
  -	    execve(SUEXEC_BIN,
  -		   create_argv(r->pool, SUEXEC_BIN, execuser, grpname,
  -			       argv0, r->args),
  -		   env);
  -	}
  -    }
  -    else {
  -#endif
  -        if (shellcmd) {
  -	    execle(SHELL_PATH, SHELL_PATH, "-c", argv0, NULL, env);
  -	}
  -
  -	else if ((!r->args) || (!r->args[0]) || strchr(r->args, '=')) {
  -	    execle(r->filename, argv0, NULL, env);
  -	}
  -
  -	else {
  -	    execve(r->filename,
  -		   create_argv(r->pool, NULL, NULL, NULL, argv0, r->args),
  -		   env);
  -	}
  -#if 0
  -    }
  -#endif
  -    return (pid);
  -#endif
  -}
  -#endif