arblant
firefox-vpn-client / core / internal / tunservice / files.go
files.go22 lines · 504 B
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
package tunservice

import "os"

// replaceFile writes data to path through a file beside it, so a failure
// leaves the old file whole.
func replaceFile(path string, data []byte, mode os.FileMode) error {
	tmp := path + ".tmp"
	if err := os.WriteFile(tmp, data, mode); err != nil {
		return err
	}
	// The mode, whatever the umask.
	if err := os.Chmod(tmp, mode); err != nil {
		os.Remove(tmp)
		return err
	}
	if err := os.Rename(tmp, path); err != nil {
		os.Remove(tmp)
		return err
	}
	return nil
}