From: Kay Sievers Date: Tue, 17 Apr 2012 20:25:24 +0000 (+0200) Subject: udev: unify /dev static symlink setup X-Git-Tag: v183~265 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=commitdiff_plain;h=5ba2dc259f3cdd8fddef68cfd28380a32534e49a;hp=1e8ebcdb5968d6e3bcfe6cf1ca4ed73dd1b671b3 udev: unify /dev static symlink setup --- 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 */