X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;ds=sidebyside;f=udev%2Fudevadm-monitor.c;h=3f4cb5772da316d7b9f5a2cefd67fb8279ac7a4d;hb=f07996885dab45102492d7f16e7e2997e264c725;hp=b5897b9ff8d5586f4980009445f1e56e3ea6f124;hpb=3111a33e952a20d8bb60cb37e4ad0986b555f4e1;p=elogind.git diff --git a/udev/udevadm-monitor.c b/udev/udevadm-monitor.c index b5897b9ff..3f4cb5772 100644 --- a/udev/udevadm-monitor.c +++ b/udev/udevadm-monitor.c @@ -35,7 +35,7 @@ static int udev_exit; -static void asmlinkage sig_handler(int signum) +static void sig_handler(int signum) { if (signum == SIGINT || signum == SIGTERM) udev_exit = 1; @@ -71,6 +71,7 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) int env = 0; int print_kernel = 0; int print_udev = 0; + struct udev_list_node subsystem_match_list; struct udev_monitor *udev_monitor = NULL; struct udev_monitor *kernel_monitor = NULL; fd_set readfds; @@ -80,12 +81,14 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) { "environment", no_argument, NULL, 'e' }, { "kernel", no_argument, NULL, 'k' }, { "udev", no_argument, NULL, 'u' }, + { "subsystem-match", required_argument, NULL, 's' }, { "help", no_argument, NULL, 'h' }, {} }; + udev_list_init(&subsystem_match_list); while (1) { - option = getopt_long(argc, argv, "ekuh", options, NULL); + option = getopt_long(argc, argv, "ekus:h", options, NULL); if (option == -1) break; @@ -99,11 +102,26 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) case 'u': print_udev = 1; break; + case 's': + { + char subsys[UTIL_NAME_SIZE]; + char *devtype; + + util_strlcpy(subsys, optarg, sizeof(subsys)); + devtype = strchr(subsys, ':'); + if (devtype != NULL) { + devtype[0] = '\0'; + devtype++; + } + udev_list_entry_add(udev, &subsystem_match_list, subsys, devtype, 0, 0); + break; + } case 'h': printf("Usage: udevadm monitor [--environment] [--kernel] [--udev] [--help]\n" - " --env print the whole event environment\n" - " --kernel print kernel uevents\n" - " --udev print udev events\n" + " --env print the whole event environment\n" + " --kernel print kernel uevents\n" + " --udev print udev events\n" + " --subsystem-match= filter events\n" " --help\n\n"); default: goto out; @@ -117,7 +135,7 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) /* set signal handlers */ memset(&act, 0x00, sizeof(struct sigaction)); - act.sa_handler = (void (*)(int)) sig_handler; + act.sa_handler = sig_handler; sigemptyset(&act.sa_mask); act.sa_flags = SA_RESTART; sigaction(SIGINT, &act, NULL); @@ -125,12 +143,23 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) printf("monitor will print the received events for:\n"); if (print_udev) { + struct udev_list_entry *entry; + udev_monitor = udev_monitor_new_from_netlink(udev, "udev"); if (udev_monitor == NULL) { fprintf(stderr, "error: unable to create netlink socket\n"); rc = 1; goto out; } + + udev_list_entry_foreach(entry, udev_list_get_entry(&subsystem_match_list)) { + const char *subsys = udev_list_entry_get_name(entry); + const char *devtype = udev_list_entry_get_value(entry); + + if (udev_monitor_filter_add_match_subsystem_devtype(udev_monitor, subsys, devtype) < 0) + fprintf(stderr, "error: unable to apply subsystem filter '%s'\n", subsys); + } + if (udev_monitor_enable_receiving(udev_monitor) < 0) { fprintf(stderr, "error: unable to subscribe to udev events\n"); rc = 2; @@ -139,12 +168,22 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) printf("UDEV - the event which udev sends out after rule processing\n"); } if (print_kernel) { + struct udev_list_entry *entry; + kernel_monitor = udev_monitor_new_from_netlink(udev, "kernel"); if (kernel_monitor == NULL) { fprintf(stderr, "error: unable to create netlink socket\n"); rc = 3; goto out; } + + udev_list_entry_foreach(entry, udev_list_get_entry(&subsystem_match_list)) { + const char *subsys = udev_list_entry_get_name(entry); + + if (udev_monitor_filter_add_match_subsystem_devtype(kernel_monitor, subsys, NULL) < 0) + fprintf(stderr, "error: unable to apply subsystem filter '%s'\n", subsys); + } + if (udev_monitor_enable_receiving(kernel_monitor) < 0) { fprintf(stderr, "error: unable to subscribe to kernel events\n"); rc = 4; @@ -195,5 +234,6 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) out: udev_monitor_unref(udev_monitor); udev_monitor_unref(kernel_monitor); + udev_list_cleanup_entries(udev, &subsystem_match_list); return rc; }