Index: systemd-210/Makefile.am =================================================================== --- systemd-210.orig/Makefile.am +++ systemd-210/Makefile.am @@ -2791,6 +2791,25 @@ EXTRA_DIST += \ test/rule-syntax-check.py # ------------------------------------------------------------------------------ +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 Index: systemd-210/src/udev/rootsymlink_generator/rootsymlink_generator.c =================================================================== --- /dev/null +++ systemd-210/src/udev/rootsymlink_generator/rootsymlink_generator.c @@ -0,0 +1,65 @@ +/* + * 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() +{ + struct stat statbuf; + + if (stat(_ROOTDEV_, &statbuf) != 0) + return 1; + + if (major(statbuf.st_dev) > 0) { + int fd = -1; + char filename[BUFFER_SIZE]; + + if (mkdir(_PATH_, 0755) != 0 && errno != EEXIST) + return errno; + + snprintf(filename, BUFFER_SIZE, "%s/%s", _PATH_, _FILE_); + + if ((fd = open(filename, O_CREAT|O_WRONLY|O_TRUNC, 0644)) == -1) + return errno; + else { + char buf[BUFFER_SIZE]; + + 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)) == -1) + return errno; + + if (close(fd) == -1) + return errno; + } + } + + return 0; +} Index: systemd-210/units/systemd-udev-root-symlink.service.in =================================================================== --- /dev/null +++ systemd-210/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 Index: systemd-210/units/systemd-udev-root-symlink.service =================================================================== --- /dev/null +++ systemd-210/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