github.com/bananabytelabs/wazero@v0.0.0-20240105073314-54b22a776da8/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go (about) 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 // Go doesn't open with O_DIRECTORY, so we don't end up with ENOTDIR, 20 // rather EBADF trying to read the directory later. 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 // TODO: undefined: net.FileListener 32 // See https://github.com/tinygo-org/tinygo/pull/2748 33 case "nonblock": 34 // TODO: undefined: syscall.SetNonblock 35 // See https://github.com/tinygo-org/tinygo/issues/3840 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 // rewind 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 }