summaryrefslogtreecommitdiff
path: root/udev/udevadm.c
diff options
context:
space:
mode:
Diffstat (limited to 'udev/udevadm.c')
-rw-r--r--udev/udevadm.c168
1 files changed, 168 insertions, 0 deletions
diff --git a/udev/udevadm.c b/udev/udevadm.c
new file mode 100644
index 0000000000..6e7d7734d2
--- /dev/null
+++ b/udev/udevadm.c
@@ -0,0 +1,168 @@
+/*
+ * Copyright (C) 2007 Kay Sievers <kay.sievers@vrfy.org>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License as published by the
+ * Free Software Foundation version 2 of the License.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ *
+ */
+
+#include <unistd.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <errno.h>
+#include <getopt.h>
+
+#include "udev.h"
+
+static int debug;
+
+#ifdef USE_LOG
+void log_message(int priority, const char *format, ...)
+{
+ va_list args;
+
+ if (priority > udev_log_priority)
+ return;
+
+ va_start(args, format);
+ if (debug) {
+ vprintf(format, args);
+ } else
+ vsyslog(priority, format, args);
+ va_end(args);
+}
+#endif
+
+struct command {
+ const char *name;
+ int (*cmd)(int argc, char *argv[], char *envp[]);
+ const char *help;
+ int debug;
+};
+
+static const struct command cmds[];
+
+static int version(int argc, char *argv[], char *envp[])
+{
+ printf("%s\n", UDEV_VERSION);
+ return 0;
+}
+
+static int help(int argc, char *argv[], char *envp[])
+{
+ const struct command *cmd;
+
+ printf("Usage: udevadm COMMAND [OPTIONS]\n");
+ for (cmd = cmds; cmd->name != NULL; cmd++)
+ printf(" %-12s %s\n", cmd->name, cmd->help);
+ printf("\n");
+ return 0;
+}
+
+static const struct command cmds[] = {
+ {
+ .name = "info",
+ .cmd = udevinfo,
+ .help = "query sysfs or the udev database",
+ },
+ {
+ .name = "trigger",
+ .cmd = udevtrigger,
+ .help = "request events from the kernel",
+ },
+ {
+ .name = "settle",
+ .cmd = udevsettle, "",
+ .help = "wait for the event queue to finish",
+ },
+ {
+ .name = "control",
+ .cmd = udevcontrol,
+ .help = "control the udev daemon",
+ },
+ {
+ .name = "monitor",
+ .cmd = udevmonitor,
+ .help = "listen to kernel and udev events",
+ },
+ {
+ .name = "test",
+ .cmd = udevtest,
+ .help = "simulation run",
+ .debug = 1,
+ },
+ {
+ .name = "version",
+ .cmd = version,
+ .help = "print the version number",
+ },
+ {
+ .name = "help",
+ .cmd = help,
+ .help = "print this help text",
+ },
+ {}
+};
+
+int main(int argc, char *argv[], char *envp[])
+{
+ const char *command;
+ const char *pos;
+ const struct command *cmd;
+ int rc;
+
+ /* get binary or symlink name */
+ pos = strrchr(argv[0], '/');
+ if (pos != NULL)
+ command = &pos[1];
+ else
+ command = argv[0];
+
+ /* the trailing part of the binary or symlink name is the command */
+ if (strncmp(command, "udev", 4) == 0)
+ command = &command[4];
+
+ if (command == NULL || command[0] == '\0')
+ goto err_unknown;
+
+ /* udevadm itself needs to strip its name from the passed options */
+ if (strcmp(command, "adm") == 0) {
+ command = argv[1];
+ argv++;
+ argc--;
+ }
+
+ if (command == NULL)
+ goto err_unknown;
+
+ /* allow command to be specified as an option */
+ if (strncmp(command, "--", 2) == 0)
+ command += 2;
+
+ /* find and execute command */
+ for (cmd = cmds; cmd->name != NULL; cmd++) {
+ if (strcmp(cmd->name, command) == 0) {
+ debug = cmd->debug;
+ rc = cmd->cmd(argc, argv, envp);
+ goto out;
+ }
+ }
+
+err_unknown:
+ fprintf(stderr, "unknown command, try help\n\n");
+ rc = 2;
+out:
+ return rc;
+}