...

Source file src/github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo/wasi.go

Documentation: github.com/tetratelabs/wazero/imports/wasi_snapshot_preview1/testdata/tinygo

     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  }
    89  

View as plain text