mirror of
https://github.com/golang/go
synced 2024-10-03 21:11:22 -06:00
syscall: implement chmod() for win32.
R=golang-dev, rsc, brainman CC=golang-dev https://golang.org/cl/4175049
This commit is contained in:
parent
074354c2ea
commit
a54cbcec88
@ -154,6 +154,7 @@ func NewCallback(fn interface{}) uintptr
|
|||||||
//sys SetEnvironmentVariable(name *uint16, value *uint16) (errno int) = kernel32.SetEnvironmentVariableW
|
//sys SetEnvironmentVariable(name *uint16, value *uint16) (errno int) = kernel32.SetEnvironmentVariableW
|
||||||
//sys SetFileTime(handle int32, ctime *Filetime, atime *Filetime, wtime *Filetime) (errno int)
|
//sys SetFileTime(handle int32, ctime *Filetime, atime *Filetime, wtime *Filetime) (errno int)
|
||||||
//sys GetFileAttributes(name *uint16) (attrs uint32, errno int) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW
|
//sys GetFileAttributes(name *uint16) (attrs uint32, errno int) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.GetFileAttributesW
|
||||||
|
//sys SetFileAttributes(name *uint16, attrs uint32) (errno int) [failretval==INVALID_FILE_ATTRIBUTES] = kernel32.SetFileAttributesW
|
||||||
//sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW
|
//sys GetCommandLine() (cmd *uint16) = kernel32.GetCommandLineW
|
||||||
//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, errno int) [failretval==nil] = shell32.CommandLineToArgvW
|
//sys CommandLineToArgv(cmd *uint16, argc *int32) (argv *[8192]*[8192]uint16, errno int) [failretval==nil] = shell32.CommandLineToArgvW
|
||||||
//sys LocalFree(hmem uint32) (handle uint32, errno int) [failretval!=0]
|
//sys LocalFree(hmem uint32) (handle uint32, errno int) [failretval!=0]
|
||||||
@ -718,7 +719,27 @@ func Fchdir(fd int) (errno int) { return EWINDOWS }
|
|||||||
func Link(oldpath, newpath string) (errno int) { return EWINDOWS }
|
func Link(oldpath, newpath string) (errno int) { return EWINDOWS }
|
||||||
func Symlink(path, link string) (errno int) { return EWINDOWS }
|
func Symlink(path, link string) (errno int) { return EWINDOWS }
|
||||||
func Readlink(path string, buf []byte) (n int, errno int) { return 0, EWINDOWS }
|
func Readlink(path string, buf []byte) (n int, errno int) { return 0, EWINDOWS }
|
||||||
func Chmod(path string, mode uint32) (errno int) { return EWINDOWS }
|
|
||||||
|
func Chmod(path string, mode uint32) (errno int) {
|
||||||
|
attrs, errno := GetFileAttributes(StringToUTF16Ptr(path))
|
||||||
|
if errno != 0 {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
if mode == 0 {
|
||||||
|
return EINVAL
|
||||||
|
}
|
||||||
|
|
||||||
|
if mode&S_IWRITE != 0 {
|
||||||
|
attrs &^= FILE_ATTRIBUTE_READONLY
|
||||||
|
} else if attrs&FILE_ATTRIBUTE_READONLY == 0 {
|
||||||
|
attrs |= FILE_ATTRIBUTE_READONLY
|
||||||
|
}
|
||||||
|
|
||||||
|
errno = SetFileAttributes(StringToUTF16Ptr(path), attrs)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func Fchmod(fd int, mode uint32) (errno int) { return EWINDOWS }
|
func Fchmod(fd int, mode uint32) (errno int) { return EWINDOWS }
|
||||||
func Chown(path string, uid int, gid int) (errno int) { return EWINDOWS }
|
func Chown(path string, uid int, gid int) (errno int) { return EWINDOWS }
|
||||||
func Lchown(path string, uid int, gid int) (errno int) { return EWINDOWS }
|
func Lchown(path string, uid int, gid int) (errno int) { return EWINDOWS }
|
||||||
|
@ -63,6 +63,7 @@ var (
|
|||||||
procSetEnvironmentVariableW = getSysProcAddr(modkernel32, "SetEnvironmentVariableW")
|
procSetEnvironmentVariableW = getSysProcAddr(modkernel32, "SetEnvironmentVariableW")
|
||||||
procSetFileTime = getSysProcAddr(modkernel32, "SetFileTime")
|
procSetFileTime = getSysProcAddr(modkernel32, "SetFileTime")
|
||||||
procGetFileAttributesW = getSysProcAddr(modkernel32, "GetFileAttributesW")
|
procGetFileAttributesW = getSysProcAddr(modkernel32, "GetFileAttributesW")
|
||||||
|
procSetFileAttributesW = getSysProcAddr(modkernel32, "SetFileAttributesW")
|
||||||
procGetCommandLineW = getSysProcAddr(modkernel32, "GetCommandLineW")
|
procGetCommandLineW = getSysProcAddr(modkernel32, "GetCommandLineW")
|
||||||
procCommandLineToArgvW = getSysProcAddr(modshell32, "CommandLineToArgvW")
|
procCommandLineToArgvW = getSysProcAddr(modshell32, "CommandLineToArgvW")
|
||||||
procLocalFree = getSysProcAddr(modkernel32, "LocalFree")
|
procLocalFree = getSysProcAddr(modkernel32, "LocalFree")
|
||||||
@ -806,6 +807,20 @@ func GetFileAttributes(name *uint16) (attrs uint32, errno int) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func SetFileAttributes(name *uint16, attrs uint32) (errno int) {
|
||||||
|
r0, _, e1 := Syscall(procSetFileAttributesW, 2, uintptr(unsafe.Pointer(name)), uintptr(attrs), 0)
|
||||||
|
if int(r0) == 0 {
|
||||||
|
if e1 != 0 {
|
||||||
|
errno = int(e1)
|
||||||
|
} else {
|
||||||
|
errno = EINVAL
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
errno = 0
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func GetCommandLine() (cmd *uint16) {
|
func GetCommandLine() (cmd *uint16) {
|
||||||
r0, _, _ := Syscall(procGetCommandLineW, 0, 0, 0, 0)
|
r0, _, _ := Syscall(procGetCommandLineW, 0, 0, 0, 0)
|
||||||
cmd = (*uint16)(unsafe.Pointer(r0))
|
cmd = (*uint16)(unsafe.Pointer(r0))
|
||||||
|
@ -380,6 +380,7 @@ const (
|
|||||||
S_ISGID = 0x400
|
S_ISGID = 0x400
|
||||||
S_ISVTX = 0x200
|
S_ISVTX = 0x200
|
||||||
S_IRUSR = 0x100
|
S_IRUSR = 0x100
|
||||||
|
S_IWRITE = 0x80
|
||||||
S_IWUSR = 0x80
|
S_IWUSR = 0x80
|
||||||
S_IXUSR = 0x40
|
S_IXUSR = 0x40
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user