]> git.cameronkatri.com Git - trustcache.git/blob - create.c
Unify writing of trustcache to new function
[trustcache.git] / create.c
1 /*-
2 * SPDX-License-Identifier: BSD-2-Clause
3 *
4 * Copyright (c) 2022 Cameron Katri. All rights reserved.
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 *
15 * THIS SOFTWARE IS PROVIDED BY CAMERON KATRI AND CONTRIBUTORS ``AS IS'' AND
16 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
17 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
18 * ARE DISCLAIMED. IN NO EVENT SHALL CAMERON KATRI OR CONTRIBUTORS BE LIABLE
19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
25 * SUCH DAMAGE.
26 */
27
28 #include <errno.h>
29 #include <getopt.h>
30 #include <stdbool.h>
31 #include <stdio.h>
32 #include <stdlib.h>
33 #include <string.h>
34 #include <unistd.h>
35
36 #include "trustcache.h"
37 #include "uuid/uuid.h"
38
39 int
40 tccreate(int argc, char **argv)
41 {
42 struct trust_cache cache = {
43 .version = 1,
44 .uuid = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0},
45 .num_entries = 0,
46 .entries = NULL,
47 }, append = {};
48
49 uuid_generate(cache.uuid);
50
51 int ch;
52 while ((ch = getopt(argc, argv, "u:v:")) != -1) {
53 switch (ch) {
54 case 'u':
55 if (uuid_parse(optarg, cache.uuid) != 0)
56 fprintf(stderr, "Failed to parse %s as a UUID\n", optarg);
57 break;
58 case 'v':
59 if (strlen(optarg) != 1 || (optarg[0] != '0' && optarg[0] != '1')) {
60 fprintf(stderr, "Unsupported trustcache version %s\n", optarg);
61 return 1;
62 }
63 if (optarg[0] == '0')
64 cache.version = 0;
65 else if (optarg[0] == '1')
66 cache.version = 1;
67 break;
68 }
69 }
70
71 argc -= optind;
72 argv += optind;
73
74 if (argc == 0)
75 return -1;
76
77 for (int i = 1; i < argc; i++) {
78 append = cache_from_tree(argv[i], cache.version);
79 if (append.version == 0) {
80 if ((cache.hashes = realloc(cache.hashes, sizeof(trust_cache_hash0) *
81 (cache.num_entries + append.num_entries))) == NULL)
82 exit(1);
83 for (uint32_t j = 0; j < append.num_entries; j++) {
84 memcpy(cache.hashes[cache.num_entries + j], append.hashes[j], CS_CDHASH_LEN);
85 }
86 } else if (append.version == 1) {
87 if ((cache.entries = realloc(cache.entries, sizeof(struct trust_cache_entry1) *
88 (cache.num_entries + append.num_entries))) == NULL)
89 exit(1);
90 for (uint32_t j = 0; j < append.num_entries; j++) {
91 cache.entries[cache.num_entries + j].hash_type = append.entries[j].hash_type;
92 cache.entries[cache.num_entries + j].flags = append.entries[j].flags;
93 memcpy(cache.entries[cache.num_entries + j].cdhash, append.entries[j].cdhash, CS_CDHASH_LEN);
94 }
95 }
96 free(append.hashes);
97 cache.num_entries += append.num_entries;
98 }
99
100 if (cache.version == 1)
101 qsort(cache.entries, cache.num_entries, sizeof(*cache.entries), ent_cmp);
102 else if (cache.version == 0)
103 qsort(cache.hashes, cache.num_entries, sizeof(*cache.hashes), hash_cmp);
104
105 if (writetrustcache(cache, argv[0]) == -1)
106 return 1;
107
108 free(cache.entries);
109
110 return 0;
111 }