File:  [ELWIX - Embedded LightWeight unIX -] / libaitsync / src / patch.c
Revision 1.5: download - view: text, annotated - select for diffs - revision graph
Tue Feb 4 16:58:17 2014 UTC (10 years, 4 months ago) by misho
Branches: MAIN
CVS tags: sync2_3, sync2_2, SYNC2_2, SYNC2_1, HEAD
version 2.1

    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: patch.c,v 1.5 2014/02/04 16:58:17 misho Exp $
    7: *
    8: **************************************************************************
    9: The ELWIX and AITNET software is distributed under the following
   10: terms:
   11: 
   12: All of the documentation and software included in the ELWIX and AITNET
   13: Releases is copyrighted by ELWIX - Sofia/Bulgaria <info@elwix.org>
   14: 
   15: Copyright 2004 - 2014
   16: 	by Michael Pounov <misho@elwix.org>.  All rights reserved.
   17: 
   18: Redistribution and use in source and binary forms, with or without
   19: modification, are permitted provided that the following conditions
   20: are met:
   21: 1. Redistributions of source code must retain the above copyright
   22:    notice, this list of conditions and the following disclaimer.
   23: 2. Redistributions in binary form must reproduce the above copyright
   24:    notice, this list of conditions and the following disclaimer in the
   25:    documentation and/or other materials provided with the distribution.
   26: 3. All advertising materials mentioning features or use of this software
   27:    must display the following acknowledgement:
   28: This product includes software developed by Michael Pounov <misho@elwix.org>
   29: ELWIX - Embedded LightWeight unIX and its contributors.
   30: 4. Neither the name of AITNET nor the names of its contributors
   31:    may be used to endorse or promote products derived from this software
   32:    without specific prior written permission.
   33: 
   34: THIS SOFTWARE IS PROVIDED BY AITNET AND CONTRIBUTORS ``AS IS'' AND
   35: ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   36: IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   37: ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   38: FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   39: DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   40: OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   41: HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   42: LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   43: OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   44: SUCH DAMAGE.
   45: */
   46: #include "global.h"
   47: #include "patch.h"
   48: 
   49: 
   50: /*
   51:  * sync_buildPatch() - Build patch from buffer to pieces array
   52:  *
   53:  * @buf = Input buffer
   54:  * @buflen = Buffer length
   55:  * @arr = Array from pieces
   56:  * return: -1 error, != -1 num pieces
   57: */
   58: int
   59: sync_buildPatch(void * __restrict buf, u_int buflen, struct tagPiece ** __restrict arr)
   60: {
   61: 	void *pos;
   62: 	sync_chunk_t *prefix, *suffix;
   63: 	struct tagPiece *a = *arr;
   64: 	register int i;
   65: 	u_int len = buflen;
   66: 
   67: 	if (!buf || !arr)
   68: 		return -1;
   69: 
   70: 	a = e_malloc(sizeof(struct tagPiece));
   71: 	if (!a) {
   72: 		LOGERR;
   73: 		return -1;
   74: 	} else
   75: 		memset(a, 0, sizeof(struct tagPiece));
   76: 
   77: 	for (pos = buf, i = 0; len && pos < buf + buflen; i++) {
   78: 		a = e_realloc(a, sizeof(struct tagPiece) * (i + 2));
   79: 		if (!a) {
   80: 			LOGERR;
   81: 			return -1;
   82: 		} else {
   83: 			memset(&a[i + 1], 0, sizeof(struct tagPiece));
   84: #if 0
   85: 			printf("start: %d.prefix_pos=%p len=%d\n", i, pos, len);
   86: #endif
   87: 
   88: 			/* prefix chunk */
   89: 			prefix = pos;
   90: 			if (prefix->sc_magic != DLTSYNC_MAGIC) {
   91: 				if (a) {
   92: 					e_free(a);
   93: 					a = NULL;
   94: 				}
   95: 				return -1;
   96: 			} else {
   97: 				a[i].pfx = prefix;
   98: 				pos += sizeof(sync_chunk_t);
   99: 				len -= sizeof(sync_chunk_t);
  100: 			}
  101: #if 0
  102: 			printf("prefix: %d.prefix=%p pos=%p len=%d\n", i, a[i].pfx, pos, len);
  103: #endif
  104: 
  105: 			/* data */
  106: 			if (!len) {
  107: 				if (a) {
  108: 					e_free(a);
  109: 					a = NULL;
  110: 				}
  111: 				return -1;
  112: 			} else {
  113: 				a[i].buf = pos;
  114: 				pos += prefix->sc_len;
  115: 				len -= prefix->sc_len;
  116: 			}
  117: #if 0
  118: 			printf("data: %d.data=%p pos=%p len=%d\n", i, a[i].buf, pos, len);
  119: #endif
  120: 
  121: 			/* if find sync chunk */
  122: 			if (len) {
  123: 				suffix = pos;
  124: 				if (SIGSYNC_MAGIC == suffix->sc_magic) {
  125: 					a[i].sfx = suffix;
  126: 					pos += sizeof(sync_chunk_t);
  127: 					len -= sizeof(sync_chunk_t);
  128: 				}
  129: #if 0
  130: 				printf("suffix: %d.data=%p pos=%p len=%d\n", i, a[i].sfx, pos, len);
  131: #endif
  132: 			}
  133: 		}
  134: 	}
  135: 
  136: 	*arr = a;
  137: 	return i;
  138: }

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