1 /* Subpart directory header version 1 support */
2 /* SPDX-License-Identifier: GPL-2.0-only */
3
4 #include <sys/types.h>
5
6 #include "cse_serger.h"
7
8 struct subpart_hdr {
9 uint32_t signature; /* SUBPART_SIGNATURE */
10 uint32_t count;
11 uint8_t hdr_version; /* Header version = 1 */
12 uint8_t entry_version; /* Entry version = 1 */
13 uint8_t length;
14 uint8_t checksum;
15 uint8_t name[4];
16 } __packed;
17
subpart_hdr_print(const subpart_hdr_ptr ptr)18 static void subpart_hdr_print(const subpart_hdr_ptr ptr)
19 {
20 const struct subpart_hdr *hdr = ptr;
21
22 printf("%-25s %.4s\n", "Signature", (const char *)&hdr->signature);
23 printf("%-25s %-25d\n", "Count", hdr->count);
24 printf("%-25s %-25d\n", "Header Version", hdr->hdr_version);
25 printf("%-25s %-25d\n", "Entry Version", hdr->entry_version);
26 printf("%-25s 0x%-23x\n", "Header Length", hdr->length);
27 printf("%-25s 0x%-23x\n", "Checksum", hdr->checksum);
28 printf("%-25s ", "Name");
29 for (size_t i = 0; i < sizeof(hdr->name); i++)
30 printf("%c", hdr->name[i]);
31 printf("\n");
32 }
33
subpart_hdr_read(struct buffer * buff)34 static subpart_hdr_ptr subpart_hdr_read(struct buffer *buff)
35 {
36 struct subpart_hdr *hdr = malloc(sizeof(*hdr));
37
38 if (!hdr)
39 return NULL;
40
41 READ_MEMBER(buff, hdr->signature);
42 READ_MEMBER(buff, hdr->count);
43 READ_MEMBER(buff, hdr->hdr_version);
44 READ_MEMBER(buff, hdr->entry_version);
45 READ_MEMBER(buff, hdr->length);
46 READ_MEMBER(buff, hdr->checksum);
47 READ_MEMBER(buff, hdr->name);
48
49 return hdr;
50 }
51
subpart_get_count(const subpart_hdr_ptr ptr)52 static size_t subpart_get_count(const subpart_hdr_ptr ptr)
53 {
54 const struct subpart_hdr *hdr = ptr;
55
56 return hdr->count;
57 }
58
subpart_hdr_free(subpart_hdr_ptr ptr)59 static void subpart_hdr_free(subpart_hdr_ptr ptr)
60 {
61 free(ptr);
62 }
63
64 const struct subpart_hdr_ops subpart_hdr_1_ops = {
65 .read = subpart_hdr_read,
66 .print = subpart_hdr_print,
67 .get_entry_count = subpart_get_count,
68 .free = subpart_hdr_free,
69 };
70