| /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
| |
| #include "analyze.h" |
| #include "analyze-verify.h" |
| #include "analyze-verify-util.h" |
| #include "copy.h" |
| #include "rm-rf.h" |
| #include "tmpfile-util.h" |
| |
| static int process_aliases(char *argv[], char *tempdir, char ***ret) { |
| _cleanup_strv_free_ char **filenames = NULL; |
| int r; |
| |
| assert(argv); |
| assert(tempdir); |
| assert(ret); |
| |
| STRV_FOREACH(filename, strv_skip(argv, 1)) { |
| _cleanup_free_ char *src = NULL, *dst = NULL, *base = NULL; |
| const char *parse_arg; |
| |
| parse_arg = *filename; |
| r = extract_first_word(&parse_arg, &src, ":", EXTRACT_DONT_COALESCE_SEPARATORS|EXTRACT_RETAIN_ESCAPE); |
| if (r < 0) |
| return r; |
| |
| if (!parse_arg) { |
| r = strv_consume(&filenames, TAKE_PTR(src)); |
| if (r < 0) |
| return r; |
| |
| continue; |
| } |
| |
| r = path_extract_filename(parse_arg, &base); |
| if (r < 0) |
| return r; |
| |
| dst = path_join(tempdir, base); |
| if (!dst) |
| return -ENOMEM; |
| |
| r = copy_file(src, dst, 0, 0644, 0, 0, COPY_REFLINK); |
| if (r < 0) |
| return r; |
| |
| r = strv_consume(&filenames, TAKE_PTR(dst)); |
| if (r < 0) |
| return r; |
| } |
| |
| *ret = TAKE_PTR(filenames); |
| return 0; |
| } |
| |
| int verb_verify(int argc, char *argv[], void *userdata) { |
| _cleanup_strv_free_ char **filenames = NULL; |
| _cleanup_(rm_rf_physical_and_freep) char *tempdir = NULL; |
| int r; |
| |
| r = mkdtemp_malloc("/tmp/systemd-analyze-XXXXXX", &tempdir); |
| if (r < 0) |
| return log_error_errno(r, "Failed to setup working directory: %m"); |
| |
| r = process_aliases(argv, tempdir, &filenames); |
| if (r < 0) |
| return log_error_errno(r, "Couldn't process aliases: %m"); |
| |
| return verify_units(filenames, arg_scope, arg_man, arg_generators, arg_recursive_errors, arg_root); |
| } |