]> Cypherpunks repositories - gostls13.git/commitdiff
os, syscall: more mingw
authorAlex Brainman <alex.brainman@gmail.com>
Tue, 27 Apr 2010 06:17:14 +0000 (23:17 -0700)
committerRuss Cox <rsc@golang.org>
Tue, 27 Apr 2010 06:17:14 +0000 (23:17 -0700)
R=rsc, rsc1
CC=golang-dev
https://golang.org/cl/878046

src/pkg/os/file.go
src/pkg/os/file_mingw.go
src/pkg/os/file_unix.go
src/pkg/os/stat_mingw.go
src/pkg/os/sys_mingw.go
src/pkg/syscall/syscall_mingw.go
src/pkg/syscall/zerrors_mingw_386.go
src/pkg/syscall/zsyscall_mingw_386.go
src/pkg/syscall/ztypes_mingw_386.go

index f4af42ff0ba1f1e3f5c5700d76843642589b3187..ccecf67edaeaf792773ac507eb827c2cc5e2b25a 100644 (file)
@@ -237,17 +237,6 @@ func Stat(name string) (fi *FileInfo, err Error) {
        return fileInfoFromStat(name, new(FileInfo), &lstat, statp), nil
 }
 
-// Stat returns the FileInfo structure describing file.
-// It returns the FileInfo and an error, if any.
-func (file *File) Stat() (fi *FileInfo, err Error) {
-       var stat syscall.Stat_t
-       e := syscall.Fstat(file.fd, &stat)
-       if e != 0 {
-               return nil, &PathError{"stat", file.name, Errno(e)}
-       }
-       return fileInfoFromStat(file.name, new(FileInfo), &stat, &stat), nil
-}
-
 // Lstat returns the FileInfo structure describing the named file and an
 // error, if any.  If the file is a symbolic link, the returned FileInfo
 // describes the symbolic link.  Lstat makes no attempt to follow the link.
@@ -301,6 +290,9 @@ func Remove(name string) Error {
        // file path, like /etc/passwd/foo, but in that case,
        // both errors will be ENOTDIR, so it's okay to
        // use the error from unlink.
+       // For windows syscall.ENOTDIR is set
+       // to syscall.ERROR_DIRECTORY, hopefully it should
+       // do the trick.
        if e1 != syscall.ENOTDIR {
                e = e1
        }
@@ -407,15 +399,6 @@ func (f *File) Chown(uid, gid int) Error {
        return nil
 }
 
-// Truncate changes the size of the named file.
-// If the file is a symbolic link, it changes the size of the link's target.
-func Truncate(name string, size int64) Error {
-       if e := syscall.Truncate(name, size); e != 0 {
-               return &PathError{"truncate", name, Errno(e)}
-       }
-       return nil
-}
-
 // Truncate changes the size of the file.
 // It does not change the I/O offset.
 func (f *File) Truncate(size int64) Error {
index 41bbe1e2ded1938131d166022df2d410e6f39412..4f7acbb08ce241624d1fac0bf51f8fb571cebf46 100644 (file)
@@ -85,6 +85,27 @@ func (file *File) Close() Error {
        return err
 }
 
+func (file *File) statFile(name string) (fi *FileInfo, err Error) {
+       var stat syscall.ByHandleFileInformation
+       if ok, e := syscall.GetFileInformationByHandle(int32(file.fd), &stat); !ok {
+               return nil, &PathError{"stat", file.name, Errno(e)}
+       }
+       return fileInfoFromByHandleInfo(new(FileInfo), file.name, &stat), nil
+}
+
+// Stat returns the FileInfo structure describing file.
+// It returns the FileInfo and an error, if any.
+func (file *File) Stat() (fi *FileInfo, err Error) {
+       if file == nil || file.fd < 0 {
+               return nil, EINVAL
+       }
+       if file.isdir() {
+               // I don't know any better way to do that for directory
+               return Stat(file.name)
+       }
+       return file.statFile(file.name)
+}
+
 // Readdir reads the contents of the directory associated with file and
 // returns an array of up to count FileInfo structures, as would be returned
 // by Stat, in directory order.  Subsequent calls on the same file will yield
@@ -112,7 +133,7 @@ func (file *File) Readdir(count int) (fi []FileInfo, err Error) {
                        }
                }
                var f FileInfo
-               fileInfoFromStat("", &f, &di.stat, &di.stat)
+               fileInfoFromWin32finddata(&f, &di.stat.Windata)
                if f.Name == "." || f.Name == ".." { // Useless names
                        continue
                }
@@ -129,3 +150,18 @@ func (file *File) Readdir(count int) (fi []FileInfo, err Error) {
        }
        return fi, nil
 }
