iSerialize/deserialize types - dedup - deduplicating backup program Err bitreich.org 70 hgit clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ URL:git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ bitreich.org 70 1Log /scm/dedup/log.gph bitreich.org 70 1Files /scm/dedup/files.gph bitreich.org 70 1Refs /scm/dedup/refs.gph bitreich.org 70 1Tags /scm/dedup/tag bitreich.org 70 1README /scm/dedup/file/README.gph bitreich.org 70 1LICENSE /scm/dedup/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit f16ec686af5b4b85ac6c5959361c2156259bd0e9 /scm/dedup/commit/f16ec686af5b4b85ac6c5959361c2156259bd0e9.gph bitreich.org 70 1parent d60ace395a74a5efe067ee9cd5d85446c7facf43 /scm/dedup/commit/d60ace395a74a5efe067ee9cd5d85446c7facf43.gph bitreich.org 70 hAuthor: Dimitris Papastamos URL:mailto:dimitris.papastamos@arm.com bitreich.org 70 iDate: Tue, 26 Feb 2019 10:46:36 +0000 Err bitreich.org 70 i Err bitreich.org 70 iSerialize/deserialize types Err bitreich.org 70 i Err bitreich.org 70 iThis should fix any endianness issues as well as avoid padding Err bitreich.org 70 iproblems. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 30 +++++++++++++++++++++++------- Err bitreich.org 70 i M TODO | 1 - Err bitreich.org 70 i M dedup.c | 28 +++++++++++----------------- Err bitreich.org 70 i M dedup.h | 31 +++++++++++++++++++++++++++---- Err bitreich.org 70 i A types.c | 214 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 275 insertions(+), 29 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/dedup/file/Makefile.gph bitreich.org 70 i@@ -2,18 +2,34 @@ VERSION = 0.5 Err bitreich.org 70 i PREFIX = /usr/local Err bitreich.org 70 i MANPREFIX = $(PREFIX)/man Err bitreich.org 70 i BIN = dedup Err bitreich.org 70 i-SRC = $(BIN).c cache.c chunker.c pack.c unpack.c utils.c Err bitreich.org 70 i-OBJ = $(BIN).o cache.o chunker.o pack.o unpack.o utils.o Err bitreich.org 70 i+SRC = \ Err bitreich.org 70 i+ $(BIN).c \ Err bitreich.org 70 i+ arg.h \ Err bitreich.org 70 i+ config.h \ Err bitreich.org 70 i+ dedup.h \ Err bitreich.org 70 i+ tree.h \ Err bitreich.org 70 i+ cache.c \ Err bitreich.org 70 i+ chunker.c \ Err bitreich.org 70 i+ pack.c \ Err bitreich.org 70 i+ types.c \ Err bitreich.org 70 i+ unpack.c \ Err bitreich.org 70 i+ utils.c \ Err bitreich.org 70 i+ Err bitreich.org 70 i+OBJ = \ Err bitreich.org 70 i+ $(BIN).o \ Err bitreich.org 70 i+ cache.o \ Err bitreich.org 70 i+ chunker.o \ Err bitreich.org 70 i+ pack.o \ Err bitreich.org 70 i+ types.o \ Err bitreich.org 70 i+ unpack.o \ Err bitreich.org 70 i+ utils.o Err bitreich.org 70 i+ Err bitreich.org 70 i DISTFILES = \ Err bitreich.org 70 i $(SRC) \ Err bitreich.org 70 i+ $(BIN).1 \ Err bitreich.org 70 i LICENSE \ Err bitreich.org 70 i Makefile \ Err bitreich.org 70 i README \ Err bitreich.org 70 i- arg.h \ Err bitreich.org 70 i- config.h \ Err bitreich.org 70 i- $(BIN).1 \ Err bitreich.org 70 i- dedup.h \ Err bitreich.org 70 i- tree.h \ Err bitreich.org 70 i Err bitreich.org 70 i CFLAGS = -g -Wall Err bitreich.org 70 i CPPFLAGS = -I/usr/local/include -D_FILE_OFFSET_BITS=64 Err bitreich.org 70 1diff --git a/TODO b/TODO /scm/dedup/file/TODO.gph bitreich.org 70 i@@ -1,2 +1 @@ Err bitreich.org 70 i-endianness agnostic Err bitreich.org 70 i overflow checks Err bitreich.org 70 1diff --git a/dedup.c b/dedup.c /scm/dedup/file/dedup.c.gph bitreich.org 70 i@@ -107,13 +107,12 @@ append_snap(struct snapshot *snap) Err bitreich.org 70 i /* Update snapshot header */ Err bitreich.org 70 i snaphdr.nr_snapshots++; Err bitreich.org 70 i xlseek(ifd, 0, SEEK_SET); Err bitreich.org 70 i- xwrite(ifd, &snaphdr, sizeof(snaphdr)); Err bitreich.org 70 i+ write_snaphdr(ifd, &snaphdr); Err bitreich.org 70 i Err bitreich.org 70 i /* Append snapshot */ Err bitreich.org 70 i xlseek(ifd, 0, SEEK_END); Err bitreich.org 70 i- snap->size = sizeof(*snap); Err bitreich.org 70 i- snap->size += snap->nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i- xwrite(ifd, snap, snap->size); Err bitreich.org 70 i+ write_snapshot(ifd, snap); Err bitreich.org 70 i+ write_snapshot_blk_descs(ifd, snap); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static struct snapshot * Err bitreich.org 70 i@@ -400,19 +399,15 @@ walk_snap(int (*fn)(struct snapshot *, void *), void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i- xlseek(ifd, sizeof(snaphdr), SEEK_SET); Err bitreich.org 70 i+ xlseek(ifd, SNAPHDR_LEN, SEEK_SET); Err bitreich.org 70 i for (i = 0; i < snaphdr.nr_snapshots; i++) { Err bitreich.org 70 i struct snapshot *snap; Err bitreich.org 70 i int ret; Err bitreich.org 70 i Err bitreich.org 70 i snap = alloc_snap(); Err bitreich.org 70 i- if (xread(ifd, snap, sizeof(*snap)) == 0) Err bitreich.org 70 i- errx(1, "read: unexpected EOF"); Err bitreich.org 70 i- Err bitreich.org 70 i+ read_snapshot(ifd, snap); Err bitreich.org 70 i snap = grow_snap(snap, snap->nr_blk_descs); Err bitreich.org 70 i- if (xread(ifd, snap->blk_desc, Err bitreich.org 70 i- snap->nr_blk_descs * sizeof(snap->blk_desc[0])) == 0) Err bitreich.org 70 i- errx(1, "read: unexpected EOF"); Err bitreich.org 70 i+ read_snapshot_descs(ifd, snap); Err bitreich.org 70 i Err bitreich.org 70 i ret = (*fn)(snap, arg); Err bitreich.org 70 i free(snap); Err bitreich.org 70 i@@ -424,7 +419,7 @@ walk_snap(int (*fn)(struct snapshot *, void *), void *arg) Err bitreich.org 70 i static int Err bitreich.org 70 i flush_cache(struct cache_entry *cache_entry) Err bitreich.org 70 i { Err bitreich.org 70 i- xwrite(cfd, cache_entry, sizeof(*cache_entry)); Err bitreich.org 70 i+ write_cache_entry(cfd, cache_entry); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -435,7 +430,7 @@ cache_nr_entries(void) Err bitreich.org 70 i Err bitreich.org 70 i if (fstat(cfd, &sb) < 0) Err bitreich.org 70 i err(1, "fstat"); Err bitreich.org 70 i- return sb.st_size / sizeof(struct cache_entry); Err bitreich.org 70 i+ return sb.st_size / CACHE_ENTRY_LEN; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i@@ -449,8 +444,7 @@ load_cache(void) Err bitreich.org 70 i for (i = 0; i < nr_entries; i++) { Err bitreich.org 70 i struct cache_entry cache_entry; Err bitreich.org 70 i Err bitreich.org 70 i- if (xread(cfd, &cache_entry, sizeof(cache_entry)) == 0) Err bitreich.org 70 i- errx(1, "read: unexpected EOF"); Err bitreich.org 70 i+ read_cache_entry(cfd, &cache_entry); Err bitreich.org 70 i add_cache_entry(cache, &cache_entry); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i@@ -482,7 +476,7 @@ init(void) Err bitreich.org 70 i if (sb.st_size != 0) { Err bitreich.org 70 i uint8_t maj, min; Err bitreich.org 70 i Err bitreich.org 70 i- xread(ifd, &snaphdr, sizeof(snaphdr)); Err bitreich.org 70 i+ read_snaphdr(ifd, &snaphdr); Err bitreich.org 70 i min = snaphdr.flags & 0xff; Err bitreich.org 70 i maj = (snaphdr.flags >> 8) & 0xff; Err bitreich.org 70 i Err bitreich.org 70 i@@ -492,7 +486,7 @@ init(void) Err bitreich.org 70 i } else { Err bitreich.org 70 i snaphdr.flags = (VER_MAJ << 8) | VER_MIN; Err bitreich.org 70 i snaphdr.st.min_blk_size = comp_size(BLKSIZE_MAX); Err bitreich.org 70 i- xwrite(ifd, &snaphdr, sizeof(snaphdr)); Err bitreich.org 70 i+ write_snaphdr(ifd, &snaphdr); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i cache = alloc_cache(); Err bitreich.org 70 1diff --git a/dedup.h b/dedup.h /scm/dedup/file/dedup.h.gph bitreich.org 70 i@@ -1,11 +1,22 @@ Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i Err bitreich.org 70 i-#define MSGSIZE 256 Err bitreich.org 70 i-#define MDSIZE 32 Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * These are the actual sizes of the structs in the Err bitreich.org 70 i+ * file format itself. The types are serialized/deserialized Err bitreich.org 70 i+ * using the helpers from types.c. Any modification made to Err bitreich.org 70 i+ * the structs below will need to be reflected here and in types.c. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+#define SNAPHDR_LEN 152 Err bitreich.org 70 i+#define BLKDESC_LEN 48 Err bitreich.org 70 i+#define SNAPSHOT_LEN 304 Err bitreich.org 70 i+#define CACHE_ENTRY_LEN 48 Err bitreich.org 70 i+ Err bitreich.org 70 i+#define MSGSIZE 256 Err bitreich.org 70 i+#define MDSIZE 32 Err bitreich.org 70 i Err bitreich.org 70 i /* snashot file format version */ Err bitreich.org 70 i-#define VER_MIN 1 Err bitreich.org 70 i-#define VER_MAJ 0 Err bitreich.org 70 i+#define VER_MIN 1 Err bitreich.org 70 i+#define VER_MAJ 0 Err bitreich.org 70 i Err bitreich.org 70 i struct cache; Err bitreich.org 70 i struct chunker; Err bitreich.org 70 i@@ -68,6 +79,18 @@ int pack(unsigned char *dst, char *fmt, ...); Err bitreich.org 70 i /* unpack.c */ Err bitreich.org 70 i int unpack(unsigned char *src, char *fmt, ...); Err bitreich.org 70 i Err bitreich.org 70 i+/* types.c */ Err bitreich.org 70 i+void read_snaphdr(int fd, struct snapshot_hdr *hdr); Err bitreich.org 70 i+void write_snaphdr(int fd, struct snapshot_hdr *hdr); Err bitreich.org 70 i+void write_snaphdr(int fd, struct snapshot_hdr *hdr); Err bitreich.org 70 i+void write_blk_desc(int fd, struct blk_desc *desc); Err bitreich.org 70 i+void read_snapshot(int fd, struct snapshot *snap); Err bitreich.org 70 i+void read_snapshot_descs(int fd, struct snapshot *snap); Err bitreich.org 70 i+void write_snapshot(int fd, struct snapshot *snap); Err bitreich.org 70 i+void write_snapshot_blk_descs(int fd, struct snapshot *snap); Err bitreich.org 70 i+void read_cache_entry(int fd, struct cache_entry *cache_entry); Err bitreich.org 70 i+void write_cache_entry(int fd, struct cache_entry *cache_entry); Err bitreich.org 70 i+ Err bitreich.org 70 i /* utils.c */ Err bitreich.org 70 i void str2bin(char *s, uint8_t *d); Err bitreich.org 70 i off_t xlseek(int fd, off_t offset, int whence); Err bitreich.org 70 1diff --git a/types.c b/types.c /scm/dedup/file/types.c.gph bitreich.org 70 i@@ -0,0 +1,214 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "dedup.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+read_snaphdr(int fd, struct snapshot_hdr *hdr) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint8_t buf[SNAPHDR_LEN]; Err bitreich.org 70 i+ int n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (xread(fd, buf, sizeof(buf)) == 0) Err bitreich.org 70 i+ errx(1, "read_snaphdr: unexpected EOF"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = unpack(buf, "qqq", Err bitreich.org 70 i+ &hdr->flags, Err bitreich.org 70 i+ &hdr->nr_snapshots, Err bitreich.org 70 i+ &hdr->store_size); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n += unpack(&buf[n], "qqqq", Err bitreich.org 70 i+ &hdr->reserved[0], Err bitreich.org 70 i+ &hdr->reserved[1], Err bitreich.org 70 i+ &hdr->reserved[2], Err bitreich.org 70 i+ &hdr->reserved[3]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n += unpack(&buf[n], "qqqqqq", Err bitreich.org 70 i+ &hdr->st.orig_size, Err bitreich.org 70 i+ &hdr->st.comp_size, Err bitreich.org 70 i+ &hdr->st.dedup_size, Err bitreich.org 70 i+ &hdr->st.min_blk_size, Err bitreich.org 70 i+ &hdr->st.max_blk_size, Err bitreich.org 70 i+ &hdr->st.nr_blks); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n += unpack(&buf[n], "qqqqqq", Err bitreich.org 70 i+ &hdr->st.reserved[0], Err bitreich.org 70 i+ &hdr->st.reserved[1], Err bitreich.org 70 i+ &hdr->st.reserved[2], Err bitreich.org 70 i+ &hdr->st.reserved[3], Err bitreich.org 70 i+ &hdr->st.reserved[4], Err bitreich.org 70 i+ &hdr->st.reserved[5]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(n == SNAPHDR_LEN); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+write_snaphdr(int fd, struct snapshot_hdr *hdr) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint8_t buf[SNAPHDR_LEN]; Err bitreich.org 70 i+ int n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ n = pack(buf, "qqq", Err bitreich.org 70 i+ hdr->flags, Err bitreich.org 70 i+ hdr->nr_snapshots, Err bitreich.org 70 i+ hdr->store_size); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n += pack(&buf[n], "qqqq", Err bitreich.org 70 i+ hdr->reserved[0], Err bitreich.org 70 i+ hdr->reserved[1], Err bitreich.org 70 i+ hdr->reserved[2], Err bitreich.org 70 i+ hdr->reserved[3]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n += pack(&buf[n], "qqqqqq", Err bitreich.org 70 i+ hdr->st.orig_size, Err bitreich.org 70 i+ hdr->st.comp_size, Err bitreich.org 70 i+ hdr->st.dedup_size, Err bitreich.org 70 i+ hdr->st.min_blk_size, Err bitreich.org 70 i+ hdr->st.max_blk_size, Err bitreich.org 70 i+ hdr->st.nr_blks); Err bitreich.org 70 i+ Err bitreich.org 70 i+ n += pack(&buf[n], "qqqqqq", Err bitreich.org 70 i+ hdr->st.reserved[0], Err bitreich.org 70 i+ hdr->st.reserved[1], Err bitreich.org 70 i+ hdr->st.reserved[2], Err bitreich.org 70 i+ hdr->st.reserved[3], Err bitreich.org 70 i+ hdr->st.reserved[4], Err bitreich.org 70 i+ hdr->st.reserved[5]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(n == SNAPHDR_LEN); Err bitreich.org 70 i+ xwrite(fd, buf, n); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+read_blk_desc(int fd, struct blk_desc *desc) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint8_t buf[BLKDESC_LEN]; Err bitreich.org 70 i+ char fmt[BUFSIZ]; Err bitreich.org 70 i+ int n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (xread(fd, buf, sizeof(buf)) == 0) Err bitreich.org 70 i+ errx(1, "read_blk_desc: unexpected EOF"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(fmt, sizeof(fmt), "'%dqq", MDSIZE); Err bitreich.org 70 i+ n = unpack(buf, fmt, Err bitreich.org 70 i+ desc->md, Err bitreich.org 70 i+ &desc->offset, Err bitreich.org 70 i+ &desc->size); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(n == BLKDESC_LEN); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+write_blk_desc(int fd, struct blk_desc *desc) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint8_t buf[BLKDESC_LEN]; Err bitreich.org 70 i+ char fmt[BUFSIZ]; Err bitreich.org 70 i+ int n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(fmt, sizeof(fmt), "'%dqq", MDSIZE); Err bitreich.org 70 i+ n = pack(buf, fmt, Err bitreich.org 70 i+ desc->md, Err bitreich.org 70 i+ desc->offset, Err bitreich.org 70 i+ desc->size); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(n == BLKDESC_LEN); Err bitreich.org 70 i+ xwrite(fd, buf, n); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+read_snapshot(int fd, struct snapshot *snap) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint8_t buf[SNAPSHOT_LEN]; Err bitreich.org 70 i+ char fmt[BUFSIZ]; Err bitreich.org 70 i+ int n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (xread(fd, buf, sizeof(buf)) == 0) Err bitreich.org 70 i+ errx(1, "read_blk_desc: unexpected EOF"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(fmt, sizeof(fmt), "q'%d'%dq", MSGSIZE, MDSIZE); Err bitreich.org 70 i+ n = unpack(buf, fmt, Err bitreich.org 70 i+ &snap->size, Err bitreich.org 70 i+ snap->msg, Err bitreich.org 70 i+ snap->md, Err bitreich.org 70 i+ &snap->nr_blk_descs); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(n == SNAPSHOT_LEN); Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+read_snapshot_descs(int fd, struct snapshot *snap) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint64_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; i < snap->nr_blk_descs; i++) Err bitreich.org 70 i+ read_blk_desc(fd, &snap->blk_desc[i]); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+write_snapshot(int fd, struct snapshot *snap) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint8_t buf[SNAPSHOT_LEN]; Err bitreich.org 70 i+ char fmt[BUFSIZ]; Err bitreich.org 70 i+ int n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(fmt, sizeof(fmt), "q'%d'%dq", MSGSIZE, MDSIZE); Err bitreich.org 70 i+ Err bitreich.org 70 i+ snap->size = SNAPHDR_LEN; Err bitreich.org 70 i+ snap->size += snap->nr_blk_descs * BLKDESC_LEN; Err bitreich.org 70 i+ n = pack(buf, fmt, Err bitreich.org 70 i+ snap->size, Err bitreich.org 70 i+ snap->msg, Err bitreich.org 70 i+ snap->md, Err bitreich.org 70 i+ snap->nr_blk_descs); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(n == SNAPSHOT_LEN); Err bitreich.org 70 i+ xwrite(fd, buf, n); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+write_snapshot_blk_descs(int fd, struct snapshot *snap) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint64_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; i < snap->nr_blk_descs; i++) Err bitreich.org 70 i+ write_blk_desc(fd, &snap->blk_desc[i]); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+read_cache_entry(int fd, struct cache_entry *cache_entry) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint8_t buf[CACHE_ENTRY_LEN]; Err bitreich.org 70 i+ char fmt[BUFSIZ]; Err bitreich.org 70 i+ int n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (xread(fd, buf, sizeof(buf)) == 0) Err bitreich.org 70 i+ errx(1, "read_blk_desc: unexpected EOF"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(fmt, sizeof(fmt), "'%dqq", MDSIZE); Err bitreich.org 70 i+ n = unpack(buf, fmt, Err bitreich.org 70 i+ cache_entry->md, Err bitreich.org 70 i+ &cache_entry->offset, Err bitreich.org 70 i+ &cache_entry->size); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(n == CACHE_ENTRY_LEN); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+write_cache_entry(int fd, struct cache_entry *cache_entry) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ uint8_t buf[CACHE_ENTRY_LEN]; Err bitreich.org 70 i+ char fmt[BUFSIZ]; Err bitreich.org 70 i+ int n; Err bitreich.org 70 i+ Err bitreich.org 70 i+ snprintf(fmt, sizeof(fmt), "'%dqq", MDSIZE); Err bitreich.org 70 i+ n = pack(buf, fmt, Err bitreich.org 70 i+ cache_entry->md, Err bitreich.org 70 i+ cache_entry->offset, Err bitreich.org 70 i+ cache_entry->size); Err bitreich.org 70 i+ Err bitreich.org 70 i+ assert(n == CACHE_ENTRY_LEN); Err bitreich.org 70 i+ xwrite(fd, buf, n); Err bitreich.org 70 i+} Err bitreich.org 70 .