summaryrefslogtreecommitdiff
path: root/src/compress.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/compress.c')
-rw-r--r--src/compress.c60
1 files changed, 43 insertions, 17 deletions
diff --git a/src/compress.c b/src/compress.c
index 084970b..e968bb4 100644
--- a/src/compress.c
+++ b/src/compress.c
@@ -35,7 +35,7 @@
#include "file.h"
#ifndef lint
-FILE_RCSID("@(#)$File: compress.c,v 1.70 2012/11/07 17:54:48 christos Exp $")
+FILE_RCSID("@(#)$File: compress.c,v 1.77 2014/12/12 16:33:01 christos Exp $")
#endif
#include "magic.h"
@@ -45,7 +45,8 @@ FILE_RCSID("@(#)$File: compress.c,v 1.70 2012/11/07 17:54:48 christos Exp $")
#endif
#include <string.h>
#include <errno.h>
-#ifndef __MINGW32__
+#include <signal.h>
+#if !defined(__MINGW32__) && !defined(WIN32)
#include <sys/ioctl.h>
#endif
#ifdef HAVE_SYS_WAIT_H
@@ -80,6 +81,7 @@ private const struct {
{ "LZIP", 4, { "lzip", "-cdq", NULL }, 1 },
{ "\3757zXZ\0",6,{ "xz", "-cd", NULL }, 1 }, /* XZ Utils */
{ "LRZI", 4, { "lrzip", "-dqo-", NULL }, 1 }, /* LRZIP */
+ { "\004\"M\030", 4, { "lz4", "-cd", NULL }, 1 }, /* LZ4 */
};
#define NODATA ((size_t)~0)
@@ -102,10 +104,12 @@ file_zmagic(struct magic_set *ms, int fd, const char *name,
size_t i, nsz;
int rv = 0;
int mime = ms->flags & MAGIC_MIME;
+ sig_t osigpipe;
if ((ms->flags & MAGIC_COMPRESS) == 0)
return 0;
+ osigpipe = signal(SIGPIPE, SIG_IGN);
for (i = 0; i < ncompr; i++) {
if (nbytes < compr[i].maglen)
continue;
@@ -121,19 +125,18 @@ file_zmagic(struct magic_set *ms, int fd, const char *name,
if (file_printf(ms, mime ?
" compressed-encoding=" : " (") == -1)
goto error;
+ if (file_buffer(ms, -1, NULL, buf, nbytes) == -1)
+ goto error;
+ if (!mime && file_printf(ms, ")") == -1)
+ goto error;
}
- if ((mime == 0 || mime & MAGIC_MIME_ENCODING) &&
- file_buffer(ms, -1, NULL, buf, nbytes) == -1)
- goto error;
-
- if (!mime && file_printf(ms, ")") == -1)
- goto error;
rv = 1;
break;
}
}
error:
+ (void)signal(SIGPIPE, osigpipe);
free(newbuf);
ms->flags |= MAGIC_COMPRESS;
return rv;
@@ -378,6 +381,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
const unsigned char *old, unsigned char **newch, size_t n)
{
int fdin[2], fdout[2];
+ int status;
ssize_t r;
pid_t pid;
@@ -460,7 +464,17 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
/*NOTREACHED*/
default: /* parent */
- break;
+ if (wait(&status) == -1) {
+#ifdef DEBUG
+ (void)fprintf(stderr,
+ "Wait failed (%s)\n",
+ strerror(errno));
+#endif
+ exit(1);
+ }
+ exit(WIFEXITED(status) ?
+ WEXITSTATUS(status) : 1);
+ /*NOTREACHED*/
}
(void) close(fdin[1]);
fdin[1] = -1;
@@ -471,7 +485,7 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
(void)fprintf(stderr, "Malloc failed (%s)\n",
strerror(errno));
#endif
- n = 0;
+ n = NODATA;
goto err;
}
if ((r = sread(fdout[0], *newch, HOWMANY, 0)) <= 0) {
@@ -480,8 +494,8 @@ uncompressbuf(struct magic_set *ms, int fd, size_t method,
strerror(errno));
#endif
free(*newch);
- n = 0;
- newch[0] = '\0';
+ n = NODATA;
+ *newch = NULL;
goto err;
} else {
n = r;
@@ -492,12 +506,24 @@ err:
if (fdin[1] != -1)
(void) close(fdin[1]);
(void) close(fdout[0]);
-#ifdef WNOHANG
- while (waitpid(pid, NULL, WNOHANG) != -1)
- continue;
-#else
- (void)wait(NULL);
+ if (wait(&status) == -1) {
+#ifdef DEBUG
+ (void)fprintf(stderr, "Wait failed (%s)\n",
+ strerror(errno));
#endif
+ n = NODATA;
+ } else if (!WIFEXITED(status)) {
+#ifdef DEBUG
+ (void)fprintf(stderr, "Child not exited (0x%x)\n",
+ status);
+#endif
+ } else if (WEXITSTATUS(status) != 0) {
+#ifdef DEBUG
+ (void)fprintf(stderr, "Child exited (0x%d)\n",
+ WEXITSTATUS(status));
+#endif
+ }
+
(void) close(fdin[0]);
return n;