diff options
Diffstat (limited to 'cmds/test.go')
-rw-r--r-- | cmds/test.go | 73 |
1 files changed, 73 insertions, 0 deletions
diff --git a/cmds/test.go b/cmds/test.go new file mode 100644 index 0000000..77534a3 --- /dev/null +++ b/cmds/test.go @@ -0,0 +1,73 @@ +package cmds + +import ( + "os" + "os/user" + "strconv" + "syscall" +) + +func test(args []string) int { + if len(args) <= 2 { + return 1 + } + + fi, err := os.Lstat(args[2]) + c, _ := user.Current() + if err != nil { + return 1 + } + + switch args[1] { + case "-e": + return 0 + case "-f": + if !fi.IsDir() { + return 0 + } + break + case "-d": + if fi.IsDir() { + return 0 + } + break + case "-r": + if fi.Mode().Perm() & 0400 != 0 { + return 0 + } + break + case "-w": + if fi.Mode().Perm() & 0200 != 0 { + return 0 + } + break + case "-x": + if fi.Mode().Perm() & 0100 != 0 { + return 0 + } + break + case "-S": + if fi.Size() > 0 { + return 0 + } + break + case "-L": + if fi.Mode() & os.ModeSymlink != 0 { + return 0 + } + break + case "-O": + s := fi.Sys().(*syscall.Stat_t) + if c.Uid == strconv.Itoa(int(s.Uid)) { + return 0 + } + break + case "-G": + s := fi.Sys().(*syscall.Stat_t) + if c.Gid == strconv.Itoa(int(s.Gid)) { + return 0 + } + break + } + return 1 +} |