diff options
author | Lennart Poettering <lennart@poettering.net> | 2015-10-20 12:22:32 +0200 |
---|---|---|
committer | Lennart Poettering <lennart@poettering.net> | 2015-10-20 12:22:32 +0200 |
commit | c91960c5a04a3515c43f50a358588f056b8575a6 (patch) | |
tree | 1f6406d2604cc67f455ca5790b19acc65eb345c7 /src/basic | |
parent | 824b35c3859bc99b97ac5fa6e09aa34627e9bcd5 (diff) | |
parent | d167824896e583ffaca891b1c355ff852496ff66 (diff) |
Merge pull request #1619 from iaguis/nspawn-sysfs-netns-3
nspawn: skip /sys-as-tmpfs if we don't use private-network
Diffstat (limited to 'src/basic')
-rw-r--r-- | src/basic/util.c | 30 | ||||
-rw-r--r-- | src/basic/util.h | 6 |
2 files changed, 33 insertions, 3 deletions
diff --git a/src/basic/util.c b/src/basic/util.c index a14ed2e4cc..3e90456dd3 100644 --- a/src/basic/util.c +++ b/src/basic/util.c @@ -2500,11 +2500,35 @@ char *getusername_malloc(void) { return lookup_uid(getuid()); } -bool is_temporary_fs(const struct statfs *s) { +bool is_fs_type(const struct statfs *s, statfs_f_type_t magic_value) { assert(s); + assert_cc(sizeof(statfs_f_type_t) >= sizeof(s->f_type)); + + return F_TYPE_EQUAL(s->f_type, magic_value); +} + +int fd_check_fstype(int fd, statfs_f_type_t magic_value) { + struct statfs s; + + if (fstatfs(fd, &s) < 0) + return -errno; + + return is_fs_type(&s, magic_value); +} + +int path_check_fstype(const char *path, statfs_f_type_t magic_value) { + _cleanup_close_ int fd = -1; - return F_TYPE_EQUAL(s->f_type, TMPFS_MAGIC) || - F_TYPE_EQUAL(s->f_type, RAMFS_MAGIC); + fd = open(path, O_RDONLY); + if (fd < 0) + return -errno; + + return fd_check_fstype(fd, magic_value); +} + +bool is_temporary_fs(const struct statfs *s) { + return is_fs_type(s, TMPFS_MAGIC) || + is_fs_type(s, RAMFS_MAGIC); } int fd_is_temporary_fs(int fd) { diff --git a/src/basic/util.h b/src/basic/util.h index 4b1c5878c5..ff39eae715 100644 --- a/src/basic/util.h +++ b/src/basic/util.h @@ -365,6 +365,12 @@ char* getusername_malloc(void); int chmod_and_chown(const char *path, mode_t mode, uid_t uid, gid_t gid); int fchmod_and_fchown(int fd, mode_t mode, uid_t uid, gid_t gid); +typedef long statfs_f_type_t; + +bool is_fs_type(const struct statfs *s, statfs_f_type_t magic_value) _pure_; +int fd_check_fstype(int fd, statfs_f_type_t magic_value); +int path_check_fstype(const char *path, statfs_f_type_t magic_value); + bool is_temporary_fs(const struct statfs *s) _pure_; int fd_is_temporary_fs(int fd); |