Annotation of libaitsync/src/patch.c, revision 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>