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