+
+ msg_dump_queue();
+
+ if (list_empty(&msg_list) == 0) {
+ /* set timeout for remaining queued events */
+ struct itimerval itv = {{0, 0}, {EVENT_TIMEOUT_SEC - msg_age, 0}};
+ dbg("next event expires in %li seconds",
+ EVENT_TIMEOUT_SEC - msg_age);
+ setitimer(ITIMER_REAL, &itv, 0);
+ }
+}
+
+/* receive the msg, do some basic sanity checks, and queue it */
+static void handle_msg(int sock)
+{
+ struct hotplug_msg *msg;
+ int retval;
+ struct msghdr smsg;
+ struct cmsghdr *cmsg;
+ struct iovec iov;
+ struct ucred *cred;
+ char cred_msg[CMSG_SPACE(sizeof(struct ucred))];
+
+ msg = msg_create();
+ if (msg == NULL) {
+ dbg("unable to store message");
+ return;
+ }
+
+ iov.iov_base = msg;
+ iov.iov_len = sizeof(struct hotplug_msg);
+
+ memset(&smsg, 0x00, sizeof(struct msghdr));
+ smsg.msg_iov = &iov;
+ smsg.msg_iovlen = 1;
+ smsg.msg_control = cred_msg;
+ smsg.msg_controllen = sizeof(cred_msg);
+
+ retval = recvmsg(sock, &smsg, 0);
+ if (retval < 0) {
+ if (errno != EINTR)
+ dbg("unable to receive message");
+ return;
+ }
+ cmsg = CMSG_FIRSTHDR(&smsg);
+ cred = (struct ucred *) CMSG_DATA(cmsg);
+
+ if (cmsg == NULL || cmsg->cmsg_type != SCM_CREDENTIALS) {
+ dbg("no sender credentials received, message ignored");
+ goto skip;
+ }
+
+ if (cred->uid != 0) {
+ dbg("sender uid=%i, message ignored", cred->uid);
+ goto skip;
+ }
+
+ if (strncmp(msg->magic, UDEV_MAGIC, sizeof(UDEV_MAGIC)) != 0 ) {
+ dbg("message magic '%s' doesn't match, ignore it", msg->magic);
+ goto skip;
+ }
+
+ /* if no seqnum is given, we move straight to exec queue */
+ if (msg->seqnum == -1) {
+ list_add(&msg->list, &exec_list);
+ exec_queue_manager();
+ } else {
+ msg_queue_insert(msg);
+ }
+ return;
+
+skip:
+ free(msg);
+ return;