chiark / gitweb /
udevd: ignore all messages without DEVPATH
[elogind.git] / udevd.c
diff --git a/udevd.c b/udevd.c
index ddf72738c321bff0c2a81f24423f525d5deda4a7..3fd3bfe6adbf61e67f95bf8173975469064836f6 100644 (file)
--- a/udevd.c
+++ b/udevd.c
@@ -39,6 +39,7 @@
 #include <sys/un.h>
 #include <sys/stat.h>
 #include <sys/ioctl.h>
+#include <linux/types.h>
 #include <linux/netlink.h>
 
 #include "list.h"
@@ -160,7 +161,7 @@ static void udev_event_run(struct uevent_msg *msg)
                logging_close();
                exit(0);
        case -1:
-               err("fork of child failed");
+               err("fork of child failed: %s", strerror(errno));
                msg_queue_delete(msg);
                break;
        default:
@@ -312,16 +313,11 @@ static int running_with_devpath(struct uevent_msg *msg, int limit)
        struct uevent_msg *loop_msg;
        int childs_count = 0;
 
-       if (msg->devpath == NULL)
-               return 0;
-
        list_for_each_entry(loop_msg, &running_list, node) {
                if (limit && childs_count++ > limit) {
                        dbg("%llu, maximum number (%i) of child reached", msg->seqnum, childs_count);
                        return 1;
                }
-               if (loop_msg->devpath == NULL)
-                       continue;
 
                /* return running parent/child device event */
                if (compare_devpath(loop_msg->devpath, msg->devpath) != 0) {
@@ -430,6 +426,12 @@ static struct uevent_msg *get_msg_from_envbuf(const char *buf, int buf_size)
        msg->envp[i++] = "UDEVD_EVENT=1";
        msg->envp[i] = NULL;
 
+       if (!msg->devpath) {
+               info("DEVPATH missing, ingnore message");
+               free(msg);
+               return NULL;
+       }
+
        return msg;
 }
 
@@ -460,7 +462,7 @@ static struct uevent_msg *get_udevd_msg(void)
        size = recvmsg(udevd_sock, &smsg, 0);
        if (size <  0) {
                if (errno != EINTR)
-                       err("unable to receive udevd message");
+                       err("unable to receive udevd message: %s", strerror(errno));
                return NULL;
        }
        cmsg = CMSG_FIRSTHDR(&smsg);
@@ -535,7 +537,7 @@ static struct uevent_msg *get_netlink_msg(void)
        size = recv(uevent_netlink_sock, &buffer, sizeof(buffer), 0);
        if (size <  0) {
                if (errno != EINTR)
-                       err("unable to receive udevd message");
+                       err("unable to receive udevd message: %s", strerror(errno));
                return NULL;
        }
 
@@ -640,7 +642,7 @@ static int init_udevd_socket(void)
 
        udevd_sock = socket(AF_LOCAL, SOCK_DGRAM, 0);
        if (udevd_sock == -1) {
-               err("error getting socket, %s", strerror(errno));
+               err("error getting socket: %s", strerror(errno));
                return -1;
        }
 
@@ -650,7 +652,7 @@ static int init_udevd_socket(void)
        /* the bind takes care of ensuring only one copy running */
        retval = bind(udevd_sock, (struct sockaddr *) &saddr, addrlen);
        if (retval < 0) {
-               err("bind failed, %s", strerror(errno));
+               err("bind failed: %s", strerror(errno));
                return -1;
        }
 
@@ -673,7 +675,7 @@ static int init_uevent_netlink_sock(void)
 
        uevent_netlink_sock = socket(PF_NETLINK, SOCK_DGRAM, NETLINK_KOBJECT_UEVENT);
        if (uevent_netlink_sock == -1) {
-               err("error getting socket, %s", strerror(errno));
+               err("error getting socket: %s", strerror(errno));
                return -1;
        }
 
@@ -682,7 +684,7 @@ static int init_uevent_netlink_sock(void)
 
        retval = bind(uevent_netlink_sock, (struct sockaddr *) &snl, sizeof(struct sockaddr_nl));
        if (retval < 0) {
-               err("bind failed, %s", strerror(errno));
+               err("bind failed: %s", strerror(errno));
                close(uevent_netlink_sock);
                uevent_netlink_sock = -1;
                return -1;
@@ -717,7 +719,7 @@ int main(int argc, char *argv[], char *envp[])
 
        logging_init("udevd");
        if (fd < 0)
-               err("fatal, could not open /dev/null");
+               err("fatal, could not open /dev/null: %s", strerror(errno));
 
        udev_init_config();
        dbg("version %s", UDEV_VERSION);
@@ -743,10 +745,10 @@ int main(int argc, char *argv[], char *envp[])
        /* init sockets to receive events */
        if (init_udevd_socket() < 0) {
                if (errno == EADDRINUSE) {
-                       dbg("another udevd running, exit");
+                       err("another udevd running, exit");
                        rc = 1;
                } else {
-                       dbg("error initializing udevd socket: %s", strerror(errno));
+                       err("error initializing udevd socket: %s", strerror(errno));
                        rc = 2;
                }
                goto exit;
@@ -770,7 +772,7 @@ int main(int argc, char *argv[], char *envp[])
                        dbg("daemonized fork running");
                        break;
                case -1:
-                       err("fork of daemon failed");
+                       err("fork of daemon failed: %s", strerror(errno));
                        rc = 4;
                        goto exit;
                default:
@@ -792,7 +794,7 @@ int main(int argc, char *argv[], char *envp[])
        /* OOM_DISABLE == -17 */
        fd = open("/proc/self/oom_adj", O_RDWR);
        if (fd < 0)
-               err("error disabling OOM");
+               err("error disabling OOM: %s", strerror(errno));
        else {
                write(fd, "-17", 3);
                close(fd);
@@ -872,7 +874,7 @@ int main(int argc, char *argv[], char *envp[])
                fdcount = select(maxfd+1, &readfds, NULL, NULL, NULL);
                if (fdcount < 0) {
                        if (errno != EINTR)
-                               dbg("error in select: %s", strerror(errno));
+                               err("error in select: %s", strerror(errno));
                        continue;
                }