/ payloads / libpayload / include / archive.h
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