diff --git a/src/os/file.go b/src/os/file.go index 9fa8f2cf..86db953e 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -196,9 +196,8 @@ func Lstat(name string) (FileInfo, error) { return nil, &PathError{"lstat", name, ErrNotImplemented} } -// Getwd is a stub (for now), always returning an empty string func Getwd() (string, error) { - return "", nil + return syscall.Getwd() } // Readlink is a stub (for now), always returning the string it was given diff --git a/src/syscall/file_emulated.go b/src/syscall/file_emulated.go new file mode 100644 index 00000000..0185965b --- /dev/null +++ b/src/syscall/file_emulated.go @@ -0,0 +1,10 @@ +// +build baremetal wasi wasm + +// This file emulates some file-related functions that are only available +// under a real operating system. + +package syscall + +func Getwd() (string, error) { + return "", nil +} diff --git a/src/syscall/file_hosted.go b/src/syscall/file_hosted.go new file mode 100644 index 00000000..a7df3549 --- /dev/null +++ b/src/syscall/file_hosted.go @@ -0,0 +1,25 @@ +// +build !baremetal,!wasi,!wasm + +// This file assumes there is a libc available that runs on a real operating +// system. + +package syscall + +const pathMax = 1024 + +func Getwd() (string, error) { + var buf [pathMax]byte + s := libc_getcwd(&buf[0], uint(len(buf))) + if s == nil { + return "", getErrno() + } + n := clen(buf[:]) + if n < 1 { + return "", EINVAL + } + return string(buf[:n]), nil +} + +// char *getcwd(char *buf, size_t size) +//export getcwd +func libc_getcwd(buf *byte, size uint) *byte diff --git a/src/syscall/str.go b/src/syscall/str.go index 2ddf04b2..ea5356d0 100644 --- a/src/syscall/str.go +++ b/src/syscall/str.go @@ -22,3 +22,13 @@ func uitoa(val uint) string { buf[i] = byte(val + '0') return string(buf[i:]) } + +// clen returns the index of the first NULL byte in n or len(n) if n contains no NULL byte. +func clen(n []byte) int { + for i := 0; i < len(n); i++ { + if n[i] == 0 { + return i + } + } + return len(n) +} diff --git a/src/syscall/syscall_libc_darwin.go b/src/syscall/syscall_libc_darwin.go index 308a4a0c..3a379413 100644 --- a/src/syscall/syscall_libc_darwin.go +++ b/src/syscall/syscall_libc_darwin.go @@ -43,6 +43,7 @@ const ( EEXIST Errno = 0x11 EINTR Errno = 0x4 ENOTDIR Errno = 0x14 + EINVAL Errno = 0x16 EMFILE Errno = 0x18 EAGAIN Errno = 0x23 ETIMEDOUT Errno = 0x3c