package Linux::Perl::getrandom; use strict; use warnings; =encoding utf-8 =head1 NAME Linux::Perl::getrandom =head1 SYNOPSIS my $numbytes = Linux::Perl::getrandom::x86_64->getrandom( buffer => \$buffer, flags => [ 'RANDOM', 'NONBLOCK' ], ); # … or, platform-neutral: my $numbytes = Linux::Perl::getrandom->getrandom( buffer => \$buffer, flags => [ 'RANDOM', 'NONBLOCK' ], ); =head1 DESCRIPTION This is an interface to Linux’s C system call. This system call is documented only for kernel 3.17 and after; however, it appears to be present in some earlier kernel versions. =cut use Linux::Perl; use Linux::Perl::Pointer; use parent 'Linux::Perl::Base'; my %FLAG_VALUE = ( NONBLOCK => 1, RANDOM => 2, ); sub getrandom { my ($class, %opts) = @_; $class = $class->_get_arch_module(); my $flags = 0; if ($opts{'flags'}) { for my $f ( @{ $opts{'flags'} } ) { $flags |= $FLAG_VALUE{$f} || do { die "Invalid flag: “$f”!"; }; } } if ('SCALAR' ne ref $opts{'buffer'}) { die "“buffer” must be a scalar reference, not “$opts{'buffer'}”!"; } return Linux::Perl::call( $class->NR_getrandom(), Linux::Perl::Pointer::get_address( ${ $opts{'buffer'} } ), length( ${ $opts{'buffer'} } ), 0 + $flags, ); } 1;