Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions _demo/readdir/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,17 @@ func main() {
if len(entries) == 0 {
panic("No files found")
}
var check int
for _, e := range entries {
fmt.Printf("%s isDir[%t]\n", e.Name(), e.IsDir())
if !e.IsDir() {
switch e.Name() {
case "go.sum", "go.mod":
check++
}
}
}
if check != 2 {
panic("Bad readdir entries go.mod/go.sum")
}
}
17 changes: 17 additions & 0 deletions runtime/internal/clite/os/dir.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package os

import (
_ "unsafe"

c "github.com/goplus/llgo/runtime/internal/clite"
)

type DIR struct {
Unused [0]byte
}

//go:linkname Opendir C.opendir
func Opendir(name *c.Char) *DIR

//go:linkname Closedir C.closedir
func Closedir(dir *DIR) c.Int
17 changes: 17 additions & 0 deletions runtime/internal/clite/os/dir_darwin_amd64.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package os

import (
_ "unsafe"

c "github.com/goplus/llgo/runtime/internal/clite"
"github.com/goplus/llgo/runtime/internal/clite/syscall"
)

//go:linkname Fdopendir C.fdopendir$INODE64
func Fdopendir(fd c.Int) *DIR

//go:linkname Readdir C.readdir$INODE64
func Readdir(dir *DIR) *syscall.Dirent

//go:linkname Fstatat C.fstatat$INODE64
func Fstatat(dirfd c.Int, path *c.Char, buf *StatT, flags c.Int) c.Int
20 changes: 20 additions & 0 deletions runtime/internal/clite/os/dir_unix.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//go:build !(darwin && amd64)
// +build !darwin !amd64

package os

import (
_ "unsafe"

c "github.com/goplus/llgo/runtime/internal/clite"
"github.com/goplus/llgo/runtime/internal/clite/syscall"
)

//go:linkname Fdopendir C.fdopendir
func Fdopendir(fd c.Int) *DIR

//go:linkname Readdir C.readdir
func Readdir(dir *DIR) *syscall.Dirent

//go:linkname Fstatat C.fstatat
func Fstatat(dirfd c.Int, path *c.Char, buf *StatT, flags c.Int) c.Int
6 changes: 0 additions & 6 deletions runtime/internal/clite/os/os.go
Original file line number Diff line number Diff line change
Expand Up @@ -135,9 +135,6 @@ func Fchmodat(dirfd c.Int, path *c.Char, mode ModeT, flags c.Int) c.Int
//go:linkname Fchownat C.fchownat
func Fchownat(dirfd c.Int, path *c.Char, owner UidT, group GidT, flags c.Int) c.Int

//go:linkname Fstatat C.fstatat
func Fstatat(dirfd c.Int, path *c.Char, buf *StatT, flags c.Int) c.Int

// -----------------------------------------------------------------------------

//go:linkname Open C.open
Expand Down Expand Up @@ -191,9 +188,6 @@ func Fchmod(fd c.Int, mode ModeT) c.Int
//go:linkname Fchown C.fchown
func Fchown(fd c.Int, owner UidT, group GidT) c.Int

//go:linkname Fstat C.fstat
func Fstat(fd c.Int, buf *StatT) c.Int

//go:linkname Isatty C.isatty
func Isatty(fd c.Int) c.Int

Expand Down
3 changes: 3 additions & 0 deletions runtime/internal/clite/os/stat.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,3 +14,6 @@ func Stat(path *c.Char, buf *StatT) c.Int

//go:linkname Lstat C.lstat
func Lstat(path *c.Char, buf *StatT) c.Int

//go:linkname Fstat C.fstat
func Fstat(fd c.Int, buf *StatT) c.Int
3 changes: 3 additions & 0 deletions runtime/internal/clite/os/stat_darwin.go
Original file line number Diff line number Diff line change
Expand Up @@ -11,3 +11,6 @@ func Stat(path *c.Char, buf *StatT) c.Int

//go:linkname Lstat C.lstat64
func Lstat(path *c.Char, buf *StatT) c.Int

//go:linkname Fstat C.fstat64
func Fstat(fd c.Int, buf *StatT) c.Int
32 changes: 6 additions & 26 deletions runtime/internal/lib/os/dir.go
Original file line number Diff line number Diff line change
Expand Up @@ -82,30 +82,10 @@ func ReadDir(name string) ([]DirEntry, error) {
return dirs, err
}

//go:linkname c_fdopendir C.fdopendir
func c_fdopendir(fd c.Int) uintptr

func fdopendir(fd int) (dir uintptr, err error) {
return c_fdopendir(c.Int(fd)), nil
}

//go:linkname c_closedir C.closedir
func c_closedir(dir uintptr) c.Int

func closedir(dir uintptr) error {
if c_closedir(dir) != 0 {
return syscall.Errno(os.Errno())
}
return nil
}

//go:linkname c_readdir C.readdir
func c_readdir(dir uintptr) *syscall.Dirent

func readdir(dir uintptr) ([]syscall.Dirent, error) {
func readdir(dir *os.DIR) ([]syscall.Dirent, error) {
var entries []syscall.Dirent
for {
dirent := c_readdir(dir)
dirent := os.Readdir(dir)
if dirent == nil {
break
}
Expand Down Expand Up @@ -139,11 +119,11 @@ func (f *File) ReadDir(n int) (dirents []DirEntry, err error) {
}

// Open directory using file descriptor
dir, err := fdopendir(int(f.fd))
if err != nil {
return nil, err
dir := os.Fdopendir(c.Int(f.fd))
if dir == nil {
return nil, syscall.Errno(os.Errno())
}
defer closedir(dir)
defer os.Closedir(dir)

// Match Readdir and Readdirnames: don't return nil slices.
dirents = []DirEntry{}
Expand Down
Loading