func GetGroupList(u *user.User) ([]string, error) { var members []string gid, err := strconv.Atoi(u.Gid) if err != nil { return nil, err } nameC := C.CString(u.Username) defer C.free(unsafe.Pointer(nameC)) groupC := C.gid_t(gid) ngroupsC := C.int(0) C.mygetgrouplist(nameC, groupC, nil, &ngroupsC) ngroups := int(ngroupsC) groups := C.malloc(C.size_t(int(unsafe.Sizeof(groupC)) * ngroups)) defer C.free(groups) rv := C.mygetgrouplist(nameC, groupC, (*C.gid_t)(groups), &ngroupsC) if rv == -1 { return nil, fmt.Errorf("user: membership of %s in %s: %s", u.Username, u.Gid, syscall.Errno(rv)) } ngroups = int(ngroupsC) for i := 0; i < ngroups; i++ { gid := C.group_at(C.int(i), (*C.gid_t)(groups)) gidS := strconv.Itoa(int(gid)) group, err := LookupGroupID(gidS) if err != nil { return nil, err } members = append(members, group.Name) } return members, nil }
func userInGroup(u *user.User, g *Group) (bool, error) { if u.Gid == g.Gid { return true, nil } gid, err := strconv.Atoi(g.Gid) if err != nil { return false, err } nameC := C.CString(u.Username) defer C.free(unsafe.Pointer(nameC)) groupC := C.gid_t(gid) ngroupsC := C.int(0) C.mygetgrouplist(nameC, groupC, nil, &ngroupsC) ngroups := int(ngroupsC) groups := C.malloc(C.size_t(int(unsafe.Sizeof(groupC)) * ngroups)) defer C.free(groups) rv := C.mygetgrouplist(nameC, groupC, (*C.gid_t)(groups), &ngroupsC) if rv == -1 { return false, fmt.Errorf("user: membership of %s in %s: %s", u.Username, g.Name, syscall.Errno(rv)) } ngroups = int(ngroupsC) for i := 0; i < ngroups; i++ { gid := C.group_at(C.int(i), (*C.gid_t)(groups)) if g.Gid == strconv.Itoa(int(gid)) { return true, nil } } return false, nil }