Skip to content

Commit 8d62dbe

Browse files
committed
runtime/internal/lib/os: fix readdir for darwin-amd64
1 parent cf2d1ef commit 8d62dbe

8 files changed

Lines changed: 75 additions & 32 deletions

File tree

_demo/readdir/main.go

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,17 @@ func main() {
1313
if len(entries) == 0 {
1414
panic("No files found")
1515
}
16+
var check int
1617
for _, e := range entries {
1718
fmt.Printf("%s isDir[%t]\n", e.Name(), e.IsDir())
19+
if !e.IsDir() {
20+
switch e.Name() {
21+
case "go.sum", "go.mod":
22+
check++
23+
}
24+
}
25+
}
26+
if check != 2 {
27+
panic("Bad readdir entries go.mod/go.sum")
1828
}
1929
}

runtime/internal/clite/os/dir.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package os
2+
3+
import (
4+
_ "unsafe"
5+
6+
c "github.com/goplus/llgo/runtime/internal/clite"
7+
)
8+
9+
type DIR struct {
10+
Unused [0]byte
11+
}
12+
13+
//go:linkname Opendir C.opendir
14+
func Opendir(name *c.Char) *DIR
15+
16+
//go:linkname Closedir C.closedir
17+
func Closedir(dir *DIR) c.Int
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package os
2+
3+
import (
4+
_ "unsafe"
5+
6+
c "github.com/goplus/llgo/runtime/internal/clite"
7+
"github.com/goplus/llgo/runtime/internal/clite/syscall"
8+
)
9+
10+
//go:linkname Fdopendir C.fdopendir$INODE64
11+
func Fdopendir(fd c.Int) *DIR
12+
13+
//go:linkname Readdir C.readdir$INODE64
14+
func Readdir(dir *DIR) *syscall.Dirent
15+
16+
//go:linkname Fstatat C.fstatat$INODE64
17+
func Fstatat(dirfd c.Int, path *c.Char, buf *StatT, flags c.Int) c.Int
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
//go:build !darwin
2+
// +build !darwin
3+
4+
package os
5+
6+
import (
7+
_ "unsafe"
8+
9+
c "github.com/goplus/llgo/runtime/internal/clite"
10+
)
11+
12+
//go:linkname Fdopendir C.fdopendir
13+
func Fdopendir(fd c.Int) *DIR
14+
15+
//go:linkname Readdir C.readdir
16+
func Readdir(dir *DIR) *syscall.Dirent
17+
18+
//go:linkname Fstatat C.fstatat
19+
func Fstatat(dirfd c.Int, path *c.Char, buf *StatT, flags c.Int) c.Int

runtime/internal/clite/os/os.go

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -135,9 +135,6 @@ func Fchmodat(dirfd c.Int, path *c.Char, mode ModeT, flags c.Int) c.Int
135135
//go:linkname Fchownat C.fchownat
136136
func Fchownat(dirfd c.Int, path *c.Char, owner UidT, group GidT, flags c.Int) c.Int
137137

138-
//go:linkname Fstatat C.fstatat
139-
func Fstatat(dirfd c.Int, path *c.Char, buf *StatT, flags c.Int) c.Int
140-
141138
// -----------------------------------------------------------------------------
142139

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

194-
//go:linkname Fstat C.fstat
195-
func Fstat(fd c.Int, buf *StatT) c.Int
196-
197191
//go:linkname Isatty C.isatty
198192
func Isatty(fd c.Int) c.Int
199193

runtime/internal/clite/os/stat.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,3 +14,6 @@ func Stat(path *c.Char, buf *StatT) c.Int
1414

1515
//go:linkname Lstat C.lstat
1616
func Lstat(path *c.Char, buf *StatT) c.Int
17+
18+
//go:linkname Fstat C.fstat
19+
func Fstat(fd c.Int, buf *StatT) c.Int

runtime/internal/clite/os/stat_darwin.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,6 @@ func Stat(path *c.Char, buf *StatT) c.Int
1111

1212
//go:linkname Lstat C.lstat64
1313
func Lstat(path *c.Char, buf *StatT) c.Int
14+
15+
//go:linkname Fstat C.fstat64
16+
func Fstat(fd c.Int, buf *StatT) c.Int

runtime/internal/lib/os/dir.go

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -82,30 +82,10 @@ func ReadDir(name string) ([]DirEntry, error) {
8282
return dirs, err
8383
}
8484

85-
//go:linkname c_fdopendir C.fdopendir
86-
func c_fdopendir(fd c.Int) uintptr
87-
88-
func fdopendir(fd int) (dir uintptr, err error) {
89-
return c_fdopendir(c.Int(fd)), nil
90-
}
91-
92-
//go:linkname c_closedir C.closedir
93-
func c_closedir(dir uintptr) c.Int
94-
95-
func closedir(dir uintptr) error {
96-
if c_closedir(dir) != 0 {
97-
return syscall.Errno(os.Errno())
98-
}
99-
return nil
100-
}
101-
102-
//go:linkname c_readdir C.readdir
103-
func c_readdir(dir uintptr) *syscall.Dirent
104-
105-
func readdir(dir uintptr) ([]syscall.Dirent, error) {
85+
func readdir(dir *os.DIR) ([]syscall.Dirent, error) {
10686
var entries []syscall.Dirent
10787
for {
108-
dirent := c_readdir(dir)
88+
dirent := os.Readdir(dir)
10989
if dirent == nil {
11090
break
11191
}
@@ -139,11 +119,11 @@ func (f *File) ReadDir(n int) (dirents []DirEntry, err error) {
139119
}
140120

141121
// Open directory using file descriptor
142-
dir, err := fdopendir(int(f.fd))
143-
if err != nil {
144-
return nil, err
122+
dir := os.Fdopendir(c.Int(f.fd))
123+
if dir == nil {
124+
return nil, syscall.Errno(os.Errno())
145125
}
146-
defer closedir(dir)
126+
defer os.Closedir(dir)
147127

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

0 commit comments

Comments
 (0)