udevmonitor.c revision 593453115b777368252ca4231537ad2a9e6d8ffb
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * Copyright (C) 2004-2006 Kay Sievers <kay.sievers@vrfy.org>
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * This program is free software; you can redistribute it and/or modify it
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * under the terms of the GNU General Public License as published by the
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * Free Software Foundation version 2 of the License.
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * This program is distributed in the hope that it will be useful, but
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * WITHOUT ANY WARRANTY; without even the implied warranty of
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * General Public License for more details.
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * You should have received a copy of the GNU General Public License along
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * with this program; if not, write to the Free Software Foundation, Inc.,
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirovstatic volatile int udev_exit;
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirovstatic int init_udev_monitor_socket(void)
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov /* use abstract namespace for socket path */
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov strcpy(&saddr.sun_path[1], "/org/kernel/udev/monitor");
4852d800d11740225072579e8bd8c4b56df581eeAlexander Vladimirov addrlen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&saddr.sun_path[1]);
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov udev_monitor_sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov fprintf(stderr, "error getting socket: %s\n", strerror(errno));
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov /* the bind takes care of ensuring only one copy running */
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov retval = bind(udev_monitor_sock, (struct sockaddr *) &saddr, addrlen);
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov fprintf(stderr, "bind failed: %s\n", strerror(errno));
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirovstatic int init_uevent_netlink_sock(void)
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov memset(&snl, 0x00, sizeof(struct sockaddr_nl));
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov uevent_netlink_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov fprintf(stderr, "error getting socket: %s\n", strerror(errno));
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov retval = bind(uevent_netlink_sock, (struct sockaddr *) &snl,
17abf2784de1047fb2904ff130ee5efe4ea7b598Elan Ruusamäe sizeof(struct sockaddr_nl));
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov fprintf(stderr, "bind failed: %s\n", strerror(errno));
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirovstatic void asmlinkage sig_handler(int signum)
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov if (signum == SIGINT || signum == SIGTERM)
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirovstatic const char *search_key(const char *searchkey, const char *buf, size_t buflen)
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov size_t searchkeylen = strlen(searchkey);
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov if ((strncmp(searchkey, key, searchkeylen) == 0) && key[searchkeylen] == '=')
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov static const struct option options[] = {
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov option = getopt_long(argc, argv, "ekuh", options, NULL);
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov printf("Usage: udevadm monitor [--environment] [--kernel] [--udev] [--help]\n"
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov " --env print the whole event environment\n"
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov " --kernel print kernel uevents\n"
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov " --udev print udev events\n"
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov " --help print this help text\n\n");
17abf2784de1047fb2904ff130ee5efe4ea7b598Elan Ruusamäe fprintf(stderr, "root privileges needed to subscribe to kernel events\n");
734d0bed55ea17793510e1ce1de34ebc8c5eb6abJohn Lane /* set signal handlers */
734d0bed55ea17793510e1ce1de34ebc8c5eb6abJohn Lane printf("udevmonitor will print the received events for:\n");
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov printf("UDEV the event which udev sends out after rule processing\n");
d0800999b2aff2c2445e1ac18905fddbfe71cb8cJohn Lane fdcount = select(UDEV_MAX(uevent_netlink_sock, udev_monitor_sock)+1, &readfds, NULL, NULL, NULL);
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov fprintf(stderr, "error receiving uevent message: %s\n", strerror(errno));
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov snprintf(timestr, sizeof(timestr), "%llu.%06u",
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov (unsigned long long) tv.tv_sec, (unsigned int) tv.tv_usec);
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov if ((uevent_netlink_sock >= 0) && FD_ISSET(uevent_netlink_sock, &readfds)) {
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov buflen = recv(uevent_netlink_sock, &buf, sizeof(buf), 0);
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov fprintf(stderr, "error receiving uevent message: %s\n", strerror(errno));
148315348760faf4ad822ded7c416d2de8050937Alexander Vladimirov if ((udev_monitor_sock >= 0) && FD_ISSET(udev_monitor_sock, &readfds)) {
734d0bed55ea17793510e1ce1de34ebc8c5eb6abJohn Lane buflen = recv(udev_monitor_sock, &buf, sizeof(buf), 0);
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov fprintf(stderr, "error receiving udev message: %s\n", strerror(errno));
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov keys = strlen(buf) + 1; /* start of payload */
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov devpath = search_key("DEVPATH", &buf[keys], buflen);
f6267d9011eea5074028dc44b49df3bd3df7443cAlexander Vladimirov action = search_key("ACTION", &buf[keys], buflen);
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov subsys = search_key("SUBSYSTEM", &buf[keys], buflen);
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov printf("%s[%s] %-8s %s (%s)\n", source, timestr, action, devpath, subsys);
f3849d01d8f31785bf933ffcf91a419c4ff2257dAlexander Vladimirov /* print environment */