diff options
author | Daniel J Walsh <dwalsh@redhat.com> | 2018-03-29 11:01:47 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-04-05 14:13:49 +0000 |
commit | fdcf633a33bbbfbc99268965ef5da03a4770619b (patch) | |
tree | 59be1ab815261e106220a4691766830b58657ac0 /vendor/github.com/mrunalp/fileutils/idtools.go | |
parent | ca3b2414516c04125f986775c0cbce27f0f1e505 (diff) | |
download | podman-fdcf633a33bbbfbc99268965ef5da03a4770619b.tar.gz podman-fdcf633a33bbbfbc99268965ef5da03a4770619b.tar.bz2 podman-fdcf633a33bbbfbc99268965ef5da03a4770619b.zip |
Add hooks support to podman
Signed-off-by: Daniel J Walsh <dwalsh@redhat.com>
Closes: #155
Approved by: mheon
Diffstat (limited to 'vendor/github.com/mrunalp/fileutils/idtools.go')
-rw-r--r-- | vendor/github.com/mrunalp/fileutils/idtools.go | 49 |
1 files changed, 49 insertions, 0 deletions
diff --git a/vendor/github.com/mrunalp/fileutils/idtools.go b/vendor/github.com/mrunalp/fileutils/idtools.go new file mode 100644 index 000000000..161aec8f5 --- /dev/null +++ b/vendor/github.com/mrunalp/fileutils/idtools.go @@ -0,0 +1,49 @@ +package fileutils + +import ( + "os" + "path/filepath" +) + +// MkdirAllNewAs creates a directory (include any along the path) and then modifies +// ownership ONLY of newly created directories to the requested uid/gid. If the +// directories along the path exist, no change of ownership will be performed +func MkdirAllNewAs(path string, mode os.FileMode, ownerUID, ownerGID int) error { + // make an array containing the original path asked for, plus (for mkAll == true) + // all path components leading up to the complete path that don't exist before we MkdirAll + // so that we can chown all of them properly at the end. If chownExisting is false, we won't + // chown the full directory path if it exists + var paths []string + if _, err := os.Stat(path); err != nil && os.IsNotExist(err) { + paths = []string{path} + } else if err == nil { + // nothing to do; directory path fully exists already + return nil + } + + // walk back to "/" looking for directories which do not exist + // and add them to the paths array for chown after creation + dirPath := path + for { + dirPath = filepath.Dir(dirPath) + if dirPath == "/" { + break + } + if _, err := os.Stat(dirPath); err != nil && os.IsNotExist(err) { + paths = append(paths, dirPath) + } + } + + if err := os.MkdirAll(path, mode); err != nil && !os.IsExist(err) { + return err + } + + // even if it existed, we will chown the requested path + any subpaths that + // didn't exist when we called MkdirAll + for _, pathComponent := range paths { + if err := os.Chown(pathComponent, ownerUID, ownerGID); err != nil { + return err + } + } + return nil +} |