File Coverage

blib/lib/Sys/GetRandom/PP.pm
Criterion Covered Total %
statement 38 41 92.6
branch 8 16 50.0
condition 3 9 33.3
subroutine 7 7 100.0
pod 2 2 100.0
total 58 75 77.3


line stmt bran cond sub pod time code
1             package Sys::GetRandom::PP;
2 1     1   254795 use strict;
  1         3  
  1         42  
3 1     1   6 use warnings;
  1         2  
  1         55  
4              
5 1     1   9 use Exporter qw(import);
  1         2  
  1         76  
6 1     1   8 use Carp qw(croak);
  1         2  
  1         266  
7              
8 1         3 use constant do {
9 1         7 my %bits_getrandom = (
10             'dragonfly' => 550,
11             'freebsd' => 563,
12             'midnightbsd' => 563,
13             'netbsd' => 91,
14             'solaris' => 126,
15             'aarch64-linux' => 278,
16             'armv6l-linux' => 384,
17             'i686-linux' => 355,
18             'x86_64-linux' => 318,
19             );
20 1   33     24 my $getrandom = $bits_getrandom{$^O} || do {
21             require Config;
22             my ($arch) = $Config::Config{archname} =~ m{^([^\-]+-[^\-]+)};
23             $bits_getrandom{$arch} || die "Unsupported platform: $arch"
24             };
25             +{
26 1         655 _SYS_getrandom => $getrandom,
27             GRND_NONBLOCK => 1,
28             GRND_RANDOM => 2,
29             }
30 1     1   8 };
  1         2  
31              
32             our $VERSION = '0.06_001';
33             $VERSION =~ tr/_//d;
34              
35             our @EXPORT_OK = qw(
36             GRND_RANDOM
37             GRND_NONBLOCK
38             getrandom
39             random_bytes
40             );
41              
42             sub getrandom ($$;$) {
43 4 50 33 4 1 229928 if (@_ < 2 || @_ > 3) {
44 0         0 croak 'Usage: ' . __PACKAGE__ . '::getrandom($buffer, $length, $flags = 0)';
45             }
46 4         7 my $bufref = \$_[0];
47 4         8 my (undef, $length, $flags) = @_;
48 4         5 $length |= 0;
49 4         6 $flags |= 0;
50 4         7 $$bufref .= '';
51 4         10 utf8::downgrade $$bufref;
52 4         7 my $dlen = $length - length $$bufref;
53 4 100       11 $$bufref .= $dlen > 0 ? "\0" x $dlen : '';
54 4         18 my $r = syscall _SYS_getrandom, $$bufref, $length, $flags;
55 4 50       9 if ($r == -1) {
56 0 0       0 substr($$bufref, -$dlen) = '' if $dlen > 0;
57 0         0 return undef;
58             }
59 4         7 substr($$bufref, $r) = '';
60 4         18 $r
61             }
62              
63             sub random_bytes {
64 1     1 1 2 my ($n) = @_;
65 1         8 $n |= 0;
66 1 50 33     9 $n >= 0 && $n <= 256
67             or croak "Argument to random_bytes() must be an integer between 0 and 256, not $n";
68 1 50       2 return '' if $n == 0;
69 1 50       2 defined(my $r = getrandom(my $buf, $n))
70             or die "Internal error: getrandom(\$buf, $n) failed: $!";
71 1 50       3 $r == $n
72             or die "Internal error: getrandom(\$buf, $n) returned $r";
73 1         4 $buf
74             }
75              
76             1
77             __END__