Fix if statement with empty body due to stray semicolon.
[oweals/opkg-lede.git] / libbb / gz_open.c
index dbaf3bb023bceebd90694a4b7282fea0241a9692..3997e728e51b07608009739b2c41cdbe24e8ffbc 100644 (file)
 #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];
 
        if (pipe(unzip_pipe)!=0) {
-               error_msg("pipe error");
+               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) {
-               error_msg("fork failed");
+               perror_msg("fork");
                return(NULL);
        }
        if (*pid==0) {
@@ -48,11 +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]);
-       if (unzip_pipe[0] == -1) {
-               error_msg("gzip stream init failed");
-       }
        return(fdopen(unzip_pipe[0], "r"));
 }
+
+int
+gz_close(int gunzip_pid)
+{
+       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 ((ret = WEXITSTATUS(status))) {
+               error_msg("Unzip process failed with return code %d.\n",
+                               ret);
+               return -1;
+       }
+
+       return 0;
+}