diff options
author | graham.gower <graham.gower@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358> | 2009-11-26 20:22:10 (EST) |
---|---|---|
committer | graham.gower <graham.gower@e8e0d7a0-c8d9-11dd-a880-a1081c7ac358> | 2009-11-26 20:22:10 (EST) |
commit | 8fdd042394b7395c13bee66afb45dd3875c60c63 (patch) | |
tree | ee7ce27b3b440710d4f0b82e6e14fe0e483eb71e /libbb/gz_open.c | |
parent | 6afed21188df0c417349563621302ec85f44096f (diff) |
Check the unzip child process for errors and pass the upwards. Also, avoid child from being killed by SIGPIPE.
git-svn-id: http://opkg.googlecode.com/svn/trunk@392 e8e0d7a0-c8d9-11dd-a880-a1081c7ac358
Diffstat (limited to 'libbb/gz_open.c')
-rw-r--r-- | libbb/gz_open.c | 35 |
1 files changed, 31 insertions, 4 deletions
diff --git a/libbb/gz_open.c b/libbb/gz_open.c index f9ee8c1..3d07b58 100644 --- a/libbb/gz_open.c +++ b/libbb/gz_open.c @@ -29,7 +29,8 @@ #include <unistd.h> #include "libbb.h" -extern FILE *gz_open(FILE *compressed_file, int *pid) +FILE * +gz_open(FILE *compressed_file, int *pid) { int unzip_pipe[2]; @@ -54,9 +55,35 @@ extern FILE *gz_open(FILE *compressed_file, int *pid) return(fdopen(unzip_pipe[0], "r")); } -extern void gz_close(int gunzip_pid) +int +gz_close(int gunzip_pid) { - if (waitpid(gunzip_pid, NULL, 0) == -1) { - perror_msg("%s wait", __FUNCTION__); + int status; + int ret; + + if (waitpid(gunzip_pid, &status, 0) == -1) { + perror_msg("%s: waitpid", __FUNCTION__); + return -1; + } + + if (WIFSIGNALED(status)) { + error_msg("%s: unzip process killed by signal %d\n", + __FUNCTION__, WTERMSIG(status)); + return -1; + } + + if (!WIFEXITED(status)) { + /* shouldn't happen */ + error_msg("%s: Your system is broken: got status %d from waitpid\n", + __FUNCTION__, status); + return -1; } + + if ((ret = WEXITSTATUS(status))) { + error_msg("%s: unzip process failed with return code %d.\n", + __FUNCTION__, ret); + return -1; + } + + return 0; } |