chiark / gitweb /
udev: unify /dev static symlink setup
authorKay Sievers <kay@vrfy.org>
Tue, 17 Apr 2012 20:25:24 +0000 (22:25 +0200)
committerKay Sievers <kay@vrfy.org>
Tue, 17 Apr 2012 20:31:38 +0000 (22:31 +0200)
Makefile.am
TODO
src/core/mount-setup.c
src/shared/dev-setup.c [new file with mode: 0644]
src/shared/dev-setup.h [new file with mode: 0644]
src/udev/udevd.c

index 7e6f520..0285c8b 100644 (file)
@@ -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 9ef61ab..c85848d 100644 (file)
--- 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
 
index 30046a5..961773b 100644 (file)
@@ -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 (file)
index 0000000..0b3d648
--- /dev/null
@@ -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 (file)
index 0000000..5850758
--- /dev/null
@@ -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
index 1675114..1625510 100644 (file)
@@ -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 */