--- Makefile.am | 19 +++++ src/udev/rootsymlink_generator/rootsymlink_generator.c | 57 +++++++++++++++++ units/systemd-udev-root-symlink.service | 10 ++ units/systemd-udev-root-symlink.service.in | 10 ++ 4 files changed, 96 insertions(+) --- systemd-222.orig/Makefile.am +++ systemd-222/Makefile.am @@ -3759,6 +3759,25 @@ EXTRA_DIST += \ test/mocks/fsck # ------------------------------------------------------------------------------ +rootsymlink_generator_SOURCES = \ + src/udev/rootsymlink_generator/rootsymlink_generator.c + +rootsymlink_generator_CFLAGS = \ + $(AM_CFLAGS) + +udevlibexec_PROGRAMS += \ + rootsymlink-generator + +nodist_systemunit_DATA += \ + units/systemd-udev-root-symlink.service + +SYSINIT_TARGET_WANTS += \ + systemd-udev-root-symlink.service + +EXTRA_DIST += \ + units/systemd-udev-root-symlink.service.in + +# ------------------------------------------------------------------------------ ata_id_SOURCES = \ src/udev/ata_id/ata_id.c --- /dev/null +++ systemd-222/src/udev/rootsymlink_generator/rootsymlink_generator.c @@ -0,0 +1,57 @@ +/* + * Copyright (C) 2014-2015 Robert Milasan + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include +#include +#include + +#define BUFFER_SIZE 128 + +#define _ROOTDEV_ "/" +#define _PATH_ "/run/udev/rules.d" +#define _FILE_ "10-root-symlink.rules" + +int main(void) +{ + char filename[BUFFER_SIZE], buf[BUFFER_SIZE]; + struct stat statbuf; + int fd; + + if (stat(_ROOTDEV_, &statbuf) < 0) + return 1; + if (major(statbuf.st_dev) <= 0) + return 0; + if (mkdir(_PATH_, 0755) < 0 && errno != EEXIST) + return errno; + snprintf(filename, BUFFER_SIZE, "%s/%s", _PATH_, _FILE_); + fd = open(filename, O_CREAT | O_WRONLY | O_TRUNC, 0644); + if (fd < 0) + return errno; + snprintf(buf, BUFFER_SIZE, + "ACTION==\"add|change\", SUBSYSTEM==\"block\", " + "ENV{MAJOR}==\"%d\", ENV{MINOR}==\"%d\", SYMLINK+=\"root\"\n", + major(statbuf.st_dev), minor(statbuf.st_dev)); + if (write(fd, buf, strlen(buf)) < 0) + return errno; + if (close(fd) < 0) + return errno; + return 0; +} --- /dev/null +++ systemd-222/units/systemd-udev-root-symlink.service @@ -0,0 +1,10 @@ +[Unit] +Description=Rule generator for /dev/root symlink +Before=systemd-udevd.service +DefaultDependencies=no +ConditionPathIsReadWrite=/run/udev + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/lib/udev/rootsymlink-generator --- /dev/null +++ systemd-222/units/systemd-udev-root-symlink.service.in @@ -0,0 +1,10 @@ +[Unit] +Description=Rule generator for /dev/root symlink +Before=systemd-udevd.service +DefaultDependencies=no +ConditionPathIsReadWrite=/run/udev + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=@udevlibexec@/rootsymlink-generator