+
+// Truncate changes the size of the named file.
+// If the file is a symbolic link, it changes the size of the link's target.
+func Truncate(name string, size int64) Error {
+       f, e := Open(name, O_WRONLY|O_CREAT, 0666)
+       if e != nil {
+               return e
+       }
+       defer f.Close()
+       e1 := f.Truncate(size)
+       if e1 != nil {
+               return e1
+       }
+       return nil
+}
index 84ca48064e0e32d3093cf0aad0af84254f08a004..6cf26614066ed6bc225bcb9099cf44d71b36c0d8 100644 (file)
@@ -53,6 +53,17 @@ func (file *File) Close() Error {
        return err
 }
 
+// Stat returns the FileInfo structure describing file.
+// It returns the FileInfo and an error, if any.
+func (file *File) Stat() (fi *FileInfo, err Error) {
+       var stat syscall.Stat_t
+       e := syscall.Fstat(file.fd, &stat)
+       if e != 0 {
+               return nil, &PathError{"stat", file.name, Errno(e)}
+       }
+       return fileInfoFromStat(file.name, new(FileInfo), &stat, &stat), nil
+}
+
 // Readdir reads the contents of the directory associated with file and
 // returns an array of up to count FileInfo structures, as would be returned
 // by Stat, in directory order.  Subsequent calls on the same file will yield
@@ -80,3 +91,12 @@ func (file *File) Readdir(count int) (fi []FileInfo, err Error) {
        }
        return
 }
