- envbuf_size = size - offsetof(struct udevsend_msg, envbuf);
- dbg("envbuf_size=%i", envbuf_size);
- msg = malloc(sizeof(struct hotplug_msg) + envbuf_size);
- if (msg == NULL)
- return NULL;
-
- memset(msg, 0x00, sizeof(struct hotplug_msg) + envbuf_size);
-
- /* copy environment buffer and reconstruct envp */
- memcpy(msg->envbuf, usend_msg.envbuf, envbuf_size);
- bufpos = 0;
- for (i = 0; (bufpos < envbuf_size) && (i < HOTPLUG_NUM_ENVP-2); i++) {
- int keylen;
- char *key;
+ 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;
+}