X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=mount-setup.c;h=8cb77669f36740a359011daa6c031b894d81b8a5;hb=108736d0d34d7b74a61a6ac7b99d4d4fec81ce09;hp=5a2e89af7c8fa25f456094b090399b5a008f2eeb;hpb=dbd4655d8937fb870a6ec42889081ecd4b83ca98;p=elogind.git diff --git a/mount-setup.c b/mount-setup.c index 5a2e89af7..8cb77669f 100644 --- a/mount-setup.c +++ b/mount-setup.c @@ -29,6 +29,8 @@ #include "mount-setup.h" #include "log.h" +#include "macro.h" +#include "util.h" enum { MOUNT_WHAT, @@ -39,15 +41,28 @@ enum { }; static const char *table[] = { - "/proc", "/proc", "proc", "rw", - "/sys", "/sys", "sysfs", "rw", - "udev", "/dev", "devtmpfs", "rw", - "tmpfs", "/dev/shm", "tmpfs", "rw", - "devpts", "/dev/pts", "devpts", "rw", - "cgroup", "/cgroup/debug", "cgroup", "debug", - NULL + "proc", "/proc", "proc", NULL, + "sysfs", "/sys", "sysfs", NULL, + "devtmps", "/dev", "devtmpfs", "mode=755", + "tmpfs", "/dev/shm", "tmpfs", "mode=1777", + "devpts", "/dev/pts", "devpts", NULL, + "cgroup", "/cgroup/debug", "cgroup", "debug", + "debugfs", "/sys/kernel/debug", "debugfs", NULL, }; +bool mount_point_is_api(const char *path) { + unsigned i; + + /* Checks if this mount point is considered "API", and hence + * should be ignored */ + + for (i = 0; i < ELEMENTSOF(table); i += MOUNT_SKIP) + if (path_startswith(path, table[i+MOUNT_WHERE])) + return true; + + return false; +} + static int is_mount_point(const char *t) { struct stat a, b; char *copy; @@ -85,11 +100,15 @@ static int mount_one(const char *t[]) { if (r > 0) return 0; + /* The access mode here doesn't really matter too much, since + * the mounted file system will take precedence anyway. */ + mkdir_p(t[MOUNT_WHERE], 0755); + log_debug("Mounting %s to %s of type %s with options %s.", t[MOUNT_WHAT], t[MOUNT_WHERE], t[MOUNT_TYPE], - t[MOUNT_OPTIONS]); + strna(t[MOUNT_OPTIONS])); if (mount(t[MOUNT_WHAT], t[MOUNT_WHERE], @@ -105,10 +124,10 @@ static int mount_one(const char *t[]) { int mount_setup(void) { int r; - const char **t; + unsigned i; - for (t = table; *t; t += MOUNT_SKIP) - if ((r = mount_one(t)) < 0) + for (i = 0; i < ELEMENTSOF(table); i += MOUNT_SKIP) + if ((r = mount_one(table + i)) < 0) return r; return 0;