-
Notifications
You must be signed in to change notification settings - Fork 0
/
chown.go
65 lines (59 loc) · 1.29 KB
/
chown.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
package rs
import (
"flag"
"fmt"
"io"
"strings"
"github.com/gregoryv/nexus"
)
type Chown struct{}
func (me *Chown) Exec(cmd *Cmd) error {
flags := flag.NewFlagSet("Chown", flag.ContinueOnError)
flags.Usage = func() { me.WriteUsage(cmd.Out) }
flags.SetOutput(cmd.Out)
if err := flags.Parse(cmd.Args); err != nil {
return err
}
if len(flags.Args()) < 2 {
return fmt.Errorf("chown: missing path")
}
uid, gid, err := me.parseOwner(cmd.Sys, flags.Arg(0))
if err != nil {
return err
}
for _, path := range cmd.Args[1:] {
if err := cmd.Sys.SetOwner(path, uid); err != nil {
return fmt.Errorf("chown: %w", err)
}
if gid > -1 {
// if SetOwner worked so should this
cmd.Sys.SetGroup(path, gid)
}
}
return nil
}
func (me *Chown) WriteUsage(w io.Writer) {
p, _ := nexus.NewPrinter(w)
p.Println("Usage: Chown OWNER ...paths")
}
// parseOwner parses OWNER[:GROUP]
func (me *Chown) parseOwner(sys *Syscall, v string) (uid int, gid int, err error) {
uid = -1
gid = -1
parts := strings.Split(v, ":")
owner := parts[0]
var acc Account
if err = sys.LoadAccount(&acc, owner); err != nil {
return
}
uid = acc.UID
if len(parts) == 2 {
groupName := parts[1]
var group Group
if err = sys.LoadGroup(&group, groupName); err != nil {
return
}
gid = group.gid
}
return
}