35 lines
646 B
Go
35 lines
646 B
Go
//go:build unix
|
|
|
|
package db0301
|
|
|
|
import (
|
|
"os"
|
|
"path"
|
|
"syscall"
|
|
)
|
|
|
|
// open or create a file and fsync the directory
|
|
func createFileSync(file string) (*os.File, error) {
|
|
fp, err := os.OpenFile(file, os.O_RDWR|os.O_CREATE, 0o644)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if err = syncDir(path.Base(file)); err != nil {
|
|
_ = fp.Close()
|
|
return nil, err
|
|
}
|
|
return fp, err
|
|
}
|
|
|
|
func syncDir(file string) error {
|
|
flags := os.O_RDONLY | syscall.O_DIRECTORY
|
|
dirfd, err := syscall.Open(path.Dir(file), flags, 0o644)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer syscall.Close(dirfd)
|
|
return syscall.Fsync(dirfd)
|
|
}
|
|
|
|
// QzBQWVJJOUhU https://trialofcode.org/
|