ttypes.c - dedup - data deduplication program HTML git clone git://bitreich.org/dedup/ git://hg6vgqziawt5s4dj.onion/dedup/ DIR Log DIR Files DIR Refs DIR Tags DIR README DIR LICENSE --- ttypes.c (3674B) --- 1 #include <sys/types.h> 2 3 #include <assert.h> 4 #include <err.h> 5 #include <stdio.h> 6 #include <stdint.h> 7 #include <stdlib.h> 8 9 #include "blake2.h" 10 #include "dedup.h" 11 12 void 13 read_snap_hdr(int fd, struct snap_hdr *hdr) 14 { 15 uint8_t buf[SNAP_HDR_SIZE]; 16 int n; 17 18 if (xread(fd, buf, sizeof(buf)) == 0) 19 errx(1, "%s: unexpected EOF", __func__); 20 21 n = unpack(buf, "qqq", 22 &hdr->flags, 23 &hdr->size, 24 &hdr->nr_snaps); 25 26 n += unpack(&buf[n], "qqqqqq", 27 &hdr->st.orig_size, 28 &hdr->st.compr_size, 29 &hdr->st.dedup_size, 30 &hdr->st.min_blk_size, 31 &hdr->st.max_blk_size, 32 &hdr->st.nr_blks); 33 34 n += unpack(&buf[n], "qqqq", 35 &hdr->st.reserved[0], 36 &hdr->st.reserved[1], 37 &hdr->st.reserved[2], 38 &hdr->st.reserved[3]); 39 40 assert(n == SNAP_HDR_SIZE); 41 } 42 43 void 44 write_snap_hdr(int fd, struct snap_hdr *hdr) 45 { 46 uint8_t buf[SNAP_HDR_SIZE]; 47 int n; 48 49 n = pack(buf, "qqq", 50 hdr->flags, 51 hdr->size, 52 hdr->nr_snaps); 53 54 n += pack(&buf[n], "qqqqqq", 55 hdr->st.orig_size, 56 hdr->st.compr_size, 57 hdr->st.dedup_size, 58 hdr->st.min_blk_size, 59 hdr->st.max_blk_size, 60 hdr->st.nr_blks); 61 62 n += pack(&buf[n], "qqqq", 63 hdr->st.reserved[0], 64 hdr->st.reserved[1], 65 hdr->st.reserved[2], 66 hdr->st.reserved[3]); 67 68 assert(n == SNAP_HDR_SIZE); 69 xwrite(fd, buf, n); 70 } 71 72 void 73 read_blk_hdr(int fd, struct blk_hdr *hdr) 74 { 75 uint8_t buf[BLK_HDR_SIZE]; 76 int n; 77 78 if (xread(fd, buf, sizeof(buf)) == 0) 79 errx(1, "%s: unexpected EOF", __func__); 80 81 n = unpack(buf, "qq", 82 &hdr->flags, 83 &hdr->size); 84 85 assert(n == BLK_HDR_SIZE); 86 } 87 88 void 89 write_blk_hdr(int fd, struct blk_hdr *hdr) 90 { 91 uint8_t buf[BLK_HDR_SIZE]; 92 int n; 93 94 n = pack(buf, "qq", 95 hdr->flags, 96 hdr->size); 97 98 assert(n == BLK_HDR_SIZE); 99 xwrite(fd, buf, n); 100 } 101 102 void 103 read_blk_desc(int fd, struct blk_desc *desc) 104 { 105 uint8_t buf[BLK_DESC_SIZE]; 106 char fmt[BUFSIZ]; 107 int n; 108 109 if (xread(fd, buf, sizeof(buf)) == 0) 110 errx(1, "%s: unexpected EOF", __func__); 111 112 snprintf(fmt, sizeof(fmt), "'%dqq", MD_SIZE); 113 n = unpack(buf, fmt, 114 desc->md, 115 &desc->offset, 116 &desc->size); 117 118 assert(n == BLK_DESC_SIZE); 119 } 120 121 void 122 write_blk_desc(int fd, struct blk_desc *desc) 123 { 124 uint8_t buf[BLK_DESC_SIZE]; 125 char fmt[BUFSIZ]; 126 int n; 127 128 snprintf(fmt, sizeof(fmt), "'%dqq", MD_SIZE); 129 n = pack(buf, fmt, 130 desc->md, 131 desc->offset, 132 desc->size); 133 134 assert(n == BLK_DESC_SIZE); 135 xwrite(fd, buf, n); 136 } 137 138 void 139 read_snap(int fd, struct snap *snap) 140 { 141 uint8_t buf[SNAPSHOT_SIZE]; 142 char fmt[BUFSIZ]; 143 int n; 144 145 if (xread(fd, buf, sizeof(buf)) == 0) 146 errx(1, "%s: unexpected EOF", __func__); 147 148 snprintf(fmt, sizeof(fmt), "q'%d'%dq", MSG_SIZE, MD_SIZE); 149 n = unpack(buf, fmt, 150 &snap->size, 151 snap->msg, 152 snap->md, 153 &snap->nr_blk_descs); 154 155 assert(n == SNAPSHOT_SIZE); 156 }; 157 158 void 159 read_snap_descs(int fd, struct snap *snap) 160 { 161 uint64_t i; 162 163 for (i = 0; i < snap->nr_blk_descs; i++) 164 read_blk_desc(fd, &snap->blk_desc[i]); 165 } 166 167 void 168 write_snap(int fd, struct snap *snap) 169 { 170 uint8_t buf[SNAPSHOT_SIZE]; 171 char fmt[BUFSIZ]; 172 int n; 173 174 snprintf(fmt, sizeof(fmt), "q'%d'%dq", MSG_SIZE, MD_SIZE); 175 n = pack(buf, fmt, 176 snap->size, 177 snap->msg, 178 snap->md, 179 snap->nr_blk_descs); 180 181 assert(n == SNAPSHOT_SIZE); 182 xwrite(fd, buf, n); 183 } 184 185 void 186 write_snap_blk_descs(int fd, struct snap *snap) 187 { 188 uint64_t i; 189 190 for (i = 0; i < snap->nr_blk_descs; i++) 191 write_blk_desc(fd, &snap->blk_desc[i]); 192 }