...
Source file
src/tawesoft.co.uk/go/drop/util.go
Documentation:
src/tawesoft.co.uk/go/drop/util.go
1 package drop
2
3 import (
4 "fmt"
5 "os"
6 "os/user"
7 "strconv"
8 "syscall"
9 )
10
11
12 func IsSuperuser() bool {
13 return os.Getuid() == 0
14 }
15
16
17 func UserLookup(username string) (uid int, gid int, gids []int, err error) {
18 var i int
19 var groups []string
20
21 usr, err := user.Lookup(username)
22 if err != nil { goto fail }
23
24 i, err = strconv.Atoi(usr.Uid)
25 if (err != nil) || (i == -1) { goto fail }
26 uid = i
27
28 i, err = strconv.Atoi(usr.Gid)
29 if (err != nil) || (i == -1) { goto fail }
30 gid = i
31
32 groups, err = usr.GroupIds()
33 if err != nil { goto fail }
34
35 gids = make([]int, 0, len(groups))
36 for _, g := range groups {
37 i, err = strconv.Atoi(g)
38 if (err != nil) || (i == -1) { goto fail }
39 gids = append(gids, i)
40 }
41
42 return
43
44 fail:
45 return 0, 0, nil, fmt.Errorf("user lookup failure: %v", err)
46 }
47
48
49 func rootSetMode(path string, uid int, gid int, mode os.FileMode) (err error) {
50 if !IsSuperuser() { err = fmt.Errorf("not superuser"); goto Err }
51
52
53
54
55 if int(mode.Perm()) != 0 {
56 err = syscall.Chmod(path, 0000)
57 if err != nil { goto Err }
58 }
59
60 if (uid != -1) || (gid != -1) {
61 err = syscall.Chown(path, uid, gid)
62 if err != nil { goto Err }
63 }
64
65 if mode.Perm() != 0 {
66 err = syscall.Chmod(path, uint32(mode.Perm()))
67 if err != nil { goto Err }
68 }
69
70 return nil
71
72 Err:
73 return fmt.Errorf("error setting mode of %q: %v", path, err)
74 }
75
View as plain text