#include "global.h" #include "patch.h" int sync_buildPatch(void * __restrict buf, u_int buflen, struct tagPiece ** __restrict arr) { void *pos; sync_chunk_t *prefix, *suffix; struct tagPiece *a = *arr; register int i; u_int len = buflen; if (!buf || !arr) return -1; a = malloc(sizeof(struct tagPiece)); if (!a) { SETERR; return -1; } else memset(a, 0, sizeof(struct tagPiece)); for (pos = buf, i = 0; len && pos < buf + buflen; i++) { a = realloc(a, sizeof(struct tagPiece) * (i + 2)); if (!a) { SETERR; return -1; } else { memset(&a[i + 1], 0, sizeof(struct tagPiece)); // printf("%d.prefix_pos=%p len=%d\n", i, pos, len); // prefix chunk prefix = pos; if (prefix->sc_magic != DLTSYNC_MAGIC) { if (a) { free(a); a = NULL; } return -1; } else { a[i].pfx = prefix; pos += sizeof(sync_chunk_t); len -= sizeof(sync_chunk_t); } // printf("%d.prefix=%p pos=%p len=%d\n", i, a[i].pfx, pos, len); // data if (!len) { if (a) { free(a); a = NULL; } return -1; } else { a[i].buf = pos; pos += prefix->sc_len; len -= prefix->sc_len; } // printf("%d.data=%p pos=%p len=%d\n", i, a[i].buf, pos, len); // if find sync chunk if (len) { suffix = pos; if (SIGSYNC_MAGIC == suffix->sc_magic) { a[i].sfx = suffix; pos += sizeof(sync_chunk_t); len -= sizeof(sync_chunk_t); } // printf("%d.data=%p pos=%p len=%d\n", i, a[i].sfx, pos, len); } } } *arr = a; return i; }