+
+// Truncate changes the size of the named file.
+// If the file is a symbolic link, it changes the size of the link's target.
+func Truncate(name string, size int64) Error {
+       if e := syscall.Truncate(name, size); e != 0 {
+               return &PathError{"truncate", name, Errno(e)}
+       }
+       return nil
+}
index cfe283d0985622f346722bc0a35a3fca0be2982a..2d5bf137c0884a3c01a5f3225e292918dbcce03b 100755 (executable)
@@ -7,21 +7,39 @@ package os
 import "syscall"
 
 func fileInfoFromStat(name string, fi *FileInfo, lstat, stat *syscall.Stat_t) *FileInfo {
+       return fileInfoFromWin32finddata(fi, &stat.Windata)
+}
+
+func fileInfoFromWin32finddata(fi *FileInfo, d *syscall.Win32finddata) *FileInfo {
+       return setFileInfo(fi, string(syscall.UTF16ToString(d.FileName[0:])), d.FileAttributes, d.FileSizeHigh, d.FileSizeLow, d.CreationTime, d.LastAccessTime, d.LastWriteTime)
+}
+
+func fileInfoFromByHandleInfo(fi *FileInfo, name string, d *syscall.ByHandleFileInformation) *FileInfo {
+       for i := len(name) - 1; i >= 0; i-- {
+               if name[i] == '/' || name[i] == '\\' {
+                       name = name[i+1:]
+                       break
+               }
+       }
+       return setFileInfo(fi, name, d.FileAttributes, d.FileSizeHigh, d.FileSizeLow, d.CreationTime, d.LastAccessTime, d.LastWriteTime)
+}
+
+func setFileInfo(fi *FileInfo, name string, fa, sizehi, sizelo uint32, ctime, atime, wtime syscall.Filetime) *FileInfo {
        fi.Mode = 0
-       if stat.Windata.FileAttributes == syscall.FILE_ATTRIBUTE_DIRECTORY {
+       if fa == syscall.FILE_ATTRIBUTE_DIRECTORY {
                fi.Mode = fi.Mode | syscall.S_IFDIR
        } else {
                fi.Mode = fi.Mode | syscall.S_IFREG
        }
-       if stat.Windata.FileAttributes == syscall.FILE_ATTRIBUTE_READONLY {
+       if fa == syscall.FILE_ATTRIBUTE_READONLY {
                fi.Mode = fi.Mode | 0444
        } else {
                fi.Mode = fi.Mode | 0666
        }
-       fi.Size = int64(stat.Windata.FileSizeHigh)<<32 + int64(stat.Windata.FileSizeLow)
-       fi.Name = string(syscall.UTF16ToString(stat.Windata.FileName[0:]))
+       fi.Size = int64(sizehi)<<32 + int64(sizelo)
+       fi.Name = name
        fi.FollowedSymlink = false
-       // TODO(brainman): use CreationTime LastAccessTime LastWriteTime to prime following Dir fields
+       // TODO(brainman): use ctime atime wtime to prime following FileInfo fields
        fi.Atime_ns = 0
        fi.Mtime_ns = 0
        fi.Ctime_ns = 0
index 06e4fb3d340752f80366c9fec3ce024a575e2f2b..a7879845898a684e78f5a2dc20dd3e706537c920 100644 (file)
@@ -4,4 +4,12 @@
 
 package os
 
-func Hostname() (name string, err Error) { return "windows", nil }
+import "syscall"
+
+func Hostname() (name string, err Error) {
+       s, e := syscall.ComputerName()
+       if e != 0 {
+               return "", NewSyscallError("ComputerName", e)
+       }
+       return s, nil
+}
index 99f649e4fc2aa9f31e52e603e7eec9a20075c731..067a26f2016bc20926ab7c0eace31b3b21922dfb 100644 (file)
@@ -111,6 +111,16 @@ func getSysProcAddr(m uint32, pname string) uintptr {
 //sys  FindFirstFile(name *uint16, data *Win32finddata) (handle int32, errno int) [failretval=-1] = FindFirstFileW
 //sys  FindNextFile(handle int32, data *Win32finddata) (ok bool, errno int) = FindNextFileW
 //sys  FindClose(handle int32) (ok bool, errno int)
+//sys  GetFileInformationByHandle(handle int32, data *ByHandleFileInformation) (ok bool, errno int)
+//sys  GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, errno int) = GetCurrentDirectoryW
+//sys  SetCurrentDirectory(path *uint16) (ok bool, errno int) = SetCurrentDirectoryW
+//sys  CreateDirectory(path *uint16, sa *byte) (ok bool, errno int) = CreateDirectoryW
+//sys  RemoveDirectory(path *uint16) (ok bool, errno int) = RemoveDirectoryW
+//sys  DeleteFile(path *uint16) (ok bool, errno int) = DeleteFileW
+//sys  MoveFile(from *uint16, to *uint16) (ok bool, errno int) = MoveFileW
+//sys  GetComputerName(buf *uint16, n *uint32) (ok bool, errno int) = GetComputerNameW
+//sys  SetEndOfFile(handle int32) (ok bool, errno int)
+//sys  GetSystemTimeAsFileTime(time *Filetime)
 
 // syscall interface implementation for other packages
 
@@ -118,7 +128,7 @@ func Errstr(errno int) string {
        if errno == EMINGW {
                return "not supported by windows"
        }
-       var b = make([]uint16, 300)
+       b := make([]uint16, 300)
        n, err := FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM|FORMAT_MESSAGE_ARGUMENT_ARRAY, 0, uint32(errno), 0, b, nil)
        if err != 0 {
                return "error " + str(errno) + " (FormatMessage failed with err=" + str(err) + ")"
@@ -175,21 +185,18 @@ func Read(fd int, p []byte) (n int, errno int) {
 // not sure if I should do that
 
 func Pread(fd int, p []byte, offset int64) (n int, errno int) {
-       var o Overlapped
-       o.OffsetHigh = uint32(offset >> 32)
-       o.Offset = uint32(offset)
        curoffset, e := Seek(fd, 0, 1)
        if e != 0 {
                return 0, e
        }
+       defer Seek(fd, curoffset, 0)
+       var o Overlapped
+       o.OffsetHigh = uint32(offset >> 32)
+       o.Offset = uint32(offset)
        var done uint32
        if ok, e := ReadFile(int32(fd), p, &done, &o); !ok {
                return 0, e
        }
-       _, e = Seek(fd, curoffset, 0)
-       if e != 0 {
-               return 0, e
-       }
        return int(done), 0
 }
 
@@ -202,21 +209,18 @@ func Write(fd int, p []byte) (n int, errno int) {
 }
 
 func Pwrite(fd int, p []byte, offset int64) (n int, errno int) {
-       var o Overlapped
-       o.OffsetHigh = uint32(offset >> 32)
-       o.Offset = uint32(offset)
        curoffset, e := Seek(fd, 0, 1)
        if e != 0 {
                return 0, e
        }
+       defer Seek(fd, curoffset, 0)
+       var o Overlapped
+       o.OffsetHigh = uint32(offset >> 32)
+       o.Offset = uint32(offset)
        var done uint32
        if ok, e := WriteFile(int32(fd), p, &done, &o); !ok {
                return 0, e
        }
-       _, e = Seek(fd, curoffset, 0)
-       if e != 0 {
-               return 0, e
-       }
        return int(done), 0
 }
 
@@ -272,6 +276,93 @@ func Lstat(path string, stat *Stat_t) (errno int) {
        return Stat(path, stat)
 }
 
+const ImplementsGetwd = true
+
+func Getwd() (wd string, errno int) {
+       b := make([]uint16, 300)
+       n, e := GetCurrentDirectory(uint32(len(b)), &b[0])
+       if e != 0 {
+               return "", e
+       }
+       return string(utf16.Decode(b[0:n])), 0
+}
+
+func Chdir(path string) (errno int) {
+       if ok, e := SetCurrentDirectory(&StringToUTF16(path)[0]); !ok {
+               return e
+       }
+       return 0
+}
+
+func Mkdir(path string, mode int) (errno int) {
+       if ok, e := CreateDirectory(&StringToUTF16(path)[0], nil); !ok {
+               return e
+       }
+       return 0
+}
+
+func Rmdir(path string) (errno int) {
+       if ok, e := RemoveDirectory(&StringToUTF16(path)[0]); !ok {
+               return e
+       }
+       return 0
+}
+
+func Unlink(path string) (errno int) {
+       if ok, e := DeleteFile(&StringToUTF16(path)[0]); !ok {
+               return e
+       }
+       return 0
+}
+
+func Rename(oldpath, newpath string) (errno int) {
+       from := &StringToUTF16(oldpath)[0]
+       to := &StringToUTF16(newpath)[0]
+       if ok, e := MoveFile(from, to); !ok {
+               return e
+       }
+       return 0
+}
+
+func ComputerName() (name string, errno int) {
+       var n uint32 = MAX_COMPUTERNAME_LENGTH + 1
+       b := make([]uint16, n)
+       if ok, e := GetComputerName(&b[0], &n); !ok {
+               return "", e
+       }
+       return string(utf16.Decode(b[0:n])), 0
+}
+
+func Ftruncate(fd int, length int64) (errno int) {
+       curoffset, e := Seek(fd, 0, 1)
+       if e != 0 {
+               return e
+       }
+       defer Seek(fd, curoffset, 0)
+       if _, e := Seek(fd, length, 0); e != 0 {
+               return e
+       }
+       if _, e := SetEndOfFile(int32(fd)); e != 0 {
+               return e
+       }
+       return 0
+}
+
+func Gettimeofday(tv *Timeval) (errno int) {
+       var ft Filetime
+       // 100-nanosecond intervals since January 1, 1601
+       GetSystemTimeAsFileTime(&ft)
+       t := uint64(ft.HighDateTime)<<32 + uint64(ft.LowDateTime)
+       // convert into microseconds
+       t /= 10
+       // change starting time to the Epoch (00:00:00 UTC, January 1, 1970)
+       t -= 11644473600000000
+       // split into sec / usec
+       tv.Sec = int32(t / 1e6)
+       tv.Usec = int32(t) - tv.Sec
+       return 0
+}
+
 // TODO(brainman): fix all needed for os
 
 const (
@@ -281,33 +372,21 @@ const (
 func Getpid() (pid int)   { return -1 }
 func Getppid() (ppid int) { return -1 }
 
-func Mkdir(path string, mode int) (errno int)             { return EMINGW }
-func Fstat(fd int, stat *Stat_t) (errno int)              { return EMINGW }
-func Chdir(path string) (errno int)                       { return EMINGW }
 func Fchdir(fd int) (errno int)                           { return EMINGW }
-func Unlink(path string) (errno int)                      { return EMINGW }
-func Rmdir(path string) (errno int)                       { return EMINGW }
 func Link(oldpath, newpath string) (errno int)            { return EMINGW }
 func Symlink(path, link string) (errno int)               { return EMINGW }
 func Readlink(path string, buf []byte) (n int, errno int) { return 0, EMINGW }
-func Rename(oldpath, newpath string) (errno int)          { return EMINGW }
 func Chmod(path string, mode int) (errno int)             { return EMINGW }
 func Fchmod(fd int, mode int) (errno int)                 { return EMINGW }
 func Chown(path string, uid int, gid int) (errno int)     { return EMINGW }
 func Lchown(path string, uid int, gid int) (errno int)    { return EMINGW }
 func Fchown(fd int, uid int, gid int) (errno int)         { return EMINGW }
-func Truncate(name string, size int64) (errno int)        { return EMINGW }
-func Ftruncate(fd int, length int64) (errno int)          { return EMINGW }
-
-const ImplementsGetwd = true
 
-func Getwd() (wd string, errno int)        { return "", EMINGW }
-func Getuid() (uid int)                    { return -1 }
-func Geteuid() (euid int)                  { return -1 }
-func Getgid() (gid int)                    { return -1 }
-func Getegid() (egid int)                  { return -1 }
-func Getgroups() (gids []int, errno int)   { return nil, EMINGW }
-func Gettimeofday(tv *Timeval) (errno int) { return EMINGW }
+func Getuid() (uid int)                  { return -1 }
+func Geteuid() (euid int)                { return -1 }
+func Getgid() (gid int)                  { return -1 }
+func Getegid() (egid int)                { return -1 }
+func Getgroups() (gids []int, errno int) { return nil, EMINGW }
 
 // TODO(brainman): fix all this meaningless code, it is here to compile exec.go
 
index 707e9b8a75aef8f1c35b2c00dfdfc9abdd9027cf..a9a494373e029309aeb42b81ab1056c4178634a3 100644 (file)
@@ -11,6 +11,7 @@ const (
        ERROR_INSUFFICIENT_BUFFER = 122
        ERROR_MOD_NOT_FOUND       = 126
        ERROR_PROC_NOT_FOUND      = 127
+       ERROR_DIRECTORY           = 267
        // TODO(brainman): should use value for EMINGW that does not clashes with anything else
        EMINGW = 99999 /* otherwise unused */
 )
@@ -36,7 +37,7 @@ const (
        EEXIST          = 17
        EXDEV           = 18
        ENODEV          = 19
-       ENOTDIR         = 20
+       ENOTDIR         = ERROR_DIRECTORY
        EISDIR          = 21
        EINVAL          = 22
        ENFILE          = 23
index 185180a86d9f1d7829d334be09d433bdcbd02608..ccfb616ef1e0d740b27f106da60ca5df7b6be344 100644 (file)
@@ -6,23 +6,33 @@ package syscall
 import "unsafe"
 
 var (
-       modKERNEL32        = loadDll("kernel32.dll")
-       procGetLastError   = getSysProcAddr(modKERNEL32, "GetLastError")
-       procLoadLibraryW   = getSysProcAddr(modKERNEL32, "LoadLibraryW")
-       procFreeLibrary    = getSysProcAddr(modKERNEL32, "FreeLibrary")
-       procGetProcAddress = getSysProcAddr(modKERNEL32, "GetProcAddress")
-       procGetVersion     = getSysProcAddr(modKERNEL32, "GetVersion")
-       procFormatMessageW = getSysProcAddr(modKERNEL32, "FormatMessageW")
-       procExitProcess    = getSysProcAddr(modKERNEL32, "ExitProcess")
-       procCreateFileW    = getSysProcAddr(modKERNEL32, "CreateFileW")
-       procReadFile       = getSysProcAddr(modKERNEL32, "ReadFile")
-       procWriteFile      = getSysProcAddr(modKERNEL32, "WriteFile")
-       procSetFilePointer = getSysProcAddr(modKERNEL32, "SetFilePointer")
-       procCloseHandle    = getSysProcAddr(modKERNEL32, "CloseHandle")
-       procGetStdHandle   = getSysProcAddr(modKERNEL32, "GetStdHandle")
-       procFindFirstFileW = getSysProcAddr(modKERNEL32, "FindFirstFileW")
-       procFindNextFileW  = getSysProcAddr(modKERNEL32, "FindNextFileW")
-       procFindClose      = getSysProcAddr(modKERNEL32, "FindClose")
+       modKERNEL32                    = loadDll("kernel32.dll")
+       procGetLastError               = getSysProcAddr(modKERNEL32, "GetLastError")
+       procLoadLibraryW               = getSysProcAddr(modKERNEL32, "LoadLibraryW")
+       procFreeLibrary                = getSysProcAddr(modKERNEL32, "FreeLibrary")
+       procGetProcAddress             = getSysProcAddr(modKERNEL32, "GetProcAddress")
+       procGetVersion                 = getSysProcAddr(modKERNEL32, "GetVersion")
+       procFormatMessageW             = getSysProcAddr(modKERNEL32, "FormatMessageW")
+       procExitProcess                = getSysProcAddr(modKERNEL32, "ExitProcess")
+       procCreateFileW                = getSysProcAddr(modKERNEL32, "CreateFileW")
+       procReadFile                   = getSysProcAddr(modKERNEL32, "ReadFile")
+       procWriteFile                  = getSysProcAddr(modKERNEL32, "WriteFile")
+       procSetFilePointer             = getSysProcAddr(modKERNEL32, "SetFilePointer")
+       procCloseHandle                = getSysProcAddr(modKERNEL32, "CloseHandle")
+       procGetStdHandle               = getSysProcAddr(modKERNEL32, "GetStdHandle")
+       procFindFirstFileW             = getSysProcAddr(modKERNEL32, "FindFirstFileW")
+       procFindNextFileW              = getSysProcAddr(modKERNEL32, "FindNextFileW")
+       procFindClose                  = getSysProcAddr(modKERNEL32, "FindClose")
+       procGetFileInformationByHandle = getSysProcAddr(modKERNEL32, "GetFileInformationByHandle")
+       procGetCurrentDirectoryW       = getSysProcAddr(modKERNEL32, "GetCurrentDirectoryW")
+       procSetCurrentDirectoryW       = getSysProcAddr(modKERNEL32, "SetCurrentDirectoryW")
+       procCreateDirectoryW           = getSysProcAddr(modKERNEL32, "CreateDirectoryW")
+       procRemoveDirectoryW           = getSysProcAddr(modKERNEL32, "RemoveDirectoryW")
+       procDeleteFileW                = getSysProcAddr(modKERNEL32, "DeleteFileW")
+       procMoveFileW                  = getSysProcAddr(modKERNEL32, "MoveFileW")
+       procGetComputerNameW           = getSysProcAddr(modKERNEL32, "GetComputerNameW")
+       procSetEndOfFile               = getSysProcAddr(modKERNEL32, "SetEndOfFile")
+       procGetSystemTimeAsFileTime    = getSysProcAddr(modKERNEL32, "GetSystemTimeAsFileTime")
 )
 
 func GetLastError() (lasterrno int) {
@@ -201,3 +211,107 @@ func FindClose(handle int32) (ok bool, errno int) {
        }
        return
 }
+
+func GetFileInformationByHandle(handle int32, data *ByHandleFileInformation) (ok bool, errno int) {
+       r0, _, e1 := Syscall(procGetFileInformationByHandle, uintptr(handle), uintptr(unsafe.Pointer(data)), 0)
+       ok = bool(r0 != 0)
+       if !ok {
+               errno = int(e1)
+       } else {
+               errno = 0
+       }
+       return
+}
+
+func GetCurrentDirectory(buflen uint32, buf *uint16) (n uint32, errno int) {
+       r0, _, e1 := Syscall(procGetCurrentDirectoryW, uintptr(buflen), uintptr(unsafe.Pointer(buf)), 0)
+       n = uint32(r0)
+       if n == 0 {
+               errno = int(e1)
+       } else {
+               errno = 0
+       }
+       return
+}
+
+func SetCurrentDirectory(path *uint16) (ok bool, errno int) {
+       r0, _, e1 := Syscall(procSetCurrentDirectoryW, uintptr(unsafe.Pointer(path)), 0, 0)
+       ok = bool(r0 != 0)
+       if !ok {
+               errno = int(e1)
+       } else {
+               errno = 0
+       }
+       return
+}
+
+func CreateDirectory(path *uint16, sa *byte) (ok bool, errno int) {
+       r0, _, e1 := Syscall(procCreateDirectoryW, uintptr(unsafe.Pointer(path)), uintptr(unsafe.Pointer(sa)), 0)
+       ok = bool(r0 != 0)
+       if !ok {
+               errno = int(e1)
+       } else {
+               errno = 0
+       }
+       return
+}
+
+func RemoveDirectory(path *uint16) (ok bool, errno int) {
+       r0, _, e1 := Syscall(procRemoveDirectoryW, uintptr(unsafe.Pointer(path)), 0, 0)
+       ok = bool(r0 != 0)
+       if !ok {
+               errno = int(e1)
+       } else {
+               errno = 0
+       }
+       return
+}
+
+func DeleteFile(path *uint16) (ok bool, errno int) {
+       r0, _, e1 := Syscall(procDeleteFileW, uintptr(unsafe.Pointer(path)), 0, 0)
+       ok = bool(r0 != 0)
+       if !ok {
+               errno = int(e1)
+       } else {
+               errno = 0
+       }
+       return
+}
+
+func MoveFile(from *uint16, to *uint16) (ok bool, errno int) {
+       r0, _, e1 := Syscall(procMoveFileW, uintptr(unsafe.Pointer(from)), uintptr(unsafe.Pointer(to)), 0)
+       ok = bool(r0 != 0)
+       if !ok {
+               errno = int(e1)
+       } else {
+               errno = 0
+       }
+       return
+}
+
+func GetComputerName(buf *uint16, n *uint32) (ok bool, errno int) {
+       r0, _, e1 := Syscall(procGetComputerNameW, uintptr(unsafe.Pointer(buf)), uintptr(unsafe.Pointer(n)), 0)
+       ok = bool(r0 != 0)
+       if !ok {
+               errno = int(e1)
+       } else {
+               errno = 0
+       }
+       return
+}
+
+func SetEndOfFile(handle int32) (ok bool, errno int) {
+       r0, _, e1 := Syscall(procSetEndOfFile, uintptr(handle), 0, 0)
+       ok = bool(r0 != 0)
+       if !ok {
+               errno = int(e1)
+       } else {
+               errno = 0
+       }
+       return
+}
+
+func GetSystemTimeAsFileTime(time *Filetime) {
+       Syscall(procGetSystemTimeAsFileTime, uintptr(unsafe.Pointer(time)), 0, 0)
+       return
+}
index c683c6ed5971d1d2ae8aca0075a0659d60d3803a..95ffb4abfefe37e336b350c12fe10c257c6a5f90 100644 (file)
@@ -80,6 +80,8 @@ const (
        FORMAT_MESSAGE_MAX_WIDTH_MASK  = 255
 
        MAX_PATH = 260
+
+       MAX_COMPUTERNAME_LENGTH = 15
 )
 
 // Types
@@ -92,6 +94,7 @@ type _C_long int32
 
 type _C_long_long int64
 
+// Invented values to support what package os expects.
 type Timeval struct {
        Sec  int32
        Usec int32
@@ -123,6 +126,20 @@ type Win32finddata struct {
        AlternateFileName [13]uint16
 }
 
+type ByHandleFileInformation struct {
+       FileAttributes     uint32
+       CreationTime       Filetime
+       LastAccessTime     Filetime
+       LastWriteTime      Filetime
+       VolumeSerialNumber uint32
+       FileSizeHigh       uint32
+       FileSizeLow        uint32
+       NumberOfLinks      uint32
+       FileIndexHigh      uint32
+       FileIndexLow       uint32
+}
+
+// Invented values to support what package os expects.
 type Stat_t struct {
        Windata Win32finddata
        Mode    uint32