]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-chase-symlinks.c
Merge pull request #13194 from keszybz/chase-symlinks-testing
[thirdparty/systemd.git] / src / test / test-chase-symlinks.c
1 /* SPDX-License-Identifier: LGPL-2.1+ */
2 #include <getopt.h>
3
4 #include "log.h"
5 #include "fs-util.h"
6 #include "main-func.h"
7
8 static char *arg_root = NULL;
9 static int arg_flags = 0;
10
11 static int parse_argv(int argc, char *argv[]) {
12 enum {
13 ARG_ROOT = 0x1000,
14 };
15
16 static const struct option options[] = {
17 { "help", no_argument, NULL, 'h' },
18 { "root", required_argument, NULL, ARG_ROOT },
19
20 { "prefix-root", no_argument, NULL, CHASE_PREFIX_ROOT },
21 { "nonexistent", no_argument, NULL, CHASE_NONEXISTENT },
22 { "no_autofs", no_argument, NULL, CHASE_NO_AUTOFS },
23 { "safe", no_argument, NULL, CHASE_SAFE },
24 { "open", no_argument, NULL, CHASE_OPEN },
25 { "trail-slash", no_argument, NULL, CHASE_TRAIL_SLASH },
26 { "step", no_argument, NULL, CHASE_STEP },
27 { "nofollow", no_argument, NULL, CHASE_NOFOLLOW },
28 { "warn", no_argument, NULL, CHASE_WARN },
29 {}
30 };
31
32 int c;
33
34 assert(argc >= 0);
35 assert(argv);
36
37 while ((c = getopt_long(argc, argv, "", options, NULL)) >= 0)
38 switch (c) {
39
40 case 'h':
41 printf("Syntax:\n"
42 " %s [OPTION...] path...\n"
43 "Options:\n"
44 , argv[0]);
45 for (size_t i = 0; i < ELEMENTSOF(options) - 1; i++)
46 printf(" --%s\n", options[i].name);
47 return 0;
48
49 case ARG_ROOT:
50 arg_root = optarg;
51 break;
52
53 case CHASE_PREFIX_ROOT:
54 case CHASE_NONEXISTENT:
55 case CHASE_NO_AUTOFS:
56 case CHASE_SAFE:
57 case CHASE_OPEN:
58 case CHASE_TRAIL_SLASH:
59 case CHASE_STEP:
60 case CHASE_NOFOLLOW:
61 case CHASE_WARN:
62 arg_flags |= c;
63 break;
64
65 case '?':
66 return -EINVAL;
67
68 default:
69 assert_not_reached("Unhandled option");
70 }
71
72 if (optind == argc)
73 return log_error_errno(SYNTHETIC_ERRNO(EINVAL), "At least one argument is required.");
74
75 return 1;
76 }
77
78 static int run(int argc, char **argv) {
79 int r;
80
81 log_show_color(true);
82 log_parse_environment();
83 log_open();
84
85 r = parse_argv(argc, argv);
86 if (r <= 0)
87 return r;
88
89 for (int i = optind; i < argc; i++) {
90 _cleanup_free_ char *p = NULL;
91
92 printf("%s ", argv[i]);
93 fflush(stdout);
94
95 r = chase_symlinks(argv[i], arg_root, arg_flags, &p);
96 if (r < 0)
97 log_error_errno(r, "failed: %m");
98 else
99 log_info("→ %s", p);
100 }
101
102 return 0;
103 }
104
105 DEFINE_MAIN_FUNCTION(run);