diff options
| author | Mattias Andrée <maandree@kth.se> | 2017-05-02 00:08:33 +0200 |
|---|---|---|
| committer | Mattias Andrée <maandree@kth.se> | 2017-05-02 00:08:33 +0200 |
| commit | a2eb10b156eafd5fc900471dded83c78adc5d46d (patch) | |
| tree | 9beb8bff29c26db9355a7721972ae05134753fe2 /src | |
| parent | Use stdin rather than stdout if - is opened with O_RDWR because <> defaults to stdin (diff) | |
| download | blind-a2eb10b156eafd5fc900471dded83c78adc5d46d.tar.gz blind-a2eb10b156eafd5fc900471dded83c78adc5d46d.tar.bz2 blind-a2eb10b156eafd5fc900471dded83c78adc5d46d.tar.xz | |
Fix support for tiny frames in blind-reverse
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to 'src')
| -rw-r--r-- | src/blind-reverse.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/src/blind-reverse.c b/src/blind-reverse.c index 0bbe766..69013bb 100644 --- a/src/blind-reverse.c +++ b/src/blind-reverse.c @@ -18,7 +18,7 @@ to_stdout(struct stream *stream, size_t frame_size) ptr = stream->frames * frame_size + stream->headlen; end = ptr + frame_size; while (ptr < end) { - if (!(r = epread(stream->fd, buf, sizeof(buf), ptr, stream->file))) + if (!(r = epread(stream->fd, buf, MIN(sizeof(buf), end - ptr), ptr, stream->file))) eprintf("%s: file is shorter than expected\n", stream->file); ptr += n = (size_t)r; ewriteall(STDOUT_FILENO, buf, n, "<stdout>"); @@ -35,6 +35,21 @@ elseek_set(int fd, off_t offset, const char *fname) } static void +epread_frame(struct stream *stream, char *buf, off_t off, size_t n) +{ + stream->ptr = stream->xptr = 0; + elseek_set(stream->fd, off, stream->file); + eread_frame(stream, buf, n); +} + +static void +epwrite_frame(struct stream *stream, char *buf, off_t off, size_t n) +{ + elseek_set(stream->fd, off, stream->file); + ewriteall(stream->fd, buf, n, stream->file); +} + +static void in_place(struct stream *stream, size_t frame_size) { size_t f, fm = stream->frames - 1; @@ -47,13 +62,12 @@ in_place(struct stream *stream, size_t frame_size) for (f = 0; f < stream->frames >> 1; f++) { pa = f * frame_size + stream->headlen; pb = (fm - f) * frame_size + stream->headlen; - eread_frame(stream, bufa, frame_size); - elseek_set(stream->fd, pb, stream->file); - eread_frame(stream, bufb, frame_size); - elseek_set(stream->fd, pb, stream->file); - ewriteall(stream->fd, bufa, frame_size, stream->file); - elseek_set(stream->fd, pa, stream->file); - ewriteall(stream->fd, bufb, frame_size, stream->file); + + epread_frame(stream, bufa, pa, frame_size); + epread_frame(stream, bufb, pb, frame_size); + + epwrite_frame(stream, bufa, pb, frame_size); + epwrite_frame(stream, bufb, pa, frame_size); } free(bufa); |
