106 строки
2,5 КиБ
Go
106 строки
2,5 КиБ
Go
//go:build windows
|
|
// +build windows
|
|
|
|
// Portions copyright 2009 The Go Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style
|
|
// license that can be found in the LICENSE file.
|
|
|
|
package os
|
|
|
|
import (
|
|
"internal/syscall/windows"
|
|
"syscall"
|
|
"unicode/utf16"
|
|
)
|
|
|
|
const DevNull = "NUL"
|
|
|
|
type syscallFd = syscall.Handle
|
|
|
|
// Symlink is a stub, it is not implemented.
|
|
func Symlink(oldname, newname string) error {
|
|
return ErrNotImplemented
|
|
}
|
|
|
|
// Readlink is a stub (for now), always returning the string it was given
|
|
func Readlink(name string) (string, error) {
|
|
return name, nil
|
|
}
|
|
|
|
func rename(oldname, newname string) error {
|
|
e := windows.Rename(fixLongPath(oldname), fixLongPath(newname))
|
|
if e != nil {
|
|
return &LinkError{"rename", oldname, newname, e}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
type file struct {
|
|
handle FileHandle
|
|
name string
|
|
}
|
|
|
|
func NewFile(fd uintptr, name string) *File {
|
|
return &File{&file{unixFileHandle(fd), name}}
|
|
}
|
|
|
|
func Pipe() (r *File, w *File, err error) {
|
|
var p [2]syscall.Handle
|
|
e := handleSyscallError(syscall.Pipe(p[:]))
|
|
if e != nil {
|
|
return nil, nil, err
|
|
}
|
|
r = NewFile(uintptr(p[0]), "|0")
|
|
w = NewFile(uintptr(p[1]), "|1")
|
|
return
|
|
}
|
|
|
|
func tempDir() string {
|
|
n := uint32(syscall.MAX_PATH)
|
|
for {
|
|
b := make([]uint16, n)
|
|
n, _ = syscall.GetTempPath(uint32(len(b)), &b[0])
|
|
if n > uint32(len(b)) {
|
|
continue
|
|
}
|
|
if n == 3 && b[1] == ':' && b[2] == '\\' {
|
|
// Do nothing for path, like C:\.
|
|
} else if n > 0 && b[n-1] == '\\' {
|
|
// Otherwise remove terminating \.
|
|
n--
|
|
}
|
|
return string(utf16.Decode(b[:n]))
|
|
}
|
|
}
|
|
|
|
// ReadAt reads up to len(b) bytes from the File starting at the given absolute offset.
|
|
// It returns the number of bytes read and any error encountered, possibly io.EOF.
|
|
// At end of file, Pread returns 0, io.EOF.
|
|
// TODO: move to file_anyos once ReadAt is implemented for windows
|
|
func (f unixFileHandle) ReadAt(b []byte, offset int64) (n int, err error) {
|
|
return -1, ErrNotImplemented
|
|
}
|
|
|
|
// Seek wraps syscall.Seek.
|
|
func (f unixFileHandle) Seek(offset int64, whence int) (int64, error) {
|
|
newoffset, err := syscall.Seek(syscallFd(f), offset, whence)
|
|
return newoffset, handleSyscallError(err)
|
|
}
|
|
|
|
// isWindowsNulName reports whether name is os.DevNull ('NUL') on Windows.
|
|
// True is returned if name is 'NUL' whatever the case.
|
|
func isWindowsNulName(name string) bool {
|
|
if len(name) != 3 {
|
|
return false
|
|
}
|
|
if name[0] != 'n' && name[0] != 'N' {
|
|
return false
|
|
}
|
|
if name[1] != 'u' && name[1] != 'U' {
|
|
return false
|
|
}
|
|
if name[2] != 'l' && name[2] != 'L' {
|
|
return false
|
|
}
|
|
return true
|
|
}
|