X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fgz_open.c;h=3997e728e51b07608009739b2c41cdbe24e8ffbc;hb=a12def2ef9f33f024b5cda7f48fc794f48315a5d;hp=0ed14173a5c389bea2d658997e9aa7d82beab38f;hpb=19cda406126b0012a5cd9509ada41795846732ef;p=oweals%2Fopkg-lede.git diff --git a/libbb/gz_open.c b/libbb/gz_open.c index 0ed1417..3997e72 100644 --- a/libbb/gz_open.c +++ b/libbb/gz_open.c @@ -29,16 +29,23 @@ #include #include "libbb.h" -extern FILE *gz_open(FILE *compressed_file, int *pid) +FILE * +gz_open(FILE *compressed_file, int *pid) { int unzip_pipe[2]; if (pipe(unzip_pipe)!=0) { - perror_msg("%s: pipe: ", __FUNCTION__); + perror_msg("pipe"); return(NULL); } + + /* If we don't flush, we end up with two copies of anything pending, + one from the parent, one from the child */ + fflush(stdout); + fflush(stderr); + if ((*pid = fork()) == -1) { - perror_msg("%s: fork: ", __FUNCTION__); + perror_msg("fork"); return(NULL); } if (*pid==0) { @@ -48,19 +55,41 @@ extern FILE *gz_open(FILE *compressed_file, int *pid) fflush(NULL); fclose(compressed_file); close(unzip_pipe[1]); - exit(EXIT_SUCCESS); + _exit(EXIT_SUCCESS); } close(unzip_pipe[1]); return(fdopen(unzip_pipe[0], "r")); } -extern void gz_close(int gunzip_pid) +int +gz_close(int gunzip_pid) { - if (kill(gunzip_pid, SIGTERM) == -1) { - perror_msg_and_die("%s: kill(gunzip_pid): ", __FUNCTION__); + int status; + int ret; + + if (waitpid(gunzip_pid, &status, 0) == -1) { + perror_msg("waitpid"); + return -1; + } + + if (WIFSIGNALED(status)) { + error_msg("Unzip process killed by signal %d.\n", + WTERMSIG(status)); + return -1; + } + + if (!WIFEXITED(status)) { + /* shouldn't happen */ + error_msg("Your system is broken: got status %d from waitpid.\n", + status); + return -1; } - if (waitpid(gunzip_pid, NULL, 0) == -1) { - perror_msg("%s wait: ", __FUNCTION__); + if ((ret = WEXITSTATUS(status))) { + error_msg("Unzip process failed with return code %d.\n", + ret); + return -1; } + + return 0; }