// If newname still contains slashes after removing the oldname
// prefix, the rename is cross-directory and must be rejected.
- // This case is caught by d.Marshal below.
+ if lastIndex(newname, '/') >= 0 {
+ return &LinkError{"rename", oldname, newname, ErrInvalid}
+ }
var d syscall.Dir
if err != nil {
return &LinkError{"rename", oldname, newname, err}
}
+
+ // If newname already exists and is not a directory, rename replaces it.
+ f, err := Stat(dirname + newname)
+ if err == nil && !f.IsDir() {
+ Remove(dirname + newname)
+ }
+
if err = syscall.Wstat(oldname, buf[:n]); err != nil {
return &LinkError{"rename", oldname, newname, err}
}
}
func TestRenameOverwriteDest(t *testing.T) {
- if runtime.GOOS == "plan9" {
- t.Skip("skipping on plan9")
- }
defer chtmpdir(t)()
from, to := "renamefrom", "renameto"
// Just in case.