| // Copyright 2017 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 dep |
| |
| import ( |
| "io" |
| "os" |
| "syscall" |
| ) |
| |
| // makeUnreadable opens the file at path in exclusive mode. A file opened in |
| // exclusive mode cannot be opened again until the exclusive mode file handle |
| // is closed. |
| func makeUnreadable(path string) (io.Closer, error) { |
| if len(path) == 0 { |
| return nil, syscall.ERROR_FILE_NOT_FOUND |
| } |
| pathp, err := syscall.UTF16PtrFromString(path) |
| if err != nil { |
| return nil, err |
| } |
| access := uint32(syscall.GENERIC_READ | syscall.GENERIC_WRITE) |
| sharemode := uint32(0) // no sharing == exclusive mode |
| sa := (*syscall.SecurityAttributes)(nil) |
| createmode := uint32(syscall.OPEN_EXISTING) |
| h, err := syscall.CreateFile(pathp, access, sharemode, sa, createmode, syscall.FILE_ATTRIBUTE_NORMAL, 0) |
| if err != nil { |
| return nil, err |
| } |
| return os.NewFile(uintptr(h), path), nil |
| } |