From 4a1996d3aa790f0683e23bb0086554ee70d39f0a Mon Sep 17 00:00:00 2001 From: Nick Gasson Date: Sat, 18 Mar 2023 10:34:54 +0000 Subject: [PATCH] Remove fbuf streaming mode --- src/fbuf.c | 80 +++++++++--------------------------------------- src/fbuf.h | 1 - test/test_misc.c | 32 ------------------- 3 files changed, 15 insertions(+), 98 deletions(-) diff --git a/src/fbuf.c b/src/fbuf.c index 03e62824..602ec6d6 100644 --- a/src/fbuf.c +++ b/src/fbuf.c @@ -320,14 +320,7 @@ static void fbuf_update_header(fbuf_t *f, uint32_t checksum) if (len == -1) fatal_errno("%s: ftell", f->fname); - struct stat buf; - if (fstat(fileno(f->file), &buf) != 0) - fatal_errno("%s: fstat", f->fname); - - if (S_ISFIFO(buf.st_mode)) { - // Streaming mode: length and checksum is appended instead - } - else if (fseek(f->file, 8, SEEK_SET) != 0) + if (fseek(f->file, 8, SEEK_SET) != 0) fatal_errno("%s: fseek", f->fname); const uint8_t bytes[12] = { @@ -392,30 +385,6 @@ static void fbuf_decompress(fbuf_t *f) if (fstat(fileno(f->file), &buf) != 0) fatal_errno("fstat"); - size_t bufsz; - uint8_t *rmap = NULL; - if (S_ISFIFO(buf.st_mode)) { - rmap = xmalloc((bufsz = 16384)); - memcpy(rmap, header, sizeof(header)); - - size_t wptr = sizeof(header); - for (;;) { - const int nr = fread(rmap + wptr, 1, bufsz - wptr, f->file); - if (nr < 0) - fatal_errno("%s", f->fname); - else if (nr == 0) - break; - else if (wptr + nr == bufsz) - rmap = xrealloc(rmap, (bufsz *= 2)); - - wptr += nr; - } - - memcpy(header + 8, rmap + wptr - 8, 8); // Update header - } - else - bufsz = buf.st_size; - const uint32_t len = UNPACK_BE32(header + 8); const uint32_t checksum = UNPACK_BE32(header + 12); uint8_t header_sz = header[6]; @@ -423,7 +392,7 @@ static void fbuf_decompress(fbuf_t *f) if (header_sz == 0) header_sz = 16; // Compatibility with 1.8 and earlier - uint32_t filesz = bufsz; + uint32_t filesz = buf.st_size; if (header_sz > 16) { uint8_t header2[4]; fbuf_read_raw(f, header2, sizeof(header2)); @@ -431,12 +400,11 @@ static void fbuf_decompress(fbuf_t *f) filesz = UNPACK_BE32(header2); } - if (filesz > bufsz) + if (filesz > buf.st_size) fatal("%s has inconsistent compressed size %u vs file size %zu", - f->fname, filesz, bufsz); + f->fname, filesz, buf.st_size); - if (rmap == NULL) - rmap = map_file(fileno(f->file), filesz); + uint8_t *rmap = map_file(fileno(f->file), filesz); f->origsz = len; f->checksum.expect = checksum; @@ -460,26 +428,26 @@ static void fbuf_decompress(fbuf_t *f) f->fname, header[4]); } - if (S_ISFIFO(buf.st_mode)) - free(rmap); - else - unmap_file(rmap, buf.st_size); + unmap_file(rmap, filesz); } -static fbuf_t *fbuf_new(FILE *file, char *fname, fbuf_mode_t mode, - fbuf_cs_t csum, fbuf_zip_t zip) +fbuf_t *fbuf_open(const char *file, fbuf_mode_t mode, fbuf_cs_t csum) { + FILE *h = fopen(file, mode == FBUF_OUT ? "wb" : "rb"); + if (h == NULL) + return NULL; + fbuf_t *f = xcalloc(sizeof(struct _fbuf)); - f->file = file; - f->fname = fname; + f->file = h; + f->fname = xstrdup(file); f->mode = mode; f->next = open_list; - f->zip = zip; + f->zip = DEFAULT_ZIP; checksum_init(&(f->checksum), csum); #ifdef HAVE_LIBZSTD - if (zip == FBUF_ZIP_ZSTD && mode == FBUF_OUT) { + if (f->zip == FBUF_ZIP_ZSTD && mode == FBUF_OUT) { if ((f->zstd = ZSTD_createCCtx()) == NULL) fatal_trace("ZSTD_createCCtx() failed"); @@ -506,24 +474,6 @@ static fbuf_t *fbuf_new(FILE *file, char *fname, fbuf_mode_t mode, return (open_list = f); } -fbuf_t *fbuf_open(const char *file, fbuf_mode_t mode, fbuf_cs_t csum) -{ - FILE *h = fopen(file, mode == FBUF_OUT ? "wb" : "rb"); - if (h == NULL) - return NULL; - - return fbuf_new(h, xstrdup(file), mode, csum, DEFAULT_ZIP); -} - -fbuf_t *fbuf_fdopen(int fd, fbuf_mode_t mode, fbuf_cs_t csum) -{ - FILE *h = fdopen(fd, mode == FBUF_OUT ? "wb" : "rb"); - if (h == NULL) - return NULL; - - return fbuf_new(h, xasprintf("", fd), mode, csum, FBUF_ZIP_NONE); -} - const char *fbuf_file_name(fbuf_t *f) { return f->fname; diff --git a/src/fbuf.h b/src/fbuf.h index 2c4e32d6..3c74a1b1 100644 --- a/src/fbuf.h +++ b/src/fbuf.h @@ -41,7 +41,6 @@ typedef enum { } fbuf_zip_t; fbuf_t *fbuf_open(const char *file, fbuf_mode_t mode, fbuf_cs_t csum); -fbuf_t *fbuf_fdopen(int fd, fbuf_mode_t mode, fbuf_cs_t csum); void fbuf_close(fbuf_t *f, uint32_t *checksum); void fbuf_cleanup(void); const char *fbuf_file_name(fbuf_t *f); diff --git a/test/test_misc.c b/test/test_misc.c index a970a8fd..5fac9225 100644 --- a/test/test_misc.c +++ b/test/test_misc.c @@ -599,34 +599,6 @@ START_TEST(test_stop_world) } END_TEST -START_TEST(test_fbuf_pipe) -{ - opt_set_int(OPT_ERROR_LIMIT, -1); - - int rfd, wfd; - open_pipe(&rfd, &wfd); - - fbuf_t *w = fbuf_fdopen(wfd, FBUF_OUT, FBUF_CS_ADLER32); - fbuf_put_int(w, 42); - for (int i = 0; i < 10000; i++) - fbuf_put_int(w, i); - - uint32_t wcsum; - fbuf_close(w, &wcsum); - - fbuf_t *r = fbuf_fdopen(rfd, FBUF_IN, FBUF_CS_ADLER32); - ck_assert_int_eq(fbuf_get_int(r), 42); - for (int i = 0; i < 10000; i++) - ck_assert_int_eq(fbuf_get_int(r), i); - - uint32_t rcsum; - fbuf_close(r, &rcsum); - - ck_assert_int_eq(rcsum, wcsum); - ck_assert_int_eq(close(rfd), -1); -} -END_TEST - Suite *get_misc_tests(void) { Suite *s = suite_create("misc"); @@ -674,9 +646,5 @@ Suite *get_misc_tests(void) #endif suite_add_tcase(s, tc_thread); - TCase *tc_fbuf = tcase_create("fbuf"); - tcase_add_test(tc_fbuf, test_fbuf_pipe); - suite_add_tcase(s, tc_fbuf); - return s; } -- 2.39.2