| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051 |
- // Copyright (c) 2012, Suryandaru Triandana <syndtr@gmail.com>
- // All rights reserved.
- //
- // Use of this source code is governed by a BSD-style license.
- //
- // +build darwin dragonfly freebsd linux netbsd openbsd solaris
- package main
- import (
- "os"
- "syscall"
- )
- func rename(oldpath, newpath string) error {
- return os.Rename(oldpath, newpath)
- }
- func isErrInvalid(err error) bool {
- if err == os.ErrInvalid {
- return true
- }
- // Go < 1.8
- if syserr, ok := err.(*os.SyscallError); ok && syserr.Err == syscall.EINVAL {
- return true
- }
- // Go >= 1.8 returns *os.PathError instead
- if patherr, ok := err.(*os.PathError); ok && patherr.Err == syscall.EINVAL {
- return true
- }
- return false
- }
- func syncDir(name string) error {
- // As per fsync manpage, Linux seems to expect fsync on directory, however
- // some system don't support this, so we will ignore syscall.EINVAL.
- //
- // From fsync(2):
- // Calling fsync() does not necessarily ensure that the entry in the
- // directory containing the file has also reached disk. For that an
- // explicit fsync() on a file descriptor for the directory is also needed.
- f, err := os.Open(name)
- if err != nil {
- return err
- }
- defer f.Close()
- if err := f.Sync(); err != nil && !isErrInvalid(err) {
- return err
- }
- return nil
- }
|