// Read, write and edit the config file
// Unix specific functions.

//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
// +build darwin dragonfly freebsd linux netbsd openbsd solaris

package configfile

import (
	"os"
	"os/user"
	"strconv"
	"syscall"

	"github.com/rclone/rclone/fs"
)

// attemptCopyGroups tries to keep the group the same. User will be the one
// who is currently running this process.
func attemptCopyGroup(fromPath, toPath string) {
	info, err := os.Stat(fromPath)
	if err != nil || info.Sys() == nil {
		return
	}
	if stat, ok := info.Sys().(*syscall.Stat_t); ok {
		uid := int(stat.Uid)
		// prefer self over previous owner of file, because it has a higher chance
		// of success
		if user, err := user.Current(); err == nil {
			if tmpUID, err := strconv.Atoi(user.Uid); err == nil {
				uid = tmpUID
			}
		}
		if err = os.Chown(toPath, uid, int(stat.Gid)); err != nil {
			fs.Debugf(nil, "Failed to keep previous owner of config file: %v", err)
		}
	}
}
