From 5ba2dc259f3cdd8fddef68cfd28380a32534e49a Mon Sep 17 00:00:00 2001 From: Kay Sievers Date: Tue, 17 Apr 2012 22:25:24 +0200 Subject: [PATCH] udev: unify /dev static symlink setup --- Makefile.am | 4 ++- TODO | 5 +++- src/core/mount-setup.c | 31 ++------------------ src/shared/dev-setup.c | 65 ++++++++++++++++++++++++++++++++++++++++++ src/shared/dev-setup.h | 27 ++++++++++++++++++ src/udev/udevd.c | 32 ++------------------- 6 files changed, 104 insertions(+), 60 deletions(-) create mode 100644 src/shared/dev-setup.c create mode 100644 src/shared/dev-setup.h diff --git a/Makefile.am b/Makefile.am index 7e6f52074..0285c8bee 100644 --- a/Makefile.am +++ b/Makefile.am @@ -559,7 +559,9 @@ libsystemd_shared_la_SOURCES = \ src/shared/specifier.c \ src/shared/specifier.h \ src/shared/spawn-polkit-agent.c \ - src/shared/spawn-polkit-agent.h + src/shared/spawn-polkit-agent.h \ + src/shared/dev-setup.c \ + src/shared/dev-setup.h libsystemd_shared_la_CFLAGS = \ $(AM_CFLAGS) \ diff --git a/TODO b/TODO index 9ef61ab43..c85848de9 100644 --- a/TODO +++ b/TODO @@ -22,7 +22,10 @@ Features: * suspend/hibernate/hybrid support, auto-suspend logic with idle hint -* udev: move strpcpy(), strpcpyl(), strscpy(), strscpyl() to shared/ +* udev systemd unify: + - strpcpy(), strpcpyl(), strscpy(), strscpyl() + - utf8 validator code + - now() vs. now_usec() * udev: find a way to tell udev to not cancel firmware requests when running in initramfs diff --git a/src/core/mount-setup.c b/src/core/mount-setup.c index 30046a51b..961773b1e 100644 --- a/src/core/mount-setup.c +++ b/src/core/mount-setup.c @@ -30,6 +30,7 @@ #include #include "mount-setup.h" +#include "dev-setup.h" #include "log.h" #include "macro.h" #include "util.h" @@ -323,24 +324,6 @@ finish: return r; } -static int symlink_and_label(const char *old_path, const char *new_path) { - int r; - - assert(old_path); - assert(new_path); - - r = label_context_set(new_path, S_IFLNK); - if (r < 0) - return r; - - if (symlink(old_path, new_path) < 0) - r = -errno; - - label_context_clear(); - - return r; -} - static int nftw_cb( const char *fpath, const struct stat *sb, @@ -365,20 +348,13 @@ static int nftw_cb( int mount_setup(bool loaded_policy) { - static const char symlinks[] = - "/proc/kcore\0" "/dev/core\0" - "/proc/self/fd\0" "/dev/fd\0" - "/proc/self/fd/0\0" "/dev/stdin\0" - "/proc/self/fd/1\0" "/dev/stdout\0" - "/proc/self/fd/2\0" "/dev/stderr\0"; - static const char relabel[] = "/run/initramfs/root-fsck\0" "/run/initramfs/shutdown\0"; int r; unsigned i; - const char *j, *k; + const char *j; for (i = 0; i < ELEMENTSOF(mount_table); i ++) { r = mount_one(mount_table + i, true); @@ -413,8 +389,7 @@ int mount_setup(bool loaded_policy) { /* Create a few default symlinks, which are normally created * by udevd, but some scripts might need them before we start * udevd. */ - NULSTR_FOREACH_PAIR(j, k, symlinks) - symlink_and_label(j, k); + dev_setup(); /* Create a few directories we always want around */ label_mkdir("/run/systemd", 0755); diff --git a/src/shared/dev-setup.c b/src/shared/dev-setup.c new file mode 100644 index 000000000..0b3d648ac --- /dev/null +++ b/src/shared/dev-setup.c @@ -0,0 +1,65 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +/*** + This file is part of systemd. + + Copyright 2010-2012 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +#include +#include +#include +#include +#include +#include + +#include "dev-setup.h" +#include "log.h" +#include "macro.h" +#include "util.h" +#include "label.h" + +static int symlink_and_label(const char *old_path, const char *new_path) { + int r; + + assert(old_path); + assert(new_path); + + r = label_context_set(new_path, S_IFLNK); + if (r < 0) + return r; + + if (symlink(old_path, new_path) < 0) + r = -errno; + + label_context_clear(); + + return r; +} + +void dev_setup(void) { + const char *j, *k; + + static const char symlinks[] = + "/proc/kcore\0" "/dev/core\0" + "/proc/self/fd\0" "/dev/fd\0" + "/proc/self/fd/0\0" "/dev/stdin\0" + "/proc/self/fd/1\0" "/dev/stdout\0" + "/proc/self/fd/2\0" "/dev/stderr\0"; + + NULSTR_FOREACH_PAIR(j, k, symlinks) + symlink_and_label(j, k); +} diff --git a/src/shared/dev-setup.h b/src/shared/dev-setup.h new file mode 100644 index 000000000..58507587d --- /dev/null +++ b/src/shared/dev-setup.h @@ -0,0 +1,27 @@ +/*-*- Mode: C; c-basic-offset: 8; indent-tabs-mode: nil -*-*/ + +#ifndef foodevsetuphfoo +#define foodevsetuphfoo + +/*** + This file is part of systemd. + + Copyright 2010-2012 Lennart Poettering + + systemd is free software; you can redistribute it and/or modify it + under the terms of the GNU Lesser General Public License as published by + the Free Software Foundation; either version 2.1 of the License, or + (at your option) any later version. + + systemd 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 + Lesser General Public License for more details. + + You should have received a copy of the GNU Lesser General Public License + along with systemd; If not, see . +***/ + +void dev_setup(void); + +#endif diff --git a/src/udev/udevd.c b/src/udev/udevd.c index 16751144b..162551098 100644 --- a/src/udev/udevd.c +++ b/src/udev/udevd.c @@ -47,6 +47,7 @@ #include "udev.h" #include "sd-daemon.h" #include "cgroup-util.h" +#include "dev-setup.h" static bool debug; @@ -868,34 +869,6 @@ static void static_dev_create_from_modules(struct udev *udev) fclose(f); } -/* needed for standalone udev operations */ -static void static_dev_create_links(struct udev *udev) -{ - struct stdlinks { - const char *link; - const char *target; - }; - static const struct stdlinks stdlinks[] = { - { "/dev/core", "/proc/kcore" }, - { "/dev/fd", "/proc/self/fd" }, - { "/dev/stdin", "/proc/self/fd/0" }, - { "/dev/stdout", "/proc/self/fd/1" }, - { "/dev/stderr", "/proc/self/fd/2" }, - }; - unsigned int i; - - for (i = 0; i < ELEMENTSOF(stdlinks); i++) { - struct stat sb; - - if (stat(stdlinks[i].target, &sb) == 0) { - label_context_set(stdlinks[i].link, S_IFLNK); - if (symlink(stdlinks[i].target, stdlinks[i].link) < 0 && errno == EEXIST) - utimensat(AT_FDCWD, stdlinks[i].link, NULL, AT_SYMLINK_NOFOLLOW); - label_context_clear(); - } - } -} - static int mem_size_mb(void) { FILE *f; @@ -1179,8 +1152,7 @@ int main(int argc, char *argv[]) mkdir("/run/udev", 0755); - /* create standard links, copy static nodes, create nodes from modules */ - static_dev_create_links(udev); + dev_setup(); static_dev_create_from_modules(udev); /* before opening new files, make sure std{in,out,err} fds are in a sane state */ -- 2.30.2