summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKay Sievers <kay.sievers@vrfy.org>2008-09-09 14:07:08 +0200
committerKay Sievers <kay.sievers@vrfy.org>2008-09-09 14:07:08 +0200
commit8a4c287d150e56a2bf57163edaee7c487896418f (patch)
tree665a80512b70735b640199758dc7ac4184bd624a
parentc4f5f942d7dd904e53374c10de319feb41968561 (diff)
udevadm: monitor - use libudev for udev monitor
-rw-r--r--udev/Makefile.am2
-rw-r--r--udev/udevadm-monitor.c75
2 files changed, 27 insertions, 50 deletions
diff --git a/udev/Makefile.am b/udev/Makefile.am
index 6ee72d3206..de39249af1 100644
--- a/udev/Makefile.am
+++ b/udev/Makefile.am
@@ -36,6 +36,8 @@ common_files = \
lib/libudev.h \
lib/libudev-private.h \
lib/libudev.c \
+ lib/libudev-device.c \
+ lib/libudev-monitor.c \
lib/libudev-utils.c \
lib/libudev-ctrl.c
diff --git a/udev/udevadm-monitor.c b/udev/udevadm-monitor.c
index caaf84ffa7..f884337779 100644
--- a/udev/udevadm-monitor.c
+++ b/udev/udevadm-monitor.c
@@ -35,43 +35,12 @@
#include "udev.h"
static int uevent_netlink_sock = -1;
-static int udev_monitor_sock = -1;
-static volatile int udev_exit;
-
-static int init_udev_monitor_socket(void)
-{
- struct sockaddr_un saddr;
- socklen_t addrlen;
- int retval;
-
- memset(&saddr, 0x00, sizeof(saddr));
- saddr.sun_family = AF_LOCAL;
- /* use abstract namespace for socket path */
- strcpy(&saddr.sun_path[1], "/org/kernel/udev/monitor");
- addrlen = offsetof(struct sockaddr_un, sun_path) + 1 + strlen(&saddr.sun_path[1]);
-
- udev_monitor_sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
- if (udev_monitor_sock == -1) {
- fprintf(stderr, "error getting socket: %s\n", strerror(errno));
- return -1;
- }
-
- /* the bind takes care of ensuring only one copy running */
- retval = bind(udev_monitor_sock, (struct sockaddr *) &saddr, addrlen);
- if (retval < 0) {
- fprintf(stderr, "bind failed: %s\n", strerror(errno));
- close(udev_monitor_sock);
- udev_monitor_sock = -1;
- return -1;
- }
-
- return 0;
-}
+static int udev_exit;
static int init_uevent_netlink_sock(void)
{
struct sockaddr_nl snl;
- int retval;
+ int err;
memset(&snl, 0x00, sizeof(struct sockaddr_nl));
snl.nl_family = AF_NETLINK;
@@ -84,9 +53,9 @@ static int init_uevent_netlink_sock(void)
return -1;
}
- retval = bind(uevent_netlink_sock, (struct sockaddr *) &snl,
+ err = bind(uevent_netlink_sock, (struct sockaddr *) &snl,
sizeof(struct sockaddr_nl));
- if (retval < 0) {
+ if (err < 0) {
fprintf(stderr, "bind failed: %s\n", strerror(errno));
close(uevent_netlink_sock);
uevent_netlink_sock = -1;
@@ -129,8 +98,9 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[])
int env = 0;
int print_kernel = 0;
int print_udev = 0;
+ struct udev_monitor *udev_monitor = NULL;
fd_set readfds;
- int retval = 0;
+ int rc = 0;
static const struct option options[] = {
{ "environment", 0, NULL, 'e' },
@@ -186,15 +156,22 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[])
printf("monitor will print the received events for:\n");
if (print_udev) {
- retval = init_udev_monitor_socket();
- if (retval)
+ udev_monitor = udev_monitor_new_from_socket(udev, "@/org/kernel/udev/monitor");
+ if (udev_monitor == NULL) {
+ rc = 1;
+ goto out;
+ }
+ if (udev_monitor_enable_receiving(udev_monitor) < 0) {
+ rc = 2;
goto out;
+ }
printf("UDEV the event which udev sends out after rule processing\n");
}
if (print_kernel) {
- retval = init_uevent_netlink_sock();
- if (retval)
+ if (init_uevent_netlink_sock() < 0) {
+ rc = 3;
goto out;
+ }
printf("UEVENT the kernel uevent\n");
}
printf("\n");
@@ -215,10 +192,11 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[])
FD_ZERO(&readfds);
if (uevent_netlink_sock >= 0)
FD_SET(uevent_netlink_sock, &readfds);
- if (udev_monitor_sock >= 0)
- FD_SET(udev_monitor_sock, &readfds);
+ if (udev_monitor != NULL)
+ FD_SET(udev_monitor_get_fd(udev_monitor), &readfds);
- fdcount = select(UDEV_MAX(uevent_netlink_sock, udev_monitor_sock)+1, &readfds, NULL, NULL, NULL);
+ fdcount = select(UDEV_MAX(uevent_netlink_sock, udev_monitor_get_fd(udev_monitor))+1,
+ &readfds, NULL, NULL, NULL);
if (fdcount < 0) {
if (errno != EINTR)
fprintf(stderr, "error receiving uevent message: %s\n", strerror(errno));
@@ -240,8 +218,8 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[])
source = "UEVENT";
}
- if ((udev_monitor_sock >= 0) && FD_ISSET(udev_monitor_sock, &readfds)) {
- buflen = recv(udev_monitor_sock, &buf, sizeof(buf), 0);
+ if ((udev_monitor != NULL) && FD_ISSET(udev_monitor_get_fd(udev_monitor), &readfds)) {
+ buflen = recv(udev_monitor_get_fd(udev_monitor), &buf, sizeof(buf), 0);
if (buflen <= 0) {
fprintf(stderr, "error receiving udev message: %s\n", strerror(errno));
continue;
@@ -277,12 +255,9 @@ int udevadm_monitor(struct udev *udev, int argc, char *argv[])
}
out:
+ udev_monitor_unref(udev_monitor);
if (uevent_netlink_sock >= 0)
close(uevent_netlink_sock);
- if (udev_monitor_sock >= 0)
- close(udev_monitor_sock);
- if (retval)
- return 1;
- return 0;
+ return rc;
}