From 225979823280a8e34f7155c2bc201d345e1e798b Mon Sep 17 00:00:00 2001 From: Kay Sievers <kay@vrfy.org> Date: Tue, 17 Apr 2012 22:25:24 +0200 Subject: [PATCH] udev: unify /dev static symlink setup (cherry picked from commit 5ba2dc259f3cdd8fddef68cfd28380a32534e49a) Conflicts: TODO src/udev/udevd.c --- Makefile.am | 4 ++- src/core/mount-setup.c | 31 +++-------------------- src/shared/dev-setup.c | 65 ++++++++++++++++++++++++++++++++++++++++++++++++ src/shared/dev-setup.h | 27 ++++++++++++++++++++ 4 files changed, 98 insertions(+), 29 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 410b46b..dd1832e 100644 --- a/Makefile.am +++ b/Makefile.am @@ -545,7 +545,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/src/core/mount-setup.c b/src/core/mount-setup.c index eeec251..09ba8b7 100644 --- a/src/core/mount-setup.c +++ b/src/core/mount-setup.c @@ -30,6 +30,7 @@ #include <ftw.h> #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 0000000..0b3d648 --- /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 <http://www.gnu.org/licenses/>. +***/ + +#include <errno.h> +#include <sys/stat.h> +#include <stdlib.h> +#include <string.h> +#include <assert.h> +#include <unistd.h> + +#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 0000000..5850758 --- /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 <http://www.gnu.org/licenses/>. +***/ + +void dev_setup(void); + +#endif