...
Source file src/internal/syscall/unix/getrandom_freebsd.go
1
2
3
4
5 package unix
6
7 import (
8 "sync/atomic"
9 "syscall"
10 "unsafe"
11 )
12
13 var randomUnsupported int32
14
15
16 const randomTrap uintptr = 563
17
18
19 type GetRandomFlag uintptr
20
21 const (
22
23 GRND_NONBLOCK GetRandomFlag = 0x0001
24
25
26 GRND_RANDOM GetRandomFlag = 0x0002
27 )
28
29
30 func GetRandom(p []byte, flags GetRandomFlag) (n int, err error) {
31 if len(p) == 0 {
32 return 0, nil
33 }
34 if atomic.LoadInt32(&randomUnsupported) != 0 {
35 return 0, syscall.ENOSYS
36 }
37 r1, _, errno := syscall.Syscall(randomTrap,
38 uintptr(unsafe.Pointer(&p[0])),
39 uintptr(len(p)),
40 uintptr(flags))
41 if errno != 0 {
42 if errno == syscall.ENOSYS {
43 atomic.StoreInt32(&randomUnsupported, 1)
44 }
45 return 0, errno
46 }
47 return int(r1), nil
48 }
49
View as plain text