X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=libbb%2Fgz_open.c;h=f9ee8c10b53cdde04f2475316b17ae7872afe972;hb=cc67a2a72b7b9eb1477c7afdff2ab4409689bb05;hp=ba4d6a5099b12e917331a52475fcd5be0495b057;hpb=47daab916286d7ac837ecaadb607b09797822fc2;p=oweals%2Fopkg-lede.git diff --git a/libbb/gz_open.c b/libbb/gz_open.c index ba4d6a5..f9ee8c1 100644 --- a/libbb/gz_open.c +++ b/libbb/gz_open.c @@ -34,11 +34,11 @@ extern FILE *gz_open(FILE *compressed_file, int *pid) int unzip_pipe[2]; if (pipe(unzip_pipe)!=0) { - error_msg("pipe error"); + perror_msg("%s: pipe", __FUNCTION__); return(NULL); } if ((*pid = fork()) == -1) { - error_msg("fork failed"); + perror_msg("%s: fork", __FUNCTION__); return(NULL); } if (*pid==0) { @@ -48,86 +48,15 @@ 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")); } -/* gz_open implementation using gunzip and a vfork/exec -- dodges OOM killer */ -extern FILE *gzvopen(FILE *compressed_file, int *pid) +extern void gz_close(int gunzip_pid) { - int unzip_pipe[2]; - off_t floc; - int cfile; - - /* create a new file descriptor for the input stream - * (it *must* be associated with a file) - * and seek to the same position in that fd as the stream. - */ - cfile = dup(fileno(compressed_file)); - floc = ftello(compressed_file); - lseek(cfile, floc, SEEK_SET); - - /* create the pipe */ - if (pipe(unzip_pipe)!=0) { - error_msg("gzvopen(): pipe error"); - return(NULL); + if (waitpid(gunzip_pid, NULL, 0) == -1) { + perror_msg("%s wait", __FUNCTION__); } - - *pid = vfork(); - - if (*pid < 0) { - error_msg("gzvopen(): fork failed"); - return(NULL); - } - - if (*pid==0) { - /* child process - reads STDIN, writes to pipe */ - - /* close unused read end of pipe */ - close(unzip_pipe[0]); - - /* connect child's stdout to the pipe write end */ - dup2(unzip_pipe[1], 1); - - /* connect child's stdin to the fd passed in to us */ - dup2(cfile, 0); - - /* execute the gunzip utility */ - execlp("gunzip","gunzip",NULL); - - /* if we get here, we had a failure - since we are - * using vfork(), we cannot call exit(), must call _exit(). - */ - _exit(-1); - } - - /* Parent process is executing here */ - - /* we have no more need of the duplicate fd */ - close(cfile); - - /* close the write end of the pipe */ - close(unzip_pipe[1]); - - /* return the read end of the pipe as a FILE */ - return(fdopen(unzip_pipe[0], "r")); -} - -extern void gzvclose(int gunzip_pid) -{ - if (kill(gunzip_pid, SIGTERM) == -1) { - perror("gzvclose()"); - fprintf(stderr,"%s: unable to kill gunzip pid.\n", - __FUNCTION__); - } - - if (waitpid(gunzip_pid, NULL, 0) == -1) { - fprintf(stderr,"%s: unable to wait on gunzip pid.\n", - __FUNCTION__); - } }