diff options
Diffstat (limited to 'lib/roken/simple_exec.c')
| -rw-r--r-- | lib/roken/simple_exec.c | 124 | 
1 files changed, 52 insertions, 72 deletions
| diff --git a/lib/roken/simple_exec.c b/lib/roken/simple_exec.c index 447b5bfd0270..97679d7e4175 100644 --- a/lib/roken/simple_exec.c +++ b/lib/roken/simple_exec.c @@ -1,40 +1,37 @@  /* - * Copyright (c) 1998 - 2001, 2004 Kungliga Tekniska Högskolan - * (Royal Institute of Technology, Stockholm, Sweden).  - * All rights reserved.  + * Copyright (c) 1998 - 2001, 2004 Kungliga Tekniska Högskolan + * (Royal Institute of Technology, Stockholm, Sweden). + * All rights reserved.   * - * Redistribution and use in source and binary forms, with or without  - * modification, are permitted provided that the following conditions  - * are met:  + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met:   * - * 1. Redistributions of source code must retain the above copyright  - *    notice, this list of conditions and the following disclaimer.  + * 1. Redistributions of source code must retain the above copyright + *    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.  + * 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. Neither the name of the Institute nor the names of its contributors  - *    may be used to endorse or promote products derived from this software  - *    without specific prior written permission.  + * 3. Neither the name of the Institute nor the names of its contributors + *    may be used to endorse or promote products derived from this software + *    without specific prior written permission.   * - * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND  - * ANY EXPRESS 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 INSTITUTE OR 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 IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS 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 INSTITUTE OR 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.   */ -#ifdef HAVE_CONFIG_H  #include <config.h> -RCSID("$Id: simple_exec.c 21005 2007-06-08 01:54:35Z lha $"); -#endif  #include <stdarg.h>  #include <stdlib.h> @@ -55,13 +52,13 @@ RCSID("$Id: simple_exec.c 21005 2007-06-08 01:54:35Z lha $");  #define EX_NOTFOUND	127  /* return values: -   -1   on `unspecified' system errors -   -2   on fork failures -   -3   on waitpid errors -   -4   exec timeout +   SE_E_UNSPECIFIED   on `unspecified' system errors +   SE_E_FORKFAILED    on fork failures +   SE_E_WAITPIDFAILED on waitpid errors +   SE_E_EXECTIMEOUT   exec timeout     0-   is return value from subprocess -   126  if the program couldn't be executed -   127  if the program couldn't be found +   SE_E_NOEXEC        if the program couldn't be executed +   SE_E_NOTFOUND      if the program couldn't be found     128- is 128 + signal that killed subprocess     possible values `func' can return: @@ -81,8 +78,8 @@ sigtimeout(int sig)      SIGRETURN(0);  } -int ROKEN_LIB_FUNCTION -wait_for_process_timed(pid_t pid, time_t (*func)(void *),  +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +wait_for_process_timed(pid_t pid, time_t (*func)(void *),  		       void *ptr, time_t timeout)  {      RETSIGTYPE (*old_func)(int sig) = NULL; @@ -101,7 +98,7 @@ wait_for_process_timed(pid_t pid, time_t (*func)(void *),  	while(waitpid(pid, &status, 0) < 0) {  	    if (errno != EINTR) { -		ret = -3; +		ret = SE_E_WAITPIDFAILED;  		goto out;  	    }  	    if (func == NULL) @@ -113,7 +110,7 @@ wait_for_process_timed(pid_t pid, time_t (*func)(void *),  		kill(pid, SIGTERM);  		continue;  	    } else if (timeout == (time_t)-2) { -		ret = -4; +		ret = SE_E_EXECTIMEOUT;  		goto out;  	    }  	    alarm(timeout); @@ -137,14 +134,14 @@ wait_for_process_timed(pid_t pid, time_t (*func)(void *),      return ret;  } -int ROKEN_LIB_FUNCTION +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL  wait_for_process(pid_t pid)  {      return wait_for_process_timed(pid, NULL, NULL, 0);  } -int ROKEN_LIB_FUNCTION -pipe_execv(FILE **stdin_fd, FILE **stdout_fd, FILE **stderr_fd,  +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +pipe_execv(FILE **stdin_fd, FILE **stdout_fd, FILE **stderr_fd,  	   const char *file, ...)  {      int in_fd[2], out_fd[2], err_fd[2]; @@ -214,7 +211,7 @@ pipe_execv(FILE **stdin_fd, FILE **stdout_fd, FILE **stderr_fd,  	    close(err_fd[0]);  	    close(err_fd[1]);  	} -	return -2; +	return SE_E_FORKFAILED;      default:  	if(stdin_fd != NULL) {  	    close(in_fd[0]); @@ -232,52 +229,52 @@ pipe_execv(FILE **stdin_fd, FILE **stdout_fd, FILE **stderr_fd,      return pid;  } -int ROKEN_LIB_FUNCTION -simple_execvp_timed(const char *file, char *const args[],  +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL +simple_execvp_timed(const char *file, char *const args[],  		    time_t (*func)(void *), void *ptr, time_t timeout)  {      pid_t pid = fork();      switch(pid){      case -1: -	return -2; +	return SE_E_FORKFAILED;      case 0:  	execvp(file, args);  	exit((errno == ENOENT) ? EX_NOTFOUND : EX_NOEXEC); -    default:  +    default:  	return wait_for_process_timed(pid, func, ptr, timeout);      }  } -int ROKEN_LIB_FUNCTION +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL  simple_execvp(const char *file, char *const args[])  {      return simple_execvp_timed(file, args, NULL, NULL, 0);  }  /* gee, I'd like a execvpe */ -int ROKEN_LIB_FUNCTION +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL  simple_execve_timed(const char *file, char *const args[], char *const envp[],  		    time_t (*func)(void *), void *ptr, time_t timeout)  {      pid_t pid = fork();      switch(pid){      case -1: -	return -2; +	return SE_E_FORKFAILED;      case 0:  	execve(file, args, envp);  	exit((errno == ENOENT) ? EX_NOTFOUND : EX_NOEXEC); -    default:  +    default:  	return wait_for_process_timed(pid, func, ptr, timeout);      }  } -int ROKEN_LIB_FUNCTION +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL  simple_execve(const char *file, char *const args[], char *const envp[])  {      return simple_execve_timed(file, args, envp, NULL, NULL, 0);  } -int ROKEN_LIB_FUNCTION +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL  simple_execlp(const char *file, ...)  {      va_list ap; @@ -288,13 +285,13 @@ simple_execlp(const char *file, ...)      argv = vstrcollect(&ap);      va_end(ap);      if(argv == NULL) -	return -1; +	return SE_E_UNSPECIFIED;      ret = simple_execvp(file, argv);      free(argv);      return ret;  } -int ROKEN_LIB_FUNCTION +ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL  simple_execle(const char *file, ... /* ,char *const envp[] */)  {      va_list ap; @@ -307,25 +304,8 @@ simple_execle(const char *file, ... /* ,char *const envp[] */)      envp = va_arg(ap, char **);      va_end(ap);      if(argv == NULL) -	return -1; +	return SE_E_UNSPECIFIED;      ret = simple_execve(file, argv, envp);      free(argv);      return ret;  } - -int ROKEN_LIB_FUNCTION -simple_execl(const char *file, ...)  -{ -    va_list ap; -    char **argv; -    int ret; - -    va_start(ap, file); -    argv = vstrcollect(&ap); -    va_end(ap); -    if(argv == NULL) -	return -1; -    ret = simple_execve(file, argv, environ); -    free(argv); -    return ret; -} | 
