github.com/kardianos/nomad@v0.1.3-0.20151022182107-b13df73ee850/client/allocdir/alloc_dir_posix.go (about) 1 // +build !windows 2 3 // Functions shared between linux/darwin. 4 package allocdir 5 6 import ( 7 "fmt" 8 "os" 9 "os/user" 10 "strconv" 11 "syscall" 12 ) 13 14 func (d *AllocDir) linkOrCopy(src, dst string, perm os.FileMode) error { 15 // Attempt to hardlink. 16 if err := os.Link(src, dst); err == nil { 17 return nil 18 } 19 20 return fileCopy(src, dst, perm) 21 } 22 23 func (d *AllocDir) dropDirPermissions(path string) error { 24 // Can't do anything if not root. 25 if syscall.Geteuid() != 0 { 26 return nil 27 } 28 29 u, err := user.Lookup("nobody") 30 if err != nil { 31 return err 32 } 33 34 uid, err := getUid(u) 35 if err != nil { 36 return err 37 } 38 39 gid, err := getGid(u) 40 if err != nil { 41 return err 42 } 43 44 if err := os.Chown(path, uid, gid); err != nil { 45 return fmt.Errorf("Couldn't change owner/group of %v to (uid: %v, gid: %v): %v", path, uid, gid, err) 46 } 47 48 if err := os.Chmod(path, 0777); err != nil { 49 return fmt.Errorf("Chmod(%v) failed: %v", path, err) 50 } 51 52 return nil 53 } 54 55 func getUid(u *user.User) (int, error) { 56 uid, err := strconv.Atoi(u.Uid) 57 if err != nil { 58 return 0, fmt.Errorf("Unable to convert Uid to an int: %v", err) 59 } 60 61 return uid, nil 62 } 63 64 func getGid(u *user.User) (int, error) { 65 gid, err := strconv.Atoi(u.Gid) 66 if err != nil { 67 return 0, fmt.Errorf("Unable to convert Gid to an int: %v", err) 68 } 69 70 return gid, nil 71 }