diff --git a/lib/roken/roken-common.h b/lib/roken/roken-common.h index e83d5049c..11d4a25ce 100644 --- a/lib/roken/roken-common.h +++ b/lib/roken/roken-common.h @@ -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 diff --git a/lib/roken/simple_exec.c b/lib/roken/simple_exec.c index 02d62d770..97679d7e4 100644 --- a/lib/roken/simple_exec.c +++ b/lib/roken/simple_exec.c @@ -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; diff --git a/lib/roken/simple_exec_w32.c b/lib/roken/simple_exec_w32.c index 1356018f1..201fd4134 100644 --- a/lib/roken/simple_exec_w32.c +++ b/lib/roken/simple_exec_w32.c @@ -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;