diff --git a/cmd/yggdrasil/chuser_openbsd.go b/cmd/yggdrasil/chuser_openbsd.go new file mode 100644 index 00000000..c1cccf7b --- /dev/null +++ b/cmd/yggdrasil/chuser_openbsd.go @@ -0,0 +1,57 @@ +//go:build openbsd +// +build openbsd + +package main + +import ( + "fmt" + "os/user" + "strconv" + "strings" + + "golang.org/x/sys/unix" +) + +func chuser(input string) error { + givenUser, givenGroup, _ := strings.Cut(input, ":") + + var ( + err error + usr *user.User + grp *user.Group + uid, gid int + ) + + if usr, err = user.Lookup(givenUser); err != nil { + if usr, err = user.LookupId(givenUser); err != nil { + return err + } + } + if uid, err = strconv.Atoi(usr.Uid); err != nil { + return err + } + + if givenGroup != "" { + if grp, err = user.LookupGroup(givenGroup); err != nil { + if grp, err = user.LookupGroupId(givenGroup); err != nil { + return err + } + } + + gid, _ = strconv.Atoi(grp.Gid) + } else { + gid, _ = strconv.Atoi(usr.Gid) + } + + if err := unix.Setgroups([]int{gid}); err != nil { + return fmt.Errorf("setgroups: %d: %v", gid, err) + } + if err := unix.Setresgid(gid, gid, gid); err != nil { + return fmt.Errorf("setresgid: %d: %v", gid, err) + } + if err := unix.Setresuid(uid, uid, uid); err != nil { + return fmt.Errorf("setresuid: %d: %v", uid, err) + } + + return nil +} diff --git a/cmd/yggdrasil/chuser_unix.go b/cmd/yggdrasil/chuser_unix.go index 69803773..978d14b7 100644 --- a/cmd/yggdrasil/chuser_unix.go +++ b/cmd/yggdrasil/chuser_unix.go @@ -1,5 +1,5 @@ -//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris -// +build aix darwin dragonfly freebsd linux netbsd openbsd solaris +//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || solaris +// +build aix darwin dragonfly freebsd linux netbsd solaris package main