+/* orders the message in the queue by sequence number */
+static void msg_queue_insert(struct hotplug_msg *msg)
+{
+ struct hotplug_msg *loop_msg;
+
+ /* sort message by sequence number into list*/
+ list_for_each_entry(loop_msg, &msg_list, list)
+ if (loop_msg->seqnum > msg->seqnum)
+ break;
+ list_add_tail(&msg->list, &loop_msg->list);
+ dbg("queued message seq %d", msg->seqnum);
+
+ /* store timestamp of queuing */
+ msg->queue_time = time(NULL);
+
+ /* run msg queue manager */
+ msg_queue_manager();
+
+ return ;
+}
+
+/* forks event and removes event from run queue when finished */
+static void udev_run(struct hotplug_msg *msg)
+{
+ pid_t pid;
+ char action[32];
+ char devpath[256];
+ char *env[] = { action, devpath, NULL };
+
+ snprintf(action, sizeof(action), "ACTION=%s", msg->action);
+ snprintf(devpath, sizeof(devpath), "DEVPATH=%s", msg->devpath);
+
+ pid = fork();
+ switch (pid) {
+ case 0:
+ /* child */
+ execle(UDEV_BIN, "udev", msg->subsystem, NULL, env);
+ dbg("exec of child failed");
+ exit(1);
+ break;
+ case -1:
+ dbg("fork of child failed");
+ run_queue_delete(msg);
+ break;
+ default:
+ /* get SIGCHLD in main loop */
+ dbg("==> exec seq %d [%d] working at '%s'", msg->seqnum, pid, msg->devpath);
+ msg->pid = pid;