Annotation of libaitsync/src/patch.c, revision 1.1.1.1.2.1

1.1.1.1.2.1! misho       1: /*************************************************************************
        !             2: * (C) 2010 AITNET ltd - Sofia/Bulgaria - <misho@aitbg.com>
        !             3: *  by Michael Pounov <misho@openbsd-bg.org>
        !             4: *
        !             5: * $Author: misho $
        !             6: * $Id: aitsync.c,v 1.1.1.1 2010/03/24 16:00:15 misho Exp $
        !             7: *
        !             8: *************************************************************************/
1.1       misho       9: #include "global.h"
                     10: #include "patch.h"
                     11: 
                     12: 
                     13: int sync_buildPatch(void * __restrict buf, u_int buflen, struct tagPiece ** __restrict arr)
                     14: {
                     15:        void *pos;
                     16:        sync_chunk_t *prefix, *suffix;
                     17:        struct tagPiece *a = *arr;
                     18:        register int i;
                     19:        u_int len = buflen;
                     20: 
                     21:        if (!buf || !arr)
                     22:                return -1;
                     23: 
                     24:        a = malloc(sizeof(struct tagPiece));
                     25:        if (!a) {
                     26:                SETERR;
                     27:                return -1;
                     28:        } else
                     29:                memset(a, 0, sizeof(struct tagPiece));
                     30: 
                     31:        for (pos = buf, i = 0; len && pos < buf + buflen; i++) {
                     32:                a = realloc(a, sizeof(struct tagPiece) * (i + 2));
                     33:                if (!a) {
                     34:                        SETERR;
                     35:                        return -1;
                     36:                } else {
                     37:                        memset(&a[i + 1], 0, sizeof(struct tagPiece));
                     38:                        // printf("%d.prefix_pos=%p len=%d\n", i, pos, len);
                     39: 
                     40:                        // prefix chunk
                     41:                        prefix = pos;
                     42:                        if (prefix->sc_magic != DLTSYNC_MAGIC) {
                     43:                                if (a) {
                     44:                                        free(a);
                     45:                                        a = NULL;
                     46:                                }
                     47:                                return -1;
                     48:                        } else {
                     49:                                a[i].pfx = prefix;
                     50:                                pos += sizeof(sync_chunk_t);
                     51:                                len -= sizeof(sync_chunk_t);
                     52:                        }
                     53:                        // printf("%d.prefix=%p pos=%p len=%d\n", i, a[i].pfx, pos, len);
                     54: 
                     55:                        // data
                     56:                        if (!len) {
                     57:                                if (a) {
                     58:                                        free(a);
                     59:                                        a = NULL;
                     60:                                }
                     61:                                return -1;
                     62:                        } else {
                     63:                                a[i].buf = pos;
                     64:                                pos += prefix->sc_len;
                     65:                                len -= prefix->sc_len;
                     66:                        }
                     67:                        // printf("%d.data=%p pos=%p len=%d\n", i, a[i].buf, pos, len);
                     68: 
                     69:                        // if find sync chunk
                     70:                        if (len) {
                     71:                                suffix = pos;
                     72:                                if (SIGSYNC_MAGIC == suffix->sc_magic) {
                     73:                                        a[i].sfx = suffix;
                     74:                                        pos += sizeof(sync_chunk_t);
                     75:                                        len -= sizeof(sync_chunk_t);
                     76:                                }
                     77:                                // printf("%d.data=%p pos=%p len=%d\n", i, a[i].sfx, pos, len);
                     78:                        }
                     79:                }
                     80:        }
                     81: 
                     82:        *arr = a;
                     83:        return i;
                     84: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>