+ if (asprintf(&from, "%s/dev/kmsg", dest) < 0) {
+ log_error("Out of memory");
+ r = -ENOMEM;
+ goto finish;
+ }
+
+ if (asprintf(&to, "%s/proc/kmsg", dest) < 0) {
+ log_error("Out of memory");
+ r = -ENOMEM;
+ goto finish;
+ }
+
+ if (mkfifo(from, 0600) < 0) {
+ log_error("mkfifo() for /dev/kmsg failed: %m");
+ r = -errno;
+ goto finish;
+ }
+
+ r = chmod_and_chown(from, 0600, 0, 0);
+ if (r < 0) {
+ log_error("Failed to correct access mode for /dev/kmsg: %s", strerror(-r));
+ goto finish;
+ }
+
+ if (mount(from, to, "bind", MS_BIND, NULL) < 0) {
+ log_error("Bind mount for /proc/kmsg failed: %m");
+ r = -errno;
+ goto finish;
+ }
+
+ fd = open(from, O_RDWR|O_NDELAY|O_CLOEXEC);
+ if (fd < 0) {
+ log_error("Failed to open fifo: %m");
+ r = -errno;
+ goto finish;
+ }
+
+ zero(mh);
+ zero(control);
+
+ mh.msg_control = &control;
+ mh.msg_controllen = sizeof(control);
+
+ cmsg = CMSG_FIRSTHDR(&mh);
+ cmsg->cmsg_level = SOL_SOCKET;
+ cmsg->cmsg_type = SCM_RIGHTS;
+ cmsg->cmsg_len = CMSG_LEN(sizeof(int));
+ memcpy(CMSG_DATA(cmsg), &fd, sizeof(int));
+
+ mh.msg_controllen = cmsg->cmsg_len;
+
+ /* Store away the fd in the socket, so that it stays open as
+ * long as we run the child */
+ k = sendmsg(kmsg_socket, &mh, MSG_DONTWAIT|MSG_NOSIGNAL);
+ close_nointr_nofail(fd);
+
+ if (k < 0) {
+ log_error("Failed to send FIFO fd: %m");
+ r = -errno;
+ goto finish;