summaryrefslogtreecommitdiffstats
path: root/src/basic/generate-filesystem-switch-case.py
blob: bbd09228e19fd0467a596f6e68082925837bb54e (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#!/usr/bin/env python3
# SPDX-License-Identifier: LGPL-2.1-or-later

import sys


def filter_fsname(name):
    # File system magics are sometimes not unique, because file systems got new
    # revisions or got renamed. Let's prefer newer over older here, and thus
    # ignore the old names.

    return name in {
        "cpuset",    # magic taken over by cgroupfs
        "devtmpfs",  # not a file system of its own, but just a "named superblock" of tmpfs
        "ext2",      # ext4 is the newest revision of ext2 + ext3
        "ext3",
        "fuseblk",   # closely related to fuse; they share a single magic, but the latter is more common
        "gfs",       # magic taken over by gfs2
        "msdos",     # vfat is the newest revision of msdos
        "ncp",       # ncpfs (not ncp) was the last name of the netware `file_system_type`
                     # name before it was removed in 2018
        "nfs",       # nfs4 is the newest revision of nfs
        "pvfs2",     # orangefs is the new name of pvfs2
        "smb3",      # smb3 is an alias for cifs
    }


gperf_file = sys.argv[1]
keywords_section = False

for line in open(gperf_file):
    if line[0] == "#":
        continue

    if keywords_section:
        name, ids = line.split(",", 1)

        name = name.strip()
        if filter_fsname(name):
            continue

        ids = ids.strip()
        assert ids[0] == "{"
        assert ids[-1] == "}"
        ids = ids[1:-1]

        for id in ids.split(","):
            print(f"case (statfs_f_type_t) {id.strip()}:")

        print(f'        return "{name}";')

    if line.startswith("%%"):
        keywords_section = True