archive.h
1 /* 2 * 3 * Copyright (C) 2015 The ChromiumOS Authors. All rights reserved. 4 * written by Daisuke Nojiri <dnojiri@chromium.org> 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright 12 * notice, this list of conditions and the following disclaimer in the 13 * documentation and/or other materials provided with the distribution. 14 * 3. The name of the author may not be used to endorse or promote products 15 * derived from this software without specific prior written permission. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 #ifndef __ARCHIVE_H 31 #define __ARCHIVE_H 32 33 #include <stdint.h> 34 35 /* 36 * Archive file layout: 37 * 38 * +----------------------------------+ 39 * | root header | 40 * +----------------------------------+ 41 * | file_header[0] | 42 * +----------------------------------+ 43 * | file_header[1] | 44 * +----------------------------------+ 45 * | ... | 46 * +----------------------------------+ 47 * | file_header[count-1] | 48 * +----------------------------------+ 49 * | file(0) content | 50 * +----------------------------------+ 51 * | file(1) content | 52 * +----------------------------------+ 53 * | ... | 54 * +----------------------------------+ 55 * | file(count-1) content | 56 * +----------------------------------+ 57 */ 58 59 #define VERSION 0 60 #define CBAR_MAGIC "CBAR" 61 #define NAME_LENGTH 32 62 63 /* Root header */ 64 struct directory { 65 char magic[4]; 66 uint32_t version; /* version of the header. little endian */ 67 uint32_t size; /* total size of archive. little endian */ 68 uint32_t count; /* number of files. little endian */ 69 }; 70 71 /* File header */ 72 struct dentry { 73 /* file name. null-terminated if shorter than NAME_LENGTH */ 74 char name[NAME_LENGTH]; 75 /* file offset from the root header. little endian */ 76 uint32_t offset; 77 /* file size. little endian */ 78 uint32_t size; 79 }; 80 81 static inline struct dentry *get_first_dentry(const struct directory *dir) 82 { 83 return (struct dentry *)(dir + 1); 84 } 85 86 static inline uint32_t get_first_offset(const struct directory *dir) 87 { 88 return sizeof(struct directory) + sizeof(struct dentry) * dir->count; 89 } 90 91 #endif