- if (pmsg->seqnum > expect_seqnum) {
- add_queue(pmsg);
- set_timer(EVENT_TIMEOUT_SECONDS);
- } else {
- if (pmsg->seqnum == expect_seqnum) {
- dispatch_msg(pmsg);
- expect_seqnum++;
- check_queue();
- } else {
- dbg("timeout event for unexpected sequence number %d", pmsg->seqnum);
- }
- }
- } else {
- if (errno == EINTR) {
- if (head != NULL) {
- /* event timeout, skip all missing, proceed with next queued event */
- info("timeout reached, skip events %d - %d", expect_seqnum, head->seqnum-1);
- expect_seqnum = head->seqnum;
- } else {
- info("we have nothing to do, so daemon exits...");
- if (lock_file >= 0) {
- close(lock_file);
- unlink(lock_filename);
- }
- exit(0);
- }
- check_queue();
- } else {
- dbg("ipc message receive error '%s'", strerror(errno));
- }
- }
+ if (cmsg == NULL || cmsg->cmsg_type != SCM_CREDENTIALS) {
+ dbg("no sender credentials received, message ignored");
+ goto exit;
+ }
+
+ if (cred->uid != 0) {
+ dbg("sender uid=%i, message ignored", cred->uid);
+ goto exit;
+ }
+
+ if (strncmp(usend_msg.magic, UDEV_MAGIC, sizeof(UDEV_MAGIC)) != 0 ) {
+ dbg("message magic '%s' doesn't match, ignore it", usend_msg.magic);
+ goto exit;
+ }
+
+ envbuf_size = size - offsetof(struct udevsend_msg, envbuf);
+ dbg("envbuf_size=%i", envbuf_size);
+ msg = malloc(sizeof(struct hotplug_msg) + envbuf_size);
+ 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;
+
+ key = &msg->envbuf[bufpos];
+ keylen = strlen(key);
+ msg->envp[i] = key;
+ bufpos += keylen + 1;
+ dbg("add '%s' to msg.envp[%i]", msg->envp[i], i);
+
+ /* remember some keys for further processing */
+ if (strncmp(key, "ACTION=", 7) == 0)
+ msg->action = &key[7];
+
+ if (strncmp(key, "DEVPATH=", 8) == 0)
+ msg->devpath = &key[8];
+
+ if (strncmp(key, "SUBSYSTEM=", 10) == 0)
+ msg->subsystem = &key[10];
+
+ if (strncmp(key, "SEQNUM=", 7) == 0)
+ msg->seqnum = strtoull(&key[7], NULL, 10);