chiark / gitweb /
add builtin load/unload initializers
[elogind.git] / udev / udevadm-monitor.c
index f3a72cf17e3d283a4d2a5ced43d06934567a4995..64913dbd55cbfa9acd9067b48b25d04d7b06d957 100644 (file)
@@ -24,6 +24,7 @@
 #include <errno.h>
 #include <signal.h>
 #include <getopt.h>
+#include <time.h>
 #include <sys/time.h>
 #include <sys/socket.h>
 #include <sys/un.h>
@@ -43,13 +44,12 @@ static void sig_handler(int signum)
 
 static void print_device(struct udev_device *device, const char *source, int prop)
 {
-       struct timeval tv;
-       struct timezone tz;
+       struct timespec ts;
 
-       gettimeofday(&tv, &tz);
+       clock_gettime(CLOCK_MONOTONIC, &ts);
        printf("%-6s[%llu.%06u] %-8s %s (%s)\n",
               source,
-              (unsigned long long) tv.tv_sec, (unsigned int) tv.tv_usec,
+              (unsigned long long) ts.tv_sec, (unsigned int) ts.tv_nsec/1000,
               udev_device_get_action(device),
               udev_device_get_devpath(device),
               udev_device_get_subsystem(device));
@@ -64,7 +64,7 @@ static void print_device(struct udev_device *device, const char *source, int pro
        }
 }
 
-int udevadm_monitor(struct udev *udev, int argc, char *argv[])
+static int adm_monitor(struct udev *udev, int argc, char *argv[])
 {
        struct sigaction act;
        sigset_t mask;
@@ -72,8 +72,8 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[])
        bool prop = false;
        bool print_kernel = false;
        bool print_udev = false;
-       struct udev_list_node subsystem_match_list;
-       struct udev_list_node tag_match_list;
+       struct udev_list subsystem_match_list;
+       struct udev_list tag_match_list;
        struct udev_monitor *udev_monitor = NULL;
        struct udev_monitor *kernel_monitor = NULL;
        int fd_ep = -1;
@@ -92,8 +92,8 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[])
                {}
        };
 
-       udev_list_init(&subsystem_match_list);
-       udev_list_init(&tag_match_list);
+       udev_list_init(udev, &subsystem_match_list, true);
+       udev_list_init(udev, &tag_match_list, true);
 
        for (;;) {
                option = getopt_long(argc, argv, "pekus:t:h", options, NULL);
@@ -122,11 +122,11 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[])
                                        devtype[0] = '\0';
                                        devtype++;
                                }
-                               udev_list_entry_add(udev, &subsystem_match_list, subsys, devtype, 0);
+                               udev_list_entry_add(&subsystem_match_list, subsys, devtype);
                                break;
                        }
                case 't':
-                       udev_list_entry_add(udev, &tag_match_list, optarg, NULL, 0);
+                       udev_list_entry_add(&tag_match_list, optarg, NULL);
                        break;
                case 'h':
                        printf("Usage: udevadm monitor [--property] [--kernel] [--udev] [--help]\n"
@@ -137,6 +137,9 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[])
                               "  --tag-match=<tag>                       filter events by tag\n"
                               "  --help\n\n");
                        goto out;
+               default:
+                       rc = 1;
+                       goto out;
                }
        }
 
@@ -282,7 +285,13 @@ out:
                close(fd_ep);
        udev_monitor_unref(udev_monitor);
        udev_monitor_unref(kernel_monitor);
-       udev_list_cleanup_entries(udev, &subsystem_match_list);
-       udev_list_cleanup_entries(udev, &tag_match_list);
+       udev_list_cleanup(&subsystem_match_list);
+       udev_list_cleanup(&tag_match_list);
        return rc;
 }
+
+const struct udevadm_cmd udevadm_monitor = {
+       .name = "monitor",
+       .cmd = adm_monitor,
+       .help = "listen to kernel and udev events",
+};