]> git.ipfire.org Git - thirdparty/systemd.git/blob - src/hwdb/hwdb.c
Merge pull request #30284 from YHNdnzj/fstab-wantedby-defaultdeps
[thirdparty/systemd.git] / src / hwdb / hwdb.c
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
2
3 #include <getopt.h>
4
5 #include "sd-hwdb.h"
6
7 #include "alloc-util.h"
8 #include "build.h"
9 #include "hwdb-util.h"
10 #include "main-func.h"
11 #include "pretty-print.h"
12 #include "selinux-util.h"
13 #include "terminal-util.h"
14 #include "verbs.h"
15
16 static const char *arg_hwdb_bin_dir = NULL;
17 static const char *arg_root = NULL;
18 static bool arg_strict = false;
19
20 static int verb_query(int argc, char *argv[], void *userdata) {
21 return hwdb_query(argv[1], arg_root);
22 }
23
24 static int verb_update(int argc, char *argv[], void *userdata) {
25 if (hwdb_bypass())
26 return 0;
27
28 return hwdb_update(arg_root, arg_hwdb_bin_dir, arg_strict, false);
29 }
30
31 static int help(void) {
32 _cleanup_free_ char *link = NULL;
33 int r;
34
35 r = terminal_urlify_man("systemd-hwdb", "8", &link);
36 if (r < 0)
37 return log_oom();
38
39 printf("%s [OPTIONS...] COMMAND ...\n\n"
40 "%sUpdate or query the hardware database.%s\n"
41 "\nCommands:\n"
42 " update Update the hwdb database\n"
43 " query MODALIAS Query database and print result\n"
44 "\nOptions:\n"
45 " -h --help Show this help\n"
46 " --version Show package version\n"
47 " -s --strict When updating, return non-zero exit value on any parsing error\n"
48 " --usr Generate in " UDEVLIBEXECDIR " instead of /etc/udev\n"
49 " -r --root=PATH Alternative root path in the filesystem\n"
50 "\nSee the %s for details.\n",
51 program_invocation_short_name,
52 ansi_highlight(),
53 ansi_normal(),
54 link);
55
56 return 0;
57 }
58
59 static int parse_argv(int argc, char *argv[]) {
60 enum {
61 ARG_VERSION = 0x100,
62 ARG_USR,
63 };
64
65 static const struct option options[] = {
66 { "help", no_argument, NULL, 'h' },
67 { "version", no_argument, NULL, ARG_VERSION },
68 { "usr", no_argument, NULL, ARG_USR },
69 { "strict", no_argument, NULL, 's' },
70 { "root", required_argument, NULL, 'r' },
71 {}
72 };
73
74 int c;
75
76 assert(argc >= 0);
77 assert(argv);
78
79 while ((c = getopt_long(argc, argv, "sr:h", options, NULL)) >= 0)
80 switch (c) {
81
82 case 'h':
83 return help();
84
85 case ARG_VERSION:
86 return version();
87
88 case ARG_USR:
89 arg_hwdb_bin_dir = UDEVLIBEXECDIR;
90 break;
91
92 case 's':
93 arg_strict = true;
94 break;
95
96 case 'r':
97 arg_root = optarg;
98 break;
99
100 case '?':
101 return -EINVAL;
102
103 default:
104 assert_not_reached();
105 }
106
107 return 1;
108 }
109
110 static int hwdb_main(int argc, char *argv[]) {
111 static const Verb verbs[] = {
112 { "update", 1, 1, 0, verb_update },
113 { "query", 2, 2, 0, verb_query },
114 {},
115 };
116
117 return dispatch_verb(argc, argv, verbs, NULL);
118 }
119
120 static int run(int argc, char *argv[]) {
121 int r;
122
123 log_parse_environment();
124 log_open();
125
126 r = parse_argv(argc, argv);
127 if (r <= 0)
128 return r;
129
130 r = mac_init();
131 if (r < 0)
132 return r;
133
134 return hwdb_main(argc, argv);
135 }
136
137 DEFINE_MAIN_FUNCTION(run);