diff --git a/_demo/oslookpath/lookpath.go b/_demo/oslookpath/lookpath.go new file mode 100644 index 00000000..70891f92 --- /dev/null +++ b/_demo/oslookpath/lookpath.go @@ -0,0 +1,19 @@ +package main + +import ( + "fmt" + "os/exec" + "runtime" +) + +func main() { + ls := "ls" + if runtime.GOOS == "windows" { + ls = "dir" + } + lspath, _ := exec.LookPath(ls) + if lspath != "" { + ls = lspath + } + fmt.Println(ls) +} diff --git a/c/os/os.go b/c/os/os.go index 7010df7e..5f36a534 100644 --- a/c/os/os.go +++ b/c/os/os.go @@ -24,6 +24,7 @@ import ( _ "unsafe" "github.com/goplus/llgo/c" + "github.com/goplus/llgo/c/syscall" ) const ( @@ -40,7 +41,10 @@ type ( GidT C.gid_t OffT C.off_t DevT C.dev_t - StatT C.struct_stat +) + +type ( + StatT = syscall.Stat_t ) //go:linkname Errno errno diff --git a/internal/lib/syscall/syscall.go b/internal/lib/syscall/syscall.go index 6dffaf47..8d733ea8 100644 --- a/internal/lib/syscall/syscall.go +++ b/internal/lib/syscall/syscall.go @@ -124,3 +124,21 @@ func Close(fd int) (err error) { } return Errno(os.Errno) } + +type Stat_t = syscall.Stat_t + +func Lstat(path string, stat *Stat_t) (err error) { + ret := os.Lstat(c.AllocaCStr(path), stat) + if ret == 0 { + return nil + } + return Errno(os.Errno) +} + +func Stat(path string, stat *Stat_t) (err error) { + ret := os.Stat(c.AllocaCStr(path), stat) + if ret == 0 { + return nil + } + return Errno(os.Errno) +}