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 /* "MBDIFF10" */ 40 char tag[8]; 41 42 /* Length of the file to be patched */ 43 uint32_t slen; 44 45 /* CRC32 of the file to be patched */ 46 uint32_t scrc32; 47 48 /* Length of the result file */ 49 uint32_t dlen; 50 51 /* Length of the control block in bytes */ 52 uint32_t cblen; 53 54 /* Length of the diff block in bytes */ 55 uint32_t difflen; 56 57 /* Length of the extra block in bytes */ 58 uint32_t extralen; 59 60 /* Control block (MBSPatchTriple[]) */ 61 /* Diff block (binary data) */ 62 /* Extra block (binary data) */ 63 } MBSPatchHeader; 64 65 /** 66 * Read the header of a patch file into the MBSPatchHeader structure. 67 * 68 * @param fd Must have been opened for reading, and be at the beginning 69 * of the file. 70 */ 71 int MBS_ReadHeader(FILE* file, MBSPatchHeader* header); 72 73 /** 74 * Apply a patch. This method does not validate the checksum of the original 75 * file: client code should validate the checksum before calling this method. 76 * 77 * @param patchfd Must have been processed by MBS_ReadHeader 78 * @param fbuffer The original file read into a memory buffer of length 79 * header->slen. 80 * @param filefd Must have been opened for writing. Should be truncated 81 * to header->dlen if it is an existing file. The offset 82 * should be at the beginning of the file. 83 */ 84 int MBS_ApplyPatch(const MBSPatchHeader* header, FILE* patchFile, 85 unsigned char* fbuffer, FILE* file); 86 87 typedef struct MBSPatchTriple_ { 88 uint32_t x; /* add x bytes from oldfile to x bytes from the diff block */ 89 uint32_t y; /* copy y bytes from the extra block */ 90 int32_t z; /* seek forwards in oldfile by z bytes */ 91 } MBSPatchTriple; 92 93 #endif // bspatch_h__ 94