1
0
mirror of https://blitiri.com.ar/repos/chasquid synced 2025-12-18 14:47:03 +00:00

safeio: Preserve file ownership

This patch makes safeio preserve file ownership. This is specially
useful when using command-line utilities as root, but the files they
change are owned by a different user.
This commit is contained in:
Alberto Bertogli
2016-10-16 14:19:41 +01:00
parent ac7f32c2ce
commit cda11e03a5

View File

@@ -6,6 +6,7 @@ import (
"io/ioutil" "io/ioutil"
"os" "os"
"path" "path"
"syscall"
) )
// WriteFile writes data to a file named by filename, atomically. // WriteFile writes data to a file named by filename, atomically.
@@ -24,12 +25,20 @@ func WriteFile(filename string, data []byte, perm os.FileMode) error {
return err return err
} }
if err = os.Chmod(tmpf.Name(), perm); err != nil { if err = tmpf.Chmod(perm); err != nil {
tmpf.Close() tmpf.Close()
os.Remove(tmpf.Name()) os.Remove(tmpf.Name())
return err return err
} }
if uid, gid := getOwner(filename); uid >= 0 {
if err = tmpf.Chown(uid, gid); err != nil {
tmpf.Close()
os.Remove(tmpf.Name())
return err
}
}
if _, err = tmpf.Write(data); err != nil { if _, err = tmpf.Write(data); err != nil {
tmpf.Close() tmpf.Close()
os.Remove(tmpf.Name()) os.Remove(tmpf.Name())
@@ -43,3 +52,17 @@ func WriteFile(filename string, data []byte, perm os.FileMode) error {
return os.Rename(tmpf.Name(), filename) return os.Rename(tmpf.Name(), filename)
} }
func getOwner(fname string) (uid, gid int) {
uid = -1
gid = -1
stat, err := os.Stat(fname)
if err == nil {
if sysstat, ok := stat.Sys().(*syscall.Stat_t); ok {
uid = int(sysstat.Uid)
gid = int(sysstat.Gid)
}
}
return
}