Branch data Line data Source code
1 : : /* SPDX-License-Identifier: LGPL-2.1+ */
2 : :
3 : : #include <errno.h>
4 : : #include <getopt.h>
5 : : #include <stdio.h>
6 : : #include <stdlib.h>
7 : :
8 : : #include "alloc-util.h"
9 : : #include "id128-util.h"
10 : : #include "log.h"
11 : : #include "machine-id-setup.h"
12 : : #include "main-func.h"
13 : : #include "path-util.h"
14 : : #include "pretty-print.h"
15 : : #include "util.h"
16 : :
17 : : static char *arg_root = NULL;
18 : : static bool arg_commit = false;
19 : : static bool arg_print = false;
20 : :
21 : 0 : STATIC_DESTRUCTOR_REGISTER(arg_root, freep);
22 : :
23 : 0 : static int help(void) {
24 : 0 : _cleanup_free_ char *link = NULL;
25 : : int r;
26 : :
27 : 0 : r = terminal_urlify_man("systemd-machine-id-setup", "1", &link);
28 [ # # ]: 0 : if (r < 0)
29 : 0 : return log_oom();
30 : :
31 : 0 : printf("%s [OPTIONS...]\n\n"
32 : : "Initialize /etc/machine-id from a random source.\n\n"
33 : : " -h --help Show this help\n"
34 : : " --version Show package version\n"
35 : : " --root=ROOT Filesystem root\n"
36 : : " --commit Commit transient ID\n"
37 : : " --print Print used machine ID\n"
38 : : "\nSee the %s for details.\n"
39 : : , program_invocation_short_name
40 : : , link
41 : : );
42 : :
43 : 0 : return 0;
44 : : }
45 : :
46 : 0 : static int parse_argv(int argc, char *argv[]) {
47 : :
48 : : enum {
49 : : ARG_VERSION = 0x100,
50 : : ARG_ROOT,
51 : : ARG_COMMIT,
52 : : ARG_PRINT,
53 : : };
54 : :
55 : : static const struct option options[] = {
56 : : { "help", no_argument, NULL, 'h' },
57 : : { "version", no_argument, NULL, ARG_VERSION },
58 : : { "root", required_argument, NULL, ARG_ROOT },
59 : : { "commit", no_argument, NULL, ARG_COMMIT },
60 : : { "print", no_argument, NULL, ARG_PRINT },
61 : : {}
62 : : };
63 : :
64 : : int c, r;
65 : :
66 [ # # ]: 0 : assert(argc >= 0);
67 [ # # ]: 0 : assert(argv);
68 : :
69 [ # # ]: 0 : while ((c = getopt_long(argc, argv, "hqcv", options, NULL)) >= 0)
70 : :
71 [ # # # # : 0 : switch (c) {
# # # ]
72 : :
73 : 0 : case 'h':
74 : 0 : return help();
75 : :
76 : 0 : case ARG_VERSION:
77 : 0 : return version();
78 : :
79 : 0 : case ARG_ROOT:
80 : 0 : r = parse_path_argument_and_warn(optarg, true, &arg_root);
81 [ # # ]: 0 : if (r < 0)
82 : 0 : return r;
83 : 0 : break;
84 : :
85 : 0 : case ARG_COMMIT:
86 : 0 : arg_commit = true;
87 : 0 : break;
88 : :
89 : 0 : case ARG_PRINT:
90 : 0 : arg_print = true;
91 : 0 : break;
92 : :
93 : 0 : case '?':
94 : 0 : return -EINVAL;
95 : :
96 : 0 : default:
97 : 0 : assert_not_reached("Unhandled option");
98 : : }
99 : :
100 [ # # ]: 0 : if (optind < argc)
101 [ # # ]: 0 : return log_error_errno(SYNTHETIC_ERRNO(EINVAL),
102 : : "Extraneous arguments");
103 : :
104 : 0 : return 1;
105 : : }
106 : :
107 : 0 : static int run(int argc, char *argv[]) {
108 : : char buf[SD_ID128_STRING_MAX];
109 : : sd_id128_t id;
110 : : int r;
111 : :
112 : 0 : log_parse_environment();
113 : 0 : log_open();
114 : :
115 : 0 : r = parse_argv(argc, argv);
116 [ # # ]: 0 : if (r <= 0)
117 : 0 : return r;
118 : :
119 [ # # ]: 0 : if (arg_commit) {
120 : : const char *etc_machine_id;
121 : :
122 : 0 : r = machine_id_commit(arg_root);
123 [ # # ]: 0 : if (r < 0)
124 : 0 : return r;
125 : :
126 [ # # # # : 0 : etc_machine_id = prefix_roota(arg_root, "/etc/machine-id");
# # # # #
# # # # #
# # ]
127 : 0 : r = id128_read(etc_machine_id, ID128_PLAIN, &id);
128 [ # # ]: 0 : if (r < 0)
129 [ # # ]: 0 : return log_error_errno(r, "Failed to read machine ID back: %m");
130 : : } else {
131 : 0 : r = machine_id_setup(arg_root, SD_ID128_NULL, &id);
132 [ # # ]: 0 : if (r < 0)
133 : 0 : return r;
134 : : }
135 : :
136 [ # # ]: 0 : if (arg_print)
137 : 0 : puts(sd_id128_to_string(id, buf));
138 : :
139 : 0 : return 0;
140 : : }
141 : :
142 : 0 : DEFINE_MAIN_FUNCTION(run);
|