mirror of https://github.com/ethereum/go-ethereum
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
51 lines
1.2 KiB
51 lines
1.2 KiB
// 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
|
|
}
|
|
|