X-Git-Url: https://ruderich.org/simon/gitweb/?a=blobdiff_plain;f=cmd%2Fsafcm-remote%2Fsync%2Ffiles.go;h=119a3534239f68e2e5d10aee08ec2559590ada87;hb=778665c07c9cf6f434dbd1ee867fe8b8636f55c0;hp=3e3c7ec18357e8a01e21e22906e6a5e79cb8257f;hpb=ddd21f01f764a4ff61204d8e9d0ef8421ebf685c;p=safcm%2Fsafcm.git diff --git a/cmd/safcm-remote/sync/files.go b/cmd/safcm-remote/sync/files.go index 3e3c7ec..119a353 100644 --- a/cmd/safcm-remote/sync/files.go +++ b/cmd/safcm-remote/sync/files.go @@ -113,7 +113,7 @@ reopen: oldFh, err := OpenFileNoFollow(file.Path) if err != nil { err := err.(*fs.PathError) - if err.Err == syscall.ELOOP { + if err.Err == syscall.ELOOP || err.Err == syscall.EMLINK { // Check if ELOOP was caused not by O_NOFOLLOW but by // too many nested symlinks before the final path // component. @@ -149,6 +149,15 @@ reopen: if !change.Created { // Compare permissions change.Old.Mode = oldStat.Mode() + if change.Old.Mode.Type() == fs.ModeSymlink { + // Some BSD systems permit changing permissions of + // symlinks but ignore them on traversal. To keep it + // simple we don't support that and always use 0777 + // for symlink permissions (the value on GNU/Linux). + // + // TODO: Add proper support for symlinks on BSD + change.Old.Mode |= 0777 + } if change.Old.Mode != file.Mode { if change.Old.Mode.Type() != file.Mode.Type() { changeType = true @@ -258,7 +267,7 @@ reopen: } } - // Directory: create new directory (also type change to directory) + // Directory: create new directory, also type change to directory if file.Mode.IsDir() && (change.Created || changeType) { debugf("creating directory") err := os.Mkdir(file.Path, 0700) @@ -364,7 +373,7 @@ reopen: os.Remove(tmpPath) return err } - // Permissions are irrelevant for symlinks + // Permissions are irrelevant for symlinks (on most systems) default: panic(fmt.Sprintf("invalid file type %s", file.Mode))