X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=remote%2Fsync%2Ffiles.go;h=2c8b70468a55bb3f627c620db06c370f591d502e;hb=ecf65f3d0adfd90dd42d956515648e86b38b911b;hp=24c59ce1d0bac7f560249f718677922a929dfa25;hpb=b38c56e45416cd64cdac2cddffb212e0d48e2638;p=safcm%2Fsafcm.git diff --git a/remote/sync/files.go b/remote/sync/files.go index 24c59ce..2c8b704 100644 --- a/remote/sync/files.go +++ b/remote/sync/files.go @@ -324,7 +324,7 @@ reopen: err := unix.Unlinkat(parentFd, baseName, 0) if err != nil && !os.IsNotExist(err) { err2 := unix.Unlinkat(parentFd, baseName, - AT_REMOVEDIR) + unix.AT_REMOVEDIR) if err2 != nil && !os.IsNotExist(err2) { // See src/os/file_unix.go in Go's sources if err2 == unix.ENOTDIR { @@ -383,6 +383,10 @@ reopen: // the error when the user tries to access this // directory (access for the group will fail though). mode := change.Old.Mode & fs.ModePerm & 0700 + // Retain setgid/sticky so that the behavior does not + // change when creating and removing files. + mode |= change.Old.Mode & fs.ModeSetgid + mode |= change.Old.Mode & fs.ModeSticky debugf("chmodding %#o (temporary)", mode) err := oldFh.Chmod(mode) if err != nil { @@ -458,11 +462,12 @@ reopen: } // To guarantee durability fsync must be called on a parent directory // after adding, renaming or removing files therein. -// -// Calling sync on the files itself is not enough according to POSIX; man 2 -// fsync: "Calling fsync() does not necessarily ensure that the entry in the -// directory containing the file has also reached disk. For that an explicit -// fsync() on a file descriptor for the directory is also needed." + // + // Calling sync on the files itself is not enough according to POSIX; + // man 2 fsync: "Calling fsync() does not necessarily ensure that the + // entry in the directory containing the file has also reached disk. + // For that an explicit fsync() on a file descriptor for the directory + // is also needed." err = unix.Fsync(parentFd) if err != nil { return err @@ -547,9 +552,12 @@ func OpenParentDirectoryNoSymlinks(path string) (int, string, error) { } dir = ".." parts = []string{filepath.Base(wd)} - } else if parts[0] != "." { + } else { // Relative path: start at the current directory dir = "." + if parts[0] == "." { + parts = parts[1:] + } } dirFd, err := unix.Openat(unix.AT_FDCWD, dir, openReadonlyFlags, 0)