...
Source file src/pkg/internal/syscall/unix/getrandom_linux.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 type GetRandomFlag uintptr
17
18 const (
19
20 GRND_NONBLOCK GetRandomFlag = 0x0001
21
22
23 GRND_RANDOM GetRandomFlag = 0x0002
24 )
25
26
27
28 func GetRandom(p []byte, flags GetRandomFlag) (n int, err error) {
29 if len(p) == 0 {
30 return 0, nil
31 }
32 if atomic.LoadInt32(&randomUnsupported) != 0 {
33 return 0, syscall.ENOSYS
34 }
35 r1, _, errno := syscall.Syscall(randomTrap,
36 uintptr(unsafe.Pointer(&p[0])),
37 uintptr(len(p)),
38 uintptr(flags))
39 if errno != 0 {
40 if errno == syscall.ENOSYS {
41 atomic.StoreInt32(&randomUnsupported, 1)
42 }
43 return 0, errno
44 }
45 return int(r1), nil
46 }
47
View as plain text