fw4: simplify `is_loopback_dev()`
authorJo-Philipp Wich <jo@mein.io>
Mon, 13 Jun 2022 13:23:23 +0000 (15:23 +0200)
committerJo-Philipp Wich <jo@mein.io>
Tue, 14 Jun 2022 14:54:06 +0000 (16:54 +0200)
Use `fs.readfile()` to simplify the code reading flag values from sysfs.

Also add a mock implementation of `fs.readfile()` using the same mock
data files as `fs.open()`.

Signed-off-by: Jo-Philipp Wich <jo@mein.io>
root/usr/share/ucode/fw4.uc
tests/01_configuration/01_ruleset
tests/lib/mocklib/fs.uc

index d600528c80cee92d4cb818cc7f856a265a4516f2..db1e580ba0e9ee70c1e7bdb00213d819be074203 100644 (file)
@@ -1651,16 +1651,7 @@ return {
        },
 
        is_loopback_dev: function(dev) {
-               let fd = fs.open(`/sys/class/net/${dev}/flags`, "r");
-
-               if (!fd)
-                       return false;
-
-               let flags = +fd.read("line");
-
-               fd.close();
-
-               return !!(flags & 0x8);
+               return !!(+fs.readfile(`/sys/class/net/${dev}/flags`) & 0x8);
        },
 
        is_loopback_addr: function(addr) {
index dd9750cba22e14025cb438ffdcba9fccc55d5f00..1bf8f721de92f972a878452a2134d88bdc922010 100644 (file)
@@ -316,6 +316,6 @@ table inet fw4 {
                }
        ' 2>/dev/null> timeout <null>
 [call] fs.popen cmdline </usr/sbin/nft --terse --json list flowtables inet> mode <r>
-[call] fs.open path </sys/class/net/br-lan/flags> mode <r>
-[call] fs.open path </sys/class/net/br-lan/flags> mode <r>
+[call] fs.readfile path </sys/class/net/br-lan/flags> limit <null>
+[call] fs.readfile path </sys/class/net/br-lan/flags> limit <null>
 -- End --
index 3cb6252a777f231a465b7fea1f4ecd57cc92abe2..10f30746819219d7cf31b8b70d81174a209abf30 100644 (file)
@@ -135,6 +135,22 @@ return {
                };
        },
 
+       readfile: (fpath, limit) => {
+               let path = sprintf("fs/open~%s.txt", replace(fpath, /[^A-Za-z0-9_-]+/g, '_')),
+                   mock = mocklib.read_data_file(path);
+
+               if (!mock) {
+                       mocklib.I("No stdout fixture defined for fs.readfile() path %s.", fpath);
+                       mocklib.I("Provide a mock output through the following text file:\n%s\n", path);
+
+                       return null;
+               }
+
+               mocklib.trace_call("fs", "readfile", { path: fpath, limit });
+
+               return limit ? substr(mock, 0, limit) : mock;
+       },
+
        opendir: (path) => {
                let file = sprintf("fs/opendir~%s.json", replace(path, /[^A-Za-z0-9_-]+/g, '_')),
                    mock = mocklib.read_json_file(file),