From 9922dab5fdabfe302589a17cb9fcfe3cf22e22c3 Mon Sep 17 00:00:00 2001 From: Mikkel Krautz Date: Sat, 13 Jan 2018 21:29:27 +0100 Subject: [PATCH] freezer_windows: make ReplaceFile call fall back to os.Rename. ReplaceFile fails because dst does not yet exist. To remedy this, we fall back to os.Rename, which makes everything work as it should. --- cmd/grumble/freeze_windows.go | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/cmd/grumble/freeze_windows.go b/cmd/grumble/freeze_windows.go index bb943c3..bc432b4 100644 --- a/cmd/grumble/freeze_windows.go +++ b/cmd/grumble/freeze_windows.go @@ -8,6 +8,7 @@ import ( "github.com/golang/protobuf/proto" "io/ioutil" "mumble.info/grumble/pkg/replacefile" + "os" "path/filepath" "strconv" ) @@ -50,9 +51,16 @@ func (server *Server) freezeToFile() (err error) { src := f.Name() dst := filepath.Join(Args.DataDir, "servers", strconv.FormatInt(server.Id, 10), "main.fz") backup := filepath.Join(Args.DataDir, "servers", strconv.FormatInt(server.Id, 10), "backup.fz") + err = replacefile.ReplaceFile(dst, src, backup, replacefile.Flag(0)) - if err != nil { - return err + // If the dst file does not exist (as in, on first launch) + // fall back to os.Rename. ReplaceFile does not work if the + // dst file is not there. + if os.IsNotExist(err) { + err = os.Rename(src, dst) + if err != nil { + return err + } } return nil