/* SPDX-License-Identifier: LGPL-2.1-or-later */ #include "filesystems-gperf.h" #include "stat-util.h" const char* fs_type_to_string(statfs_f_type_t magic) { switch (magic) { #include "filesystem-switch-case.h" } return NULL; } int fs_type_from_string(const char *name, const statfs_f_type_t **ret) { const struct FilesystemMagic *fs_magic; assert(name); assert(ret); fs_magic = filesystems_gperf_lookup(name, strlen(name)); if (!fs_magic) return -EINVAL; *ret = fs_magic->magic; return 0; } bool fs_in_group(const struct statfs *s, FilesystemGroups fs_group) { int r; NULSTR_FOREACH(fs, filesystem_sets[fs_group].value) { const statfs_f_type_t *magic; r = fs_type_from_string(fs, &magic); if (r >= 0) for (size_t i = 0; i < FILESYSTEM_MAGIC_MAX; i++) { if (magic[i] == 0) break; if (is_fs_type(s, magic[i])) return true; } } return false; } const FilesystemSet filesystem_sets[_FILESYSTEM_SET_MAX] = { [FILESYSTEM_SET_BASIC_API] = { .name = "@basic-api", .help = "Basic filesystem API", .value = "cgroup\0" "cgroup2\0" "devpts\0" "devtmpfs\0" "mqueue\0" "proc\0" "sysfs\0" }, [FILESYSTEM_SET_ANONYMOUS] = { .name = "@anonymous", .help = "Anonymous inodes", .value = "anon_inodefs\0" "pipefs\0" "sockfs\0" }, [FILESYSTEM_SET_APPLICATION] = { .name = "@application", .help = "Application virtual filesystems", .value = "autofs\0" "fuse\0" "overlay\0" }, [FILESYSTEM_SET_AUXILIARY_API] = { .name = "@auxiliary-api", .help = "Auxiliary filesystem API", .value = "binfmt_misc\0" "configfs\0" "efivarfs\0" "fusectl\0" "hugetlbfs\0" "rpc_pipefs\0" "securityfs\0" }, [FILESYSTEM_SET_COMMON_BLOCK] = { .name = "@common-block", .help = "Common block device filesystems", .value = "btrfs\0" "erofs\0" "exfat\0" "ext4\0" "f2fs\0" "iso9660\0" "ntfs3\0" "squashfs\0" "udf\0" "vfat\0" "xfs\0" }, [FILESYSTEM_SET_HISTORICAL_BLOCK] = { .name = "@historical-block", .help = "Historical block device filesystems", .value = "ext2\0" "ext3\0" "minix\0" }, [FILESYSTEM_SET_NETWORK] = { .name = "@network", .help = "Well-known network filesystems", .value = "afs\0" "ceph\0" "cifs\0" "gfs\0" "gfs2\0" "ncp\0" "ncpfs\0" "nfs\0" "nfs4\0" "ocfs2\0" "orangefs\0" "pvfs2\0" "smb3\0" "smbfs\0" }, [FILESYSTEM_SET_PRIVILEGED_API] = { .name = "@privileged-api", .help = "Privileged filesystem API", .value = "bpf\0" "debugfs\0" "pstore\0" "tracefs\0" }, [FILESYSTEM_SET_SECURITY] = { .name = "@security", .help = "Security/MAC API VFS", .value = "apparmorfs\0" "selinuxfs\0" "smackfs\0" }, [FILESYSTEM_SET_TEMPORARY] = { .name = "@temporary", .help = "Temporary filesystems", .value = "ramfs\0" "tmpfs\0" }, [FILESYSTEM_SET_KNOWN] = { .name = "@known", .help = "All known filesystems declared in the kernel", .value = #include "filesystem-list.h" }, }; const FilesystemSet *filesystem_set_find(const char *name) { if (isempty(name) || name[0] != '@') return NULL; for (FilesystemGroups i = 0; i < _FILESYSTEM_SET_MAX; i++) if (streq(filesystem_sets[i].name, name)) return filesystem_sets + i; return NULL; }