mirror of
https://blitiri.com.ar/repos/chasquid
synced 2025-12-17 14:37:02 +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:
@@ -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
|
||||||
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user