1 /*- 2 * Copyright 2003,2004 Colin Percival 3 * All rights reserved 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted providing that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 15 * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 16 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 17 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY 18 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, 22 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING 23 * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 24 * POSSIBILITY OF SUCH DAMAGE. 25 * 26 * Changelog: 27 * 2005-04-26 - Define the header as a C structure, add a CRC32 checksum to 28 * the header, and make all the types 32-bit. 29 * --Benjamin Smedberg <benjamin@smedbergs.us> 30 */ 31 32 #ifndef bspatch_h__ 33 #define bspatch_h__ 34 35 #include <stdint.h> 36 #include <stdio.h> 37 38 typedef struct MBSPatchHeader_ 39 { 40 /* "MBDIFF10" */ 41 char tag[8]; 42 43 /* Length of the file to be patched */ 44 uint32_t slen; 45 46 /* CRC32 of the file to be patched */ 47 uint32_t scrc32; 48 49 /* Length of the result file */ 50 uint32_t dlen; 51 52 /* Length of the control block in bytes */ 53 uint32_t cblen; 54 55 /* Length of the diff block in bytes */ 56 uint32_t difflen; 57 58 /* Length of the extra block in bytes */ 59 uint32_t extralen; 60 61 /* Control block (MBSPatchTriple[]) */ 62 /* Diff block (binary data) */ 63 /* Extra block (binary data) */ 64 } MBSPatchHeader; 65 66 /** 67 * Read the header of a patch file into the MBSPatchHeader structure. 68 * 69 * @param fd Must have been opened for reading, and be at the beginning 70 * of the file. 71 */ 72 int MBS_ReadHeader(FILE* file, MBSPatchHeader *header); 73 74 /** 75 * Apply a patch. This method does not validate the checksum of the original 76 * file: client code should validate the checksum before calling this method. 77 * 78 * @param patchfd Must have been processed by MBS_ReadHeader 79 * @param fbuffer The original file read into a memory buffer of length 80 * header->slen. 81 * @param filefd Must have been opened for writing. Should be truncated 82 * to header->dlen if it is an existing file. The offset 83 * should be at the beginning of the file. 84 */ 85 int MBS_ApplyPatch(const MBSPatchHeader *header, FILE* patchFile, 86 unsigned char *fbuffer, FILE* file); 87 88 typedef struct MBSPatchTriple_ 89 { 90 uint32_t x; /* add x bytes from oldfile to x bytes from the diff block */ 91 uint32_t y; /* copy y bytes from the extra block */ 92 int32_t z; /* seek forwards in oldfile by z bytes */ 93 } MBSPatchTriple; 94 95 #endif // bspatch_h__ 96