summaryrefslogtreecommitdiff
path: root/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2025-03-09 17:47:56 +0100
committerLibravatar Terin Stock <terinjokes@gmail.com>2025-03-10 01:59:49 +0100
commit3ac1ee16f377d31a0fb80c8dae28b6239ac4229e (patch)
treef61faa581feaaeaba2542b9f2b8234a590684413 /vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go
parent[chore] update URLs to forked source (diff)
downloadgotosocial-3ac1ee16f377d31a0fb80c8dae28b6239ac4229e.tar.xz
[chore] remove vendor
Diffstat (limited to 'vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go')
-rw-r--r--vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go161
1 files changed, 0 insertions, 161 deletions
diff --git a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go b/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go
deleted file mode 100644
index 717f8598a..000000000
--- a/vendor/github.com/tetratelabs/wazero/internal/sysfs/open_file_windows.go
+++ /dev/null
@@ -1,161 +0,0 @@
-package sysfs
-
-import (
- "io/fs"
- "os"
- "strings"
- "syscall"
- "unsafe"
-
- "github.com/tetratelabs/wazero/experimental/sys"
-)
-
-func openFile(path string, oflag sys.Oflag, perm fs.FileMode) (*os.File, sys.Errno) {
- isDir := oflag&sys.O_DIRECTORY > 0
- flag := toOsOpenFlag(oflag)
-
- // TODO: document why we are opening twice
- fd, err := open(path, flag|syscall.O_CLOEXEC, uint32(perm))
- if err == nil {
- return os.NewFile(uintptr(fd), path), 0
- }
-
- // TODO: Set FILE_SHARE_DELETE for directory as well.
- f, err := os.OpenFile(path, flag, perm)
- errno := sys.UnwrapOSError(err)
- if errno == 0 {
- return f, 0
- }
-
- switch errno {
- case sys.EINVAL:
- // WASI expects ENOTDIR for a file path with a trailing slash.
- if strings.HasSuffix(path, "/") {
- errno = sys.ENOTDIR
- }
- // To match expectations of WASI, e.g. TinyGo TestStatBadDir, return
- // ENOENT, not ENOTDIR.
- case sys.ENOTDIR:
- errno = sys.ENOENT
- case sys.ENOENT:
- if isSymlink(path) {
- // Either symlink or hard link not found. We change the returned
- // errno depending on if it is symlink or not to have consistent
- // behavior across OSes.
- if isDir {
- // Dangling symlink dir must raise ENOTDIR.
- errno = sys.ENOTDIR
- } else {
- errno = sys.ELOOP
- }
- }
- }
- return f, errno
-}
-
-const supportedSyscallOflag = sys.O_NONBLOCK
-
-// Map to synthetic values here https://github.com/golang/go/blob/go1.20/src/syscall/types_windows.go#L34-L48
-func withSyscallOflag(oflag sys.Oflag, flag int) int {
- // O_DIRECTORY not defined in windows
- // O_DSYNC not defined in windows
- // O_NOFOLLOW not defined in windows
- if oflag&sys.O_NONBLOCK != 0 {
- flag |= syscall.O_NONBLOCK
- }
- // O_RSYNC not defined in windows
- return flag
-}
-
-func isSymlink(path string) bool {
- if st, e := os.Lstat(path); e == nil && st.Mode()&os.ModeSymlink != 0 {
- return true
- }
- return false
-}
-
-// # Differences from syscall.Open
-//
-// This code is based on syscall.Open from the below link with some differences
-// https://github.com/golang/go/blame/go1.20/src/syscall/syscall_windows.go#L308-L379
-//
-// - syscall.O_CREAT doesn't imply syscall.GENERIC_WRITE as that breaks
-// flag expectations in wasi.
-// - add support for setting FILE_SHARE_DELETE.
-func open(path string, mode int, perm uint32) (fd syscall.Handle, err error) {
- if len(path) == 0 {
- return syscall.InvalidHandle, syscall.ERROR_FILE_NOT_FOUND
- }
- pathp, err := syscall.UTF16PtrFromString(path)
- if err != nil {
- return syscall.InvalidHandle, err
- }
- var access uint32
- switch mode & (syscall.O_RDONLY | syscall.O_WRONLY | syscall.O_RDWR) {
- case syscall.O_RDONLY:
- access = syscall.GENERIC_READ
- case syscall.O_WRONLY:
- access = syscall.GENERIC_WRITE
- case syscall.O_RDWR:
- access = syscall.GENERIC_READ | syscall.GENERIC_WRITE
- }
- if mode&syscall.O_APPEND != 0 {
- access &^= syscall.GENERIC_WRITE
- access |= syscall.FILE_APPEND_DATA
- }
- sharemode := uint32(syscall.FILE_SHARE_READ | syscall.FILE_SHARE_WRITE | syscall.FILE_SHARE_DELETE)
- var sa *syscall.SecurityAttributes
- if mode&syscall.O_CLOEXEC == 0 {
- var _sa syscall.SecurityAttributes
- _sa.Length = uint32(unsafe.Sizeof(sa))
- _sa.InheritHandle = 1
- sa = &_sa
- }
- var createmode uint32
- switch {
- case mode&(syscall.O_CREAT|syscall.O_EXCL) == (syscall.O_CREAT | syscall.O_EXCL):
- createmode = syscall.CREATE_NEW
- case mode&(syscall.O_CREAT|syscall.O_TRUNC) == (syscall.O_CREAT | syscall.O_TRUNC):
- createmode = syscall.CREATE_ALWAYS
- case mode&syscall.O_CREAT == syscall.O_CREAT:
- createmode = syscall.OPEN_ALWAYS
- case mode&syscall.O_TRUNC == syscall.O_TRUNC:
- createmode = syscall.TRUNCATE_EXISTING
- default:
- createmode = syscall.OPEN_EXISTING
- }
- var attrs uint32 = syscall.FILE_ATTRIBUTE_NORMAL
- if perm&syscall.S_IWRITE == 0 {
- attrs = syscall.FILE_ATTRIBUTE_READONLY
- if createmode == syscall.CREATE_ALWAYS {
- // We have been asked to create a read-only file.
- // If the file already exists, the semantics of
- // the Unix open system call is to preserve the
- // existing permissions. If we pass CREATE_ALWAYS
- // and FILE_ATTRIBUTE_READONLY to CreateFile,
- // and the file already exists, CreateFile will
- // change the file permissions.
- // Avoid that to preserve the Unix semantics.
- h, e := syscall.CreateFile(pathp, access, sharemode, sa, syscall.TRUNCATE_EXISTING, syscall.FILE_ATTRIBUTE_NORMAL, 0)
- switch e {
- case syscall.ERROR_FILE_NOT_FOUND, syscall.ERROR_PATH_NOT_FOUND:
- // File does not exist. These are the same
- // errors as Errno.Is checks for ErrNotExist.
- // Carry on to create the file.
- default:
- // Success or some different error.
- return h, e
- }
- }
- }
-
- // This shouldn't be included before 1.20 to have consistent behavior.
- // https://github.com/golang/go/commit/0f0aa5d8a6a0253627d58b3aa083b24a1091933f
- if createmode == syscall.OPEN_EXISTING && access == syscall.GENERIC_READ {
- // Necessary for opening directory handles.
- attrs |= syscall.FILE_FLAG_BACKUP_SEMANTICS
- }
-
- h, e := syscall.CreateFile(pathp, access, sharemode, sa, createmode, attrs, 0)
- return h, e
-}