#include <fcntl.h>
#include <unistd.h>
#include <errno.h>
+#include <string.h>
+#include <stdlib.h>
+#include <assert.h>
#include <sys/mman.h>
-#include "sha256.h"
-
#include "lzma.h"
-void uncompresslzma(void *buf, size_t bufsize, FILE *out) {
+ssize_t uncompresslzma(void *buf, size_t bufsize, int out) {
lzma_stream s = LZMA_STREAM_INIT;
lzma_stream *strm;
+ ssize_t bytes = 0;
uint8_t outbuf[BUFSIZ];
if (ret != LZMA_OK) {
fprintf(stderr, "%s", ret == LZMA_MEM_ERROR ? strerror(ENOMEM)
: "Internal error (bug)");
- exit(EXIT_FAILURE);
+ return -1;
}
strm->avail_in = bufsize;
// This way as much data as possible gets written to output
// even if decoder detected an error.
if (strm->avail_out == 0 || ret != LZMA_OK) {
- const size_t write_size = BUFSIZ - strm->avail_out;
-
- if (fwrite(outbuf, 1, write_size, out) != write_size) {
- // Wouldn't be a surprise if writing to stderr
- // would fail too but at least try to show an
- // error message.
- fprintf(stderr, "Cannot write to output file stream: "
- "%s", strerror(errno));
- exit(EXIT_FAILURE);
+ size_t avail = BUFSIZ - strm->avail_out;
+ ssize_t written = 0;
+ uint8_t *start;
+
+ start = outbuf;
+
+ while (avail > 0) {
+ written = write(out, outbuf, avail);
+ if (written == -1) {
+ /* Wouldn't be a surprise if writing to
+ * stderr would fail too but at least
+ * try to show an error message.
+ */
+ fprintf(stderr, "Cannot write to output"
+ " file stream: %s",
+ strerror(errno));
+ return -1;
+ }
+ avail -= written;
+ start += written;
+ bytes += written;
}
strm->next_out = outbuf;
// that there's no trailing garbage.
assert(strm->avail_in == 0);
//assert(action == LZMA_FINISH);
- return;
+ return bytes;
}
const char *msg;
break;
}
- fprintf(stderr, "xz: %s\n", msg);
- exit(EXIT_FAILURE);
+ fprintf(stderr, "zpmuncompress: %s\n", msg);
+ return -1;
}
}
}