]>
Commit | Line | Data |
---|---|---|
225cb03b | 1 | /* |
1298001e | 2 | * Copyright (C) 2007-2012 Kay Sievers <kay@vrfy.org> |
225cb03b | 3 | * |
55e9959b KS |
4 | * This program is free software: you can redistribute it and/or modify |
5 | * it under the terms of the GNU General Public License as published by | |
6 | * the Free Software Foundation, either version 2 of the License, or | |
7 | * (at your option) any later version. | |
225cb03b | 8 | * |
55e9959b KS |
9 | * This program is distributed in the hope that it will be useful, |
10 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
12 | * GNU General Public License for more details. | |
13 | * | |
14 | * You should have received a copy of the GNU General Public License | |
15 | * along with this program. If not, see <http://www.gnu.org/licenses/>. | |
225cb03b KS |
16 | */ |
17 | ||
18 | #include <unistd.h> | |
19 | #include <stdio.h> | |
20 | #include <stdlib.h> | |
21 | #include <stddef.h> | |
22 | #include <string.h> | |
23 | #include <errno.h> | |
24 | #include <getopt.h> | |
25 | ||
26 | #include "udev.h" | |
27 | ||
80df994c | 28 | void udev_main_log(struct udev *udev, int priority, |
912541b0 KS |
29 | const char *file, int line, const char *fn, |
30 | const char *format, va_list args) | |
225cb03b | 31 | { |
baa30fbc | 32 | log_metav(priority, file, line, fn, format, args); |
225cb03b | 33 | } |
225cb03b | 34 | |
1985c76e | 35 | static int adm_version(struct udev *udev, int argc, char *argv[]) |
225cb03b | 36 | { |
912541b0 KS |
37 | printf("%s\n", VERSION); |
38 | return 0; | |
225cb03b | 39 | } |
baa30fbc | 40 | |
1985c76e | 41 | static const struct udevadm_cmd udevadm_version = { |
912541b0 KS |
42 | .name = "version", |
43 | .cmd = adm_version, | |
1985c76e KS |
44 | }; |
45 | ||
46 | static int adm_help(struct udev *udev, int argc, char *argv[]); | |
baa30fbc | 47 | |
1985c76e | 48 | static const struct udevadm_cmd udevadm_help = { |
912541b0 KS |
49 | .name = "help", |
50 | .cmd = adm_help, | |
1985c76e KS |
51 | }; |
52 | ||
53 | static const struct udevadm_cmd *udevadm_cmds[] = { | |
912541b0 KS |
54 | &udevadm_info, |
55 | &udevadm_trigger, | |
56 | &udevadm_settle, | |
57 | &udevadm_control, | |
58 | &udevadm_monitor, | |
796b06c2 | 59 | &udevadm_hwdb, |
912541b0 KS |
60 | &udevadm_test, |
61 | &udevadm_test_builtin, | |
62 | &udevadm_version, | |
63 | &udevadm_help, | |
1985c76e | 64 | }; |
225cb03b | 65 | |
1985c76e | 66 | static int adm_help(struct udev *udev, int argc, char *argv[]) |
225cb03b | 67 | { |
912541b0 KS |
68 | unsigned int i; |
69 | ||
70 | fprintf(stderr, "Usage: udevadm [--help] [--version] [--debug] COMMAND [COMMAND OPTIONS]\n"); | |
8fef0ff2 | 71 | for (i = 0; i < ELEMENTSOF(udevadm_cmds); i++) |
912541b0 KS |
72 | if (udevadm_cmds[i]->help != NULL) |
73 | printf(" %-12s %s\n", udevadm_cmds[i]->name, udevadm_cmds[i]->help); | |
74 | fprintf(stderr, "\n"); | |
75 | return 0; | |
225cb03b KS |
76 | } |
77 | ||
1985c76e | 78 | static int run_command(struct udev *udev, const struct udevadm_cmd *cmd, int argc, char *argv[]) |
7d563a17 | 79 | { |
baa30fbc KS |
80 | if (cmd->debug) |
81 | log_set_max_level(LOG_DEBUG); | |
9f6445e3 | 82 | log_debug("calling: %s", cmd->name); |
912541b0 | 83 | return cmd->cmd(udev, argc, argv); |
7d563a17 KS |
84 | } |
85 | ||
59345311 | 86 | int main(int argc, char *argv[]) |
225cb03b | 87 | { |
912541b0 KS |
88 | struct udev *udev; |
89 | static const struct option options[] = { | |
90 | { "debug", no_argument, NULL, 'd' }, | |
91 | { "help", no_argument, NULL, 'h' }, | |
92 | { "version", no_argument, NULL, 'V' }, | |
93 | {} | |
94 | }; | |
95 | const char *command; | |
96 | unsigned int i; | |
97 | int rc = 1; | |
98 | ||
99 | udev = udev_new(); | |
100 | if (udev == NULL) | |
101 | goto out; | |
102 | ||
baa30fbc | 103 | log_parse_environment(); |
4b261568 | 104 | log_open(); |
912541b0 | 105 | udev_set_log_fn(udev, udev_main_log); |
0f9963a8 | 106 | label_init("/dev"); |
912541b0 KS |
107 | |
108 | for (;;) { | |
109 | int option; | |
110 | ||
111 | option = getopt_long(argc, argv, "+dhV", options, NULL); | |
112 | if (option == -1) | |
113 | break; | |
114 | ||
115 | switch (option) { | |
116 | case 'd': | |
baa30fbc KS |
117 | log_set_max_level(LOG_DEBUG); |
118 | udev_set_log_priority(udev, LOG_DEBUG); | |
912541b0 KS |
119 | break; |
120 | case 'h': | |
121 | rc = adm_help(udev, argc, argv); | |
122 | goto out; | |
123 | case 'V': | |
124 | rc = adm_version(udev, argc, argv); | |
125 | goto out; | |
126 | default: | |
127 | goto out; | |
128 | } | |
129 | } | |
130 | command = argv[optind]; | |
131 | ||
912541b0 | 132 | if (command != NULL) |
8fef0ff2 | 133 | for (i = 0; i < ELEMENTSOF(udevadm_cmds); i++) { |
090be865 | 134 | if (streq(udevadm_cmds[i]->name, command)) { |
912541b0 KS |
135 | argc -= optind; |
136 | argv += optind; | |
e5f2783e KS |
137 | /* we need '0' here to reset the internal state */ |
138 | optind = 0; | |
912541b0 KS |
139 | rc = run_command(udev, udevadm_cmds[i], argc, argv); |
140 | goto out; | |
141 | } | |
142 | } | |
143 | ||
144 | fprintf(stderr, "missing or unknown command\n\n"); | |
145 | adm_help(udev, argc, argv); | |
146 | rc = 2; | |
225cb03b | 147 | out: |
e9a5ef7c | 148 | label_finish(); |
912541b0 | 149 | udev_unref(udev); |
baa30fbc | 150 | log_close(); |
912541b0 | 151 | return rc; |
225cb03b | 152 | } |