diff --git a/src/os/file.go b/src/os/file.go index b47bf748a..0e20d1bf1 100644 --- a/src/os/file.go +++ b/src/os/file.go @@ -307,6 +307,17 @@ func (f *File) Sync() (err error) { return } +// Chmod changes the mode of the file to mode. If there is an error, it will be +// of type *PathError. +func (f *File) Chmod(mode FileMode) (err error) { + if f.handle == nil { + err = ErrClosed + } else { + err = f.chmod(mode) + } + return +} + // LinkError records an error during a link or symlink or rename system call and // the paths that caused it. type LinkError struct { diff --git a/src/os/file_other.go b/src/os/file_other.go index 4e8f859b7..75c033281 100644 --- a/src/os/file_other.go +++ b/src/os/file_other.go @@ -149,3 +149,7 @@ func (f *File) Truncate(size int64) (err error) { return Truncate(f.name, size) } + +func (f *File) chmod(mode FileMode) error { + return ErrUnsupported +} diff --git a/src/os/file_unix.go b/src/os/file_unix.go index d94b80cc3..fd4d464f5 100644 --- a/src/os/file_unix.go +++ b/src/os/file_unix.go @@ -151,6 +151,21 @@ func (f *File) Truncate(size int64) (err error) { return Truncate(f.name, size) } +func (f *File) chmod(mode FileMode) error { + if f.handle == nil { + return ErrClosed + } + + longName := fixLongPath(f.name) + e := ignoringEINTR(func() error { + return syscall.Chmod(longName, syscallMode(mode)) + }) + if e != nil { + return &PathError{Op: "chmod", Path: f.name, Err: e} + } + return nil +} + // 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. diff --git a/src/os/file_windows.go b/src/os/file_windows.go index 9588cac76..022381dee 100644 --- a/src/os/file_windows.go +++ b/src/os/file_windows.go @@ -142,3 +142,7 @@ func isWindowsNulName(name string) bool { } return true } + +func (f *File) chmod(mode FileMode) error { + return ErrNotImplemented +}