shared/util_linux_cgo.go
func GroupId(name string) (int, error) {
	var grp C.struct_group
	var result *C.struct_group

	bufSize := C.sysconf(C._SC_GETGR_R_SIZE_MAX)
	if bufSize < 0 {
		bufSize = 4096
	}

	buf := C.malloc(C.size_t(bufSize))
	if buf == nil {
		return -1, fmt.Errorf("allocation failed")
	}

	cname := C.CString(name)
	defer C.free(unsafe.Pointer(cname))

again:
	rv, errno := C.getgrnam_r(cname,
		&grp,
		(*C.char)(buf),
		C.size_t(bufSize),
		&result)
	if rv != 0 {
		// OOM killer will take care of us if we end up doing this too
		// often.
		if errno == syscall.ERANGE {
			bufSize *= 2
			tmp := C.realloc(buf, C.size_t(bufSize))
			if tmp == nil {
				return -1, fmt.Errorf("allocation failed")
			}
			buf = tmp
			goto again
		}

		C.free(buf)
		return -1, fmt.Errorf("failed group lookup: %s", syscall.Errno(rv))
	}
	C.free(buf)

	if result == nil {
		return -1, fmt.Errorf("unknown group %s", name)
	}

	return int(C.int(result.gr_gid)), nil
}
func GroupId(name string) (int, error) {
	var grp C.struct_group
	var result *C.struct_group

	bufSize := C.sysconf(C._SC_GETGR_R_SIZE_MAX)
	if bufSize < 0 {
		bufSize = 4096
	}

	buf := C.malloc(C.size_t(bufSize))
	if buf == nil {
		return -1, fmt.Errorf("allocation failed")
	}

	cname := C.CString(name)
	defer C.free(unsafe.Pointer(cname))

again:
	rv, errno := C.getgrnam_r(cname,
		&grp,
		(*C.char)(buf),
		C.size_t(bufSize),
		&result)
	if rv != 0 {
		// OOM killer will take care of us if we end up doing this too
		// often.
		if errno == syscall.ERANGE {
			bufSize *= 2
			tmp := C.realloc(buf, C.size_t(bufSize))
			if tmp == nil {
				return -1, fmt.Errorf("allocation failed")
			}
			buf = tmp
			goto again
		}

		C.free(buf)
		return -1, fmt.Errorf("failed group lookup: %s", syscall.Errno(rv))
	}
	C.free(buf)

	if result == nil {
		return -1, fmt.Errorf("unknown group %s", name)
	}

	return int(C.int(result.gr_gid)), nil
}
func GroupId ( name string ) ( int , error ) { var grp C . struct_group var result * C . struct_group bufSize := C . sysconf ( C . _SC_GETGR_R_SIZE_MAX ) if bufSize < 0 { bufSize = 4096 } buf := C . malloc ( C . size_t ( bufSize ) ) if buf == nil { return - 1 , fmt . Errorf ( " " ) } cname := C . CString ( name ) defer C . free ( unsafe . Pointer ( cname ) ) again : rv , errno := C . getgrnam_r ( cname , & grp , ( * C . char ) ( buf ) , C . size_t ( bufSize ) , & result ) if rv != 0 { // OOM killer will take care of us if we end up doing this too // often. if errno == syscall . ERANGE { bufSize *= 2 tmp := C . realloc ( buf , C . size_t ( bufSize ) ) if tmp == nil { return - 1 , fmt . Errorf ( " " ) } buf = tmp goto again } C . free ( buf ) return - 1 , fmt . Errorf ( " " , syscall . Errno ( rv ) ) } C . free ( buf ) if result == nil { return - 1 , fmt . Errorf ( " " , name ) } return int ( C . int ( result . gr_gid ) ) , nil }
// GroupId is an adaption from https://codereview.appspot.com/4589049.
GroupId is an adaption from https : // codereview . appspot . com / 4589049 .