func lookupUnix(gid int, groupname string, lookupByName bool) (*Group, error) { var grp C.struct_group var result *C.struct_group var bufSize C.long if runtime.GOOS == "freebsd" { panic("Don't know how to deal with freebsd.") } else { bufSize = C.sysconf(C._SC_GETGR_R_SIZE_MAX) * 20 if bufSize <= 0 || bufSize > 1<<20 { return nil, fmt.Errorf("group: unreasonable _SC_GETGR_R_SIZE_MAX of %d", bufSize) } } buf := C.malloc(C.size_t(bufSize)) defer C.free(buf) var rv C.int if lookupByName { nameC := C.CString(groupname) defer C.free(unsafe.Pointer(nameC)) rv = C.getgrnam_r(nameC, &grp, (*C.char)(buf), C.size_t(bufSize), &result) if rv != 0 { return nil, fmt.Errorf("group: lookup groupname %s: %s", groupname, syscall.Errno(rv)) } if result == nil { return nil, UnknownGroupError(groupname) } } else { rv = C.getgrgid_r(C.__gid_t(gid), &grp, (*C.char)(buf), C.size_t(bufSize), &result) if rv != 0 { return nil, fmt.Errorf("group: lookup groupid %d: %s", gid, syscall.Errno(rv)) } if result == nil { return nil, UnknownGroupIdError(gid) } } u := &Group{ Gid: strconv.Itoa(int(grp.gr_gid)), Groupname: C.GoString(grp.gr_name), } return u, nil }
func lookup(gid int, groupname string, lookupByName bool) (*Group, error) { var grp C.struct_group var result *C.struct_group var bufsize C.long bufsize = C.sysconf(C._SC_GETGR_R_SIZE_MAX) if bufsize == -1 { bufsize = 1024 } buf := C.malloc(C.size_t(bufsize)) defer C.free(buf) var rv C.int if lookupByName { CGroup := C.CString(groupname) defer C.free(unsafe.Pointer(CGroup)) rv = C.getgrnam_r(CGroup, &grp, (*C.char)(buf), C.size_t(bufsize), &result) if rv != 0 { return nil, fmt.Errorf("group: lookup group name %s: %s", groupname, syscall.Errno(rv)) } if result == nil { return nil, UnknownGroupError(groupname) } } else { rv = C.getgrgid_r(C.gid_t(gid), &grp, (*C.char)(buf), C.size_t(bufsize), &result) if rv != 0 { return nil, fmt.Errorf("group: lookup gid %d: %s", gid, syscall.Errno(rv)) } if result == nil { return nil, UnknownGroupIdError(gid) } } g := &Group{ Gid: int(grp.gr_gid), Name: C.GoString(grp.gr_name), Members: convert(grp.gr_mem), } return g, nil }