X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=udev%2Fudevadm-monitor.c;h=fb650846bcd4eca2628cdbe7c13d9fbc588aed3c;hb=6d80a7e83f55c7319d1cb9b0a9910a005b2f4103;hp=df1459ae17d5f8bb7b4379fd123efd4330c0fd5c;hpb=257bb4cdac76c00be6e17b0b656df0a2d7ee7b4d;p=elogind.git diff --git a/udev/udevadm-monitor.c b/udev/udevadm-monitor.c index df1459ae1..fb650846b 100644 --- a/udev/udevadm-monitor.c +++ b/udev/udevadm-monitor.c @@ -1,5 +1,5 @@ /* - * Copyright (C) 2004-2008 Kay Sievers + * Copyright (C) 2004-2010 Kay Sievers * * 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 @@ -67,11 +67,13 @@ static void print_device(struct udev_device *device, const char *source, int pro int udevadm_monitor(struct udev *udev, int argc, char *argv[]) { struct sigaction act; + sigset_t mask; int option; int prop = 0; int print_kernel = 0; int print_udev = 0; struct udev_list_node subsystem_match_list; + struct udev_list_node tag_match_list; struct udev_monitor *udev_monitor = NULL; struct udev_monitor *kernel_monitor = NULL; fd_set readfds; @@ -83,13 +85,15 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) { "kernel", no_argument, NULL, 'k' }, { "udev", no_argument, NULL, 'u' }, { "subsystem-match", required_argument, NULL, 's' }, + { "tag-match", required_argument, NULL, 't' }, { "help", no_argument, NULL, 'h' }, {} }; udev_list_init(&subsystem_match_list); + udev_list_init(&tag_match_list); while (1) { - option = getopt_long(argc, argv, "epkus:h", options, NULL); + option = getopt_long(argc, argv, "pekus:t:h", options, NULL); if (option == -1) break; @@ -110,7 +114,7 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) char *devtype; util_strscpy(subsys, sizeof(subsys), optarg); - devtype = strchr(subsys, ':'); + devtype = strchr(subsys, '/'); if (devtype != NULL) { devtype[0] = '\0'; devtype++; @@ -118,12 +122,16 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) udev_list_entry_add(udev, &subsystem_match_list, subsys, devtype, 0, 0); break; } + case 't': + udev_list_entry_add(udev, &tag_match_list, optarg, NULL, 0, 0); + break; case 'h': printf("Usage: udevadm monitor [--property] [--kernel] [--udev] [--help]\n" - " --property print the event properties\n" - " --kernel print kernel uevents\n" - " --udev print udev events\n" - " --subsystem-match= filter events\n" + " --property print the event properties\n" + " --kernel print kernel uevents\n" + " --udev print udev events\n" + " --subsystem-match= filter events by subsystem\n" + " --tag-match= filter events by tag\n" " --help\n\n"); default: goto out; @@ -142,6 +150,10 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) act.sa_flags = SA_RESTART; sigaction(SIGINT, &act, NULL); sigaction(SIGTERM, &act, NULL); + sigemptyset(&mask); + sigaddset(&mask, SIGINT); + sigaddset(&mask, SIGTERM); + sigprocmask(SIG_UNBLOCK, &mask, NULL); printf("monitor will print the received events for:\n"); if (print_udev) { @@ -153,6 +165,7 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) rc = 1; goto out; } + udev_monitor_set_receive_buffer_size(udev_monitor, 128*1024*1024); udev_list_entry_foreach(entry, udev_list_get_entry(&subsystem_match_list)) { const char *subsys = udev_list_entry_get_name(entry); @@ -162,6 +175,13 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) fprintf(stderr, "error: unable to apply subsystem filter '%s'\n", subsys); } + udev_list_entry_foreach(entry, udev_list_get_entry(&tag_match_list)) { + const char *tag = udev_list_entry_get_name(entry); + + if (udev_monitor_filter_add_match_tag(udev_monitor, tag) < 0) + fprintf(stderr, "error: unable to apply tag filter '%s'\n", tag); + } + if (udev_monitor_enable_receiving(udev_monitor) < 0) { fprintf(stderr, "error: unable to subscribe to udev events\n"); rc = 2; @@ -178,6 +198,7 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[]) rc = 3; goto out; } + udev_monitor_set_receive_buffer_size(kernel_monitor, 128*1024*1024); udev_list_entry_foreach(entry, udev_list_get_entry(&subsystem_match_list)) { const char *subsys = udev_list_entry_get_name(entry); @@ -237,5 +258,6 @@ out: 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); return rc; }