| 177 | } |
| 178 | |
| 179 | func AtomicWriteFile(fileName string, data []byte, perm os.FileMode) error { |
| 180 | tmpFileName := fileName + TempFileSuffix |
| 181 | if err := os.WriteFile(tmpFileName, data, perm); err != nil { |
| 182 | if removeErr := os.Remove(tmpFileName); removeErr != nil && !os.IsNotExist(removeErr) { |
| 183 | return fmt.Errorf("failed to write temp file %q: %w (also failed to remove temp file: %v)", tmpFileName, err, removeErr) |
| 184 | } |
| 185 | return err |
| 186 | } |
| 187 | if err := os.Rename(tmpFileName, fileName); err != nil { |
| 188 | if removeErr := os.Remove(tmpFileName); removeErr != nil && !os.IsNotExist(removeErr) { |
| 189 | return fmt.Errorf("failed to rename temp file %q to %q: %w (also failed to remove temp file: %v)", tmpFileName, fileName, err, removeErr) |
| 190 | } |
| 191 | return err |
| 192 | } |
| 193 | return nil |
| 194 | } |
| 195 | |
| 196 | var ( |
| 197 | systemBinDirs = []string{ |