mirror of
https://github.com/tailscale/tailscale.git
synced 2025-02-22 21:08:38 +00:00
34 lines
782 B
Go
34 lines
782 B
Go
![]() |
// Copyright (c) Tailscale Inc & AUTHORS
|
||
|
// SPDX-License-Identifier: BSD-3-Clause
|
||
|
|
||
|
package atomicfile
|
||
|
|
||
|
import (
|
||
|
"os"
|
||
|
|
||
|
"golang.org/x/sys/windows"
|
||
|
)
|
||
|
|
||
|
func rename(srcFile, destFile string) error {
|
||
|
// Use replaceFile when possible to preserve the original file's attributes and ACLs.
|
||
|
if err := replaceFile(destFile, srcFile); err == nil || err != windows.ERROR_FILE_NOT_FOUND {
|
||
|
return err
|
||
|
}
|
||
|
// destFile doesn't exist. Just do a normal rename.
|
||
|
return os.Rename(srcFile, destFile)
|
||
|
}
|
||
|
|
||
|
func replaceFile(destFile, srcFile string) error {
|
||
|
destFile16, err := windows.UTF16PtrFromString(destFile)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
srcFile16, err := windows.UTF16PtrFromString(srcFile)
|
||
|
if err != nil {
|
||
|
return err
|
||
|
}
|
||
|
|
||
|
return replaceFileW(destFile16, srcFile16, nil, 0, nil, nil)
|
||
|
}
|