...
1 package main
2
3 import (
4 "errors"
5 "fmt"
6 "io"
7 "io/fs"
8 "os"
9 "syscall"
10 )
11
12 func main() {
13 switch os.Args[1] {
14 case "ls":
15 var repeat bool
16 if len(os.Args) == 4 {
17 repeat = os.Args[3] == "repeat"
18 }
19
20
21 if err := mainLs(os.Args[2], repeat); errors.Is(err, syscall.EBADF) {
22 fmt.Println("ENOTDIR")
23 } else if err != nil {
24 panic(err)
25 }
26 case "stat":
27 if err := mainStat(); err != nil {
28 panic(err)
29 }
30 case "sock":
31
32
33 case "nonblock":
34
35
36 }
37 }
38
39 func mainLs(path string, repeat bool) error {
40 d, err := os.Open(path)
41 if err != nil {
42 return err
43 }
44 defer d.Close()
45
46 if err = printFileNames(d); err != nil {
47 return err
48 } else if repeat {
49
50 if _, err = d.Seek(0, io.SeekStart); err != nil {
51 return err
52 }
53 return printFileNames(d)
54 }
55 return nil
56 }
57
58 func printFileNames(d *os.File) error {
59 if names, err := d.Readdirnames(-1); err != nil {
60 return err
61 } else {
62 for _, n := range names {
63 fmt.Println("./" + n)
64 }
65 }
66 return nil
67 }
68
69 func mainStat() error {
70 var isatty = func(name string, fd uintptr) error {
71 f := os.NewFile(fd, "")
72 if st, err := f.Stat(); err != nil {
73 return err
74 } else {
75 ttyMode := fs.ModeDevice | fs.ModeCharDevice
76 isatty := st.Mode()&ttyMode == ttyMode
77 fmt.Println(name, "isatty:", isatty)
78 return nil
79 }
80 }
81
82 for fd, name := range []string{"stdin", "stdout", "stderr", "/"} {
83 if err := isatty(name, uintptr(fd)); err != nil {
84 return err
85 }
86 }
87 return nil
88 }
89
View as plain text