]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/analyze/analyze-verify.c
sd-boot+bootctl: invert order of entries w/o sort-key
[thirdparty/systemd.git] / src / analyze / analyze-verify.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include "analyze.h"
4 #include "analyze-verify.h"
5 #include "analyze-verify-util.h"
6 #include "copy.h"
7 #include "rm-rf.h"
8 #include "tmpfile-util.h"
9
10 static int process_aliases(char *argv[], char *tempdir, char ***ret) {
11 _cleanup_strv_free_ char **filenames = NULL;
12 char **filename;
13 int r;
14
15 assert(argv);
16 assert(tempdir);
17 assert(ret);
18
19 STRV_FOREACH(filename, strv_skip(argv, 1)) {
20 _cleanup_free_ char *src = NULL, *dst = NULL, *base = NULL;
21 const char *parse_arg;
22
23 parse_arg = *filename;
24 r = extract_first_word(&parse_arg, &src, ":", EXTRACT_DONT_COALESCE_SEPARATORS|EXTRACT_RETAIN_ESCAPE);
25 if (r < 0)
26 return r;
27
28 if (!parse_arg) {
29 r = strv_consume(&filenames, TAKE_PTR(src));
30 if (r < 0)
31 return r;
32
33 continue;
34 }
35
36 r = path_extract_filename(parse_arg, &base);
37 if (r < 0)
38 return r;
39
40 dst = path_join(tempdir, base);
41 if (!dst)
42 return -ENOMEM;
43
44 r = copy_file(src, dst, 0, 0644, 0, 0, COPY_REFLINK);
45 if (r < 0)
46 return r;
47
48 r = strv_consume(&filenames, TAKE_PTR(dst));
49 if (r < 0)
50 return r;
51 }
52
53 *ret = TAKE_PTR(filenames);
54 return 0;
55 }
56
57 int verb_verify(int argc, char *argv[], void *userdata) {
58 _cleanup_strv_free_ char **filenames = NULL;
59 _cleanup_(rm_rf_physical_and_freep) char *tempdir = NULL;
60 int r;
61
62 r = mkdtemp_malloc("/tmp/systemd-analyze-XXXXXX", &tempdir);
63 if (r < 0)
64 return log_error_errno(r, "Failed to setup working directory: %m");
65
66 r = process_aliases(argv, tempdir, &filenames);
67 if (r < 0)
68 return log_error_errno(r, "Couldn't process aliases: %m");
69
70 return verify_units(filenames, arg_scope, arg_man, arg_generators, arg_recursive_errors, arg_root);
71 }