From 909c300c77fa1bb4d48c8fee607c7b83ef62cfcd Mon Sep 17 00:00:00 2001 From: Norayr Chilingarian Date: Thu, 7 May 2020 23:33:11 +0400 Subject: [PATCH] FsHelper checks if file/dir/symlink etc exists --- src/vpkFsHelper.Mod | 81 ++++++++++++++++++++++++++++++++++++- unit_tests/makefile | 9 +++++ unit_tests/testFsHelper.Mod | 25 ++++++++++++ 3 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 unit_tests/makefile create mode 100644 unit_tests/testFsHelper.Mod diff --git a/src/vpkFsHelper.Mod b/src/vpkFsHelper.Mod index 402f821..843ceb4 100644 --- a/src/vpkFsHelper.Mod +++ b/src/vpkFsHelper.Mod @@ -1,10 +1,39 @@ MODULE vpkFsHelper; IMPORT SYSTEM; +CONST + dir* = 0; char* = 1; block* = 2; file* = 3; fifo* = 4; + symlink* = 5; socket* = 6; + +TYPE + fileInfo* = RECORD; + name* : ARRAY 64 OF CHAR; + attr- : SET + END; + + Status = RECORD (* struct stat *) + dev* : HUGEINT; (* dev_t 8 *) + ino* : HUGEINT; (* ino 8 *) + nlink* : HUGEINT; + mode* : LONGINT; + uid*, gid*: LONGINT; + pad0* : LONGINT; + rdev* : HUGEINT; + size* : HUGEINT; + blksize* : HUGEINT; + blocks* : HUGEINT; + atime* : HUGEINT; + atimences* : HUGEINT; + mtime* : HUGEINT; + mtimensec* : HUGEINT; + ctime* : HUGEINT; + ctimensec* : HUGEINT; + unused0*, unused1*, unused2*: HUGEINT; + END; + PROCEDURE -Aincludesysstat '#include '; PROCEDURE -Aincludesystypes '#include '; - PROCEDURE -mkdir(VAR path: ARRAY OF CHAR): INTEGER "(int)mkdir(path, 0755)"; @@ -15,6 +44,56 @@ BEGIN IF res = 0 THEN RETURN TRUE ELSE RETURN FALSE END END mkDir; +PROCEDURE -stat(VAR path : ARRAY OF CHAR; st: Status): INTEGER +"stat((const char*)path, (struct stat*)&st)"; + +PROCEDURE -isDir(mode: LONGINT): INTEGER +"S_ISDIR(mode)"; + +PROCEDURE -isChar(mode: LONGINT): INTEGER +"S_ISCHR(mode)"; + +PROCEDURE -isBlock(mode: LONGINT): INTEGER +"S_ISBLK(mode)"; + +PROCEDURE -isReg(mode: LONGINT): INTEGER +"S_ISREG(mode)"; + +PROCEDURE -isFIFO(mode: LONGINT): INTEGER +"S_ISFIFO(mode)"; + +PROCEDURE -isLnk(mode: LONGINT): INTEGER +"S_ISLNK(mode)"; + +PROCEDURE -isSock(mode: LONGINT): INTEGER +"S_ISSOCK(mode)"; + +PROCEDURE Exists*(VAR fl : fileInfo): BOOLEAN; +VAR + i : INTEGER; + st: Status; +BEGIN + fl.attr := {}; + i := stat(fl.name, st); + IF i < 0 THEN RETURN FALSE END; + IF i = 0 THEN (* file exists*) + i := isDir(st.mode); + IF i # 0 THEN fl.attr := fl.attr + {dir} END; + i := isChar(st.mode); + IF i # 0 THEN fl.attr := fl.attr + {char} END; + i := isBlock(st.mode); + IF i # 0 THEN fl.attr := fl.attr + {block} END; + i := isReg(st.mode); + IF i # 0 THEN fl.attr := fl.attr + {file} END; + i := isFIFO(st.mode); + IF i # 0 THEN fl.attr := fl.attr + {fifo} END; + i := isLnk(st.mode); + IF i # 0 THEN fl.attr := fl.attr + {symlink} END; + i := isSock(st.mode); + IF i # 0 THEN fl.attr := fl.attr + {socket} END; + RETURN TRUE + END; +END Exists; END vpkFsHelper. diff --git a/unit_tests/makefile b/unit_tests/makefile new file mode 100644 index 0000000..4b3b456 --- /dev/null +++ b/unit_tests/makefile @@ -0,0 +1,9 @@ +BLD = build +VOC = /opt/voc/bin/voc + +all: + mkdir -p $(BLD) + cd $(BLD) && $(VOC) -s ../../src/vpkFsHelper.Mod ../testFsHelper.Mod -m + +clean: + rm -rf $(BLD) diff --git a/unit_tests/testFsHelper.Mod b/unit_tests/testFsHelper.Mod new file mode 100644 index 0000000..505a3c8 --- /dev/null +++ b/unit_tests/testFsHelper.Mod @@ -0,0 +1,25 @@ +MODULE testFsHelper; +IMPORT Out, vpkFsHelper; + +VAR + dir : ARRAY 64 OF CHAR; + f : vpkFsHelper.fileInfo; + b : BOOLEAN; +BEGIN + dir := "/home"; + f.name := "/home"; + + IF vpkFsHelper.Exists(f) THEN + Out.String("exists"); Out.Ln; + IF vpkFsHelper.dir IN f.attr THEN Out.String("directory"); Out.Ln; END; + IF vpkFsHelper.char IN f.attr THEN Out.String("char"); Out.Ln; END; + IF vpkFsHelper.block IN f.attr THEN Out.String("block"); Out.Ln; END; + IF vpkFsHelper.file IN f.attr THEN Out.String("file"); Out.Ln; END; + IF vpkFsHelper.fifo IN f.attr THEN Out.String("fifo"); Out.Ln; END; + IF vpkFsHelper.symlink IN f.attr THEN Out.String("symlink"); Out.Ln; END; + IF vpkFsHelper.socket IN f.attr THEN Out.String("socket"); Out.Ln; END; + ELSE + Out.String("does not exist"); Out.Ln; + END; + +END testFsHelper.