+ err("unable to receive udevd message: %s", strerror(errno));
+ return NULL;
+ }
+ cmsg = CMSG_FIRSTHDR(&smsg);
+ cred = (struct ucred *) CMSG_DATA(cmsg);
+
+ if (cmsg == NULL || cmsg->cmsg_type != SCM_CREDENTIALS) {
+ err("no sender credentials received, message ignored");
+ return NULL;
+ }
+
+ if (cred->uid != 0) {
+ err("sender uid=%i, message ignored", cred->uid);
+ return NULL;
+ }
+
+ if (strncmp(usend_msg.magic, UDEV_MAGIC, sizeof(UDEV_MAGIC)) != 0 ) {
+ err("message magic '%s' doesn't match, ignore it", usend_msg.magic);
+ return NULL;
+ }
+
+ switch (usend_msg.type) {
+ case UDEVD_UEVENT_UDEVSEND:
+ case UDEVD_UEVENT_INITSEND:
+ info("udevd event message received");
+ envbuf_size = size - offsetof(struct udevd_msg, envbuf);
+ dbg("envbuf_size=%i", envbuf_size);
+ msg = get_msg_from_envbuf(usend_msg.envbuf, envbuf_size);
+ if (msg == NULL)
+ return NULL;
+ msg->type = usend_msg.type;
+ return msg;
+ case UDEVD_STOP_EXEC_QUEUE:
+ info("udevd message (STOP_EXEC_QUEUE) received");
+ stop_exec_q = 1;
+ break;
+ case UDEVD_START_EXEC_QUEUE:
+ info("udevd message (START_EXEC_QUEUE) received");
+ stop_exec_q = 0;
+ msg_queue_manager();
+ break;
+ case UDEVD_SET_LOG_LEVEL:
+ intval = (int *) usend_msg.envbuf;
+ info("udevd message (SET_LOG_PRIORITY) received, udev_log_priority=%i", *intval);
+ udev_log_priority = *intval;
+ sprintf(udev_log, "UDEV_LOG=%i", udev_log_priority);
+ putenv(udev_log);
+ break;
+ case UDEVD_SET_MAX_CHILDS:
+ intval = (int *) usend_msg.envbuf;
+ info("udevd message (UDEVD_SET_MAX_CHILDS) received, max_childs=%i", *intval);
+ max_childs = *intval;
+ break;
+ case UDEVD_RELOAD_RULES:
+ info("udevd message (RELOAD_RULES) received");
+ reload_config = 1;
+ break;
+ default:
+ dbg("unknown message type");
+ }
+ return NULL;
+}
+
+/* receive the kernel user event message and do some sanity checks */
+static struct uevent_msg *get_netlink_msg(void)
+{
+ struct uevent_msg *msg;
+ int bufpos;
+ ssize_t size;
+ static char buffer[UEVENT_BUFFER_SIZE + 512];
+ char *pos;
+
+ size = recv(uevent_netlink_sock, &buffer, sizeof(buffer), 0);
+ if (size < 0) {
+ if (errno != EINTR)
+ err("unable to receive udevd message: %s", strerror(errno));
+ return NULL;