Formalize the simple_exec*() API
This commit is contained in:
		 Asanka Herath
					Asanka Herath
				
			
				
					committed by
					
						 Love Hornquist Astrand
						Love Hornquist Astrand
					
				
			
			
				
	
			
			
			 Love Hornquist Astrand
						Love Hornquist Astrand
					
				
			
						parent
						
							7ee1695f12
						
					
				
				
					commit
					49b261efdc
				
			| @@ -288,6 +288,18 @@ SigAction signal(int iSig, SigAction pAction); /* BSD compatible */ | ||||
| #endif | ||||
| #endif | ||||
|  | ||||
| #define SE_E_UNSPECIFIED (-1) | ||||
| #define SE_E_FORKFAILED  (-2) | ||||
| #define SE_E_WAITPIDFAILED (-3) | ||||
| #define SE_E_EXECTIMEOUT (-4) | ||||
| #define SE_E_NOEXEC   126 | ||||
| #define SE_E_NOTFOUND 127 | ||||
|  | ||||
| #define SE_PROCSTATUS(st) (((st) >= 0 && (st) < 126)? st: -1) | ||||
| #define SE_PROCSIGNAL(st) (((st) >= 128)? (st) - 128: -1) | ||||
| #define SE_IS_ERROR(st) ((st) < 0 || (st) >= 126) | ||||
|  | ||||
|  | ||||
| #define simple_execve rk_simple_execve | ||||
| ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL | ||||
| simple_execve(const char*, char*const[], char*const[]); | ||||
| @@ -475,7 +487,7 @@ rk_cloexec(int); | ||||
| ROKEN_LIB_FUNCTION void ROKEN_LIB_CALL | ||||
| rk_cloexec_file(FILE *); | ||||
|  | ||||
| int ROKEN_LIB_FUNCTION | ||||
| ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL | ||||
| ct_memcmp(const void *, const void *, size_t); | ||||
|  | ||||
| ROKEN_CPP_END | ||||
|   | ||||
| @@ -52,13 +52,13 @@ | ||||
| #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: | ||||
| @@ -98,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) | ||||
| @@ -110,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); | ||||
| @@ -211,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]); | ||||
| @@ -236,7 +236,7 @@ simple_execvp_timed(const char *file, char *const args[], | ||||
|     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); | ||||
| @@ -259,7 +259,7 @@ simple_execve_timed(const char *file, char *const args[], char *const envp[], | ||||
|     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); | ||||
| @@ -285,7 +285,7 @@ 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; | ||||
| @@ -304,7 +304,7 @@ 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; | ||||
|   | ||||
| @@ -51,7 +51,7 @@ RCSID("$Id$"); | ||||
|  *     the callback function is called.  THe possible return values | ||||
|  *     from the callback function are: | ||||
|  * | ||||
|  * - ((time_t) -2) Exit loop without killing child and return -4. | ||||
|  * - ((time_t) -2) Exit loop without killing child and return SE_E_EXECTIMEOUT. | ||||
|  * - ((time_t) -1) Kill child with SIGTERM and wait for child to exit. | ||||
|  * - 0             Don't timeout again | ||||
|  * - n             Seconds to next timeout | ||||
| @@ -60,12 +60,12 @@ RCSID("$Id$"); | ||||
|  * | ||||
|  * @param[in] timeout Seconds to first timeout. | ||||
|  * | ||||
|  * @retval -1 Unspecified system error | ||||
|  * @retval -2 Fork failure (not applicable for _WIN32 targets) | ||||
|  * @retval -3 waitpid errors | ||||
|  * @retval -4 exec timeout | ||||
|  * @retval 0- Return value from subprocess | ||||
|  * @retval 126 The program coudln't be found | ||||
|  * @retval SE_E_UNSPECIFIED   Unspecified system error | ||||
|  * @retval SE_E_FORKFAILED    Fork failure (not applicable for _WIN32 targets) | ||||
|  * @retval SE_E_WAITPIDFAILED waitpid errors | ||||
|  * @retval SE_E_EXECTIMEOUT   exec timeout | ||||
|  * @retval 0 <= Return value  from subprocess | ||||
|  * @retval SE_E_NOTFOUND      The program coudln't be found | ||||
|  * @retval 128- The signal that killed the subprocess +128. | ||||
|  */ | ||||
| ROKEN_LIB_FUNCTION int ROKEN_LIB_CALL | ||||
| @@ -78,7 +78,7 @@ wait_for_process_timed(pid_t pid, time_t (*func)(void *), | ||||
|     int rv = 0; | ||||
|  | ||||
|     if (hProcess == NULL) | ||||
|         return -4; | ||||
|         return SE_E_WAITPIDFAILED; | ||||
|  | ||||
|     dtimeout = (DWORD) ((timeout == 0)? INFINITE: timeout * 1000); | ||||
|  | ||||
| @@ -106,12 +106,12 @@ wait_for_process_timed(pid_t pid, time_t (*func)(void *), | ||||
| 		    dtimeout = INFINITE; | ||||
| 		    continue; | ||||
| 		} | ||||
| 		rv = -1; | ||||
| 		rv = SE_E_UNSPECIFIED; | ||||
| 		break; | ||||
|  | ||||
| 	    } else if (timeout == (time_t) -2) { | ||||
|  | ||||
| 		rv = -4; | ||||
| 		rv = SE_E_EXECTIMEOUT; | ||||
| 		break; | ||||
|  | ||||
| 	    } else { | ||||
| @@ -123,7 +123,7 @@ wait_for_process_timed(pid_t pid, time_t (*func)(void *), | ||||
|  | ||||
| 	} else { | ||||
|  | ||||
| 	    rv = -1; | ||||
| 	    rv = SE_E_UNSPECIFIED; | ||||
| 	    break; | ||||
|  | ||||
| 	} | ||||
| @@ -403,7 +403,7 @@ 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; | ||||
| @@ -423,7 +423,7 @@ 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; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user