mirror of
https://github.com/ckolivas/lrzip.git
synced 2025-12-06 07:12:00 +01:00
Merge pull request #231 from tpwrules/fix-stdio
switch to chunk-wide read/write loops when loading and dumping in stdio mode
This commit is contained in:
commit
dce1ab8ec8
59
lrzip.c
59
lrzip.c
|
|
@ -56,6 +56,7 @@
|
||||||
#include "stream.h"
|
#include "stream.h"
|
||||||
|
|
||||||
#define MAGIC_LEN (24)
|
#define MAGIC_LEN (24)
|
||||||
|
#define STDIO_TMPFILE_BUFFER_SIZE (65536) // used in read_tmpinfile and dump_tmpoutfile
|
||||||
|
|
||||||
static void release_hashes(rzip_control *control);
|
static void release_hashes(rzip_control *control);
|
||||||
|
|
||||||
|
|
@ -412,7 +413,7 @@ static bool flush_tmpoutbuf(rzip_control *control)
|
||||||
/* Dump temporary outputfile to perform stdout */
|
/* Dump temporary outputfile to perform stdout */
|
||||||
static bool dump_tmpoutfile(rzip_control *control)
|
static bool dump_tmpoutfile(rzip_control *control)
|
||||||
{
|
{
|
||||||
int tmpchar, fd_out = control->fd_out;
|
int fd_out = control->fd_out;
|
||||||
FILE *tmpoutfp;
|
FILE *tmpoutfp;
|
||||||
|
|
||||||
if (unlikely(fd_out == -1))
|
if (unlikely(fd_out == -1))
|
||||||
|
|
@ -425,9 +426,35 @@ static bool dump_tmpoutfile(rzip_control *control)
|
||||||
rewind(tmpoutfp);
|
rewind(tmpoutfp);
|
||||||
|
|
||||||
if (!TEST_ONLY) {
|
if (!TEST_ONLY) {
|
||||||
|
char* buf;
|
||||||
|
|
||||||
print_verbose("Dumping temporary file to control->outFILE.\n");
|
print_verbose("Dumping temporary file to control->outFILE.\n");
|
||||||
while ((tmpchar = fgetc(tmpoutfp)) != EOF)
|
fflush(control->outFILE);
|
||||||
putchar(tmpchar);
|
|
||||||
|
buf = malloc(STDIO_TMPFILE_BUFFER_SIZE);
|
||||||
|
if (unlikely(!buf))
|
||||||
|
fatal_return(("Failed to allocate buffer in dump_tmpoutfile\n"), false);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
ssize_t num_read, num_written;
|
||||||
|
num_read = fread(buf, 1, STDIO_TMPFILE_BUFFER_SIZE, tmpoutfp);
|
||||||
|
if (unlikely(num_read == 0)) {
|
||||||
|
if (ferror(tmpoutfp)) {
|
||||||
|
dealloc(buf);
|
||||||
|
fatal_return(("Failed read in dump_tmpoutfile\n"), false);
|
||||||
|
} else {
|
||||||
|
break; // must be at EOF
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
num_written = fwrite(buf, 1, num_read, control->outFILE);
|
||||||
|
if (unlikely(num_written != num_read)) {
|
||||||
|
dealloc(buf);
|
||||||
|
fatal_return(("Failed write in dump_tmpoutfile\n"), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dealloc(buf);
|
||||||
fflush(control->outFILE);
|
fflush(control->outFILE);
|
||||||
rewind(tmpoutfp);
|
rewind(tmpoutfp);
|
||||||
}
|
}
|
||||||
|
|
@ -539,6 +566,7 @@ bool read_tmpinfile(rzip_control *control, int fd_in)
|
||||||
{
|
{
|
||||||
FILE *tmpinfp;
|
FILE *tmpinfp;
|
||||||
int tmpchar;
|
int tmpchar;
|
||||||
|
char* buf;
|
||||||
|
|
||||||
if (fd_in == -1)
|
if (fd_in == -1)
|
||||||
return false;
|
return false;
|
||||||
|
|
@ -548,9 +576,30 @@ bool read_tmpinfile(rzip_control *control, int fd_in)
|
||||||
if (unlikely(tmpinfp == NULL))
|
if (unlikely(tmpinfp == NULL))
|
||||||
fatal_return(("Failed to fdopen in tmpfile\n"), false);
|
fatal_return(("Failed to fdopen in tmpfile\n"), false);
|
||||||
|
|
||||||
while ((tmpchar = getchar()) != EOF)
|
buf = malloc(STDIO_TMPFILE_BUFFER_SIZE);
|
||||||
fputc(tmpchar, tmpinfp);
|
if (unlikely(!buf))
|
||||||
|
fatal_return(("Failed to allocate buffer in read_tmpinfile\n"), false);
|
||||||
|
|
||||||
|
while (1) {
|
||||||
|
ssize_t num_read, num_written;
|
||||||
|
num_read = fread(buf, 1, STDIO_TMPFILE_BUFFER_SIZE, stdin);
|
||||||
|
if (unlikely(num_read == 0)) {
|
||||||
|
if (ferror(stdin)) {
|
||||||
|
dealloc(buf);
|
||||||
|
fatal_return(("Failed read in read_tmpinfile\n"), false);
|
||||||
|
} else {
|
||||||
|
break; // must be at EOF
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
num_written = fwrite(buf, 1, num_read, tmpinfp);
|
||||||
|
if (unlikely(num_written != num_read)) {
|
||||||
|
dealloc(buf);
|
||||||
|
fatal_return(("Failed write in read_tmpinfile\n"), false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dealloc(buf);
|
||||||
fflush(tmpinfp);
|
fflush(tmpinfp);
|
||||||
rewind(tmpinfp);
|
rewind(tmpinfp);
|
||||||
return true;
|
return true;
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue