Annotation of libaitsync/src/patch.c, revision 1.1.1.1
1.1 misho 1: #include "global.h"
2: #include "patch.h"
3:
4:
5: int sync_buildPatch(void * __restrict buf, u_int buflen, struct tagPiece ** __restrict arr)
6: {
7: void *pos;
8: sync_chunk_t *prefix, *suffix;
9: struct tagPiece *a = *arr;
10: register int i;
11: u_int len = buflen;
12:
13: if (!buf || !arr)
14: return -1;
15:
16: a = malloc(sizeof(struct tagPiece));
17: if (!a) {
18: SETERR;
19: return -1;
20: } else
21: memset(a, 0, sizeof(struct tagPiece));
22:
23: for (pos = buf, i = 0; len && pos < buf + buflen; i++) {
24: a = realloc(a, sizeof(struct tagPiece) * (i + 2));
25: if (!a) {
26: SETERR;
27: return -1;
28: } else {
29: memset(&a[i + 1], 0, sizeof(struct tagPiece));
30: // printf("%d.prefix_pos=%p len=%d\n", i, pos, len);
31:
32: // prefix chunk
33: prefix = pos;
34: if (prefix->sc_magic != DLTSYNC_MAGIC) {
35: if (a) {
36: free(a);
37: a = NULL;
38: }
39: return -1;
40: } else {
41: a[i].pfx = prefix;
42: pos += sizeof(sync_chunk_t);
43: len -= sizeof(sync_chunk_t);
44: }
45: // printf("%d.prefix=%p pos=%p len=%d\n", i, a[i].pfx, pos, len);
46:
47: // data
48: if (!len) {
49: if (a) {
50: free(a);
51: a = NULL;
52: }
53: return -1;
54: } else {
55: a[i].buf = pos;
56: pos += prefix->sc_len;
57: len -= prefix->sc_len;
58: }
59: // printf("%d.data=%p pos=%p len=%d\n", i, a[i].buf, pos, len);
60:
61: // if find sync chunk
62: if (len) {
63: suffix = pos;
64: if (SIGSYNC_MAGIC == suffix->sc_magic) {
65: a[i].sfx = suffix;
66: pos += sizeof(sync_chunk_t);
67: len -= sizeof(sync_chunk_t);
68: }
69: // printf("%d.data=%p pos=%p len=%d\n", i, a[i].sfx, pos, len);
70: }
71: }
72: }
73:
74: *arr = a;
75: return i;
76: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>