File Coverage

GetRandom.xs
Criterion Covered Total %
statement 15 18 83.3
branch 9 14 64.2
condition n/a
subroutine n/a
pod n/a
total 24 32 75.0


line stmt bran cond sub pod time code
1             #define PERL_NO_GET_CONTEXT
2             #ifndef HAS_SYSCALL_PROTO
3             #define HAS_SYSCALL_PROTO /* hax */
4             #endif
5             #include "EXTERN.h"
6             #include "perl.h"
7             #include "XSUB.h"
8              
9             #include
10             #include
11             #include
12             #include
13              
14             #define MY_PKG "Sys::GetRandom"
15              
16             #ifndef PERL_VERSION_GE
17             #define PERL_VERSION_GE(R, V, S) (PERL_REVISION > (R) || (PERL_REVISION == (R) && (PERL_VERSION > (V) || (PERL_VERSION == (V) && PERL_SUBVERSION >= (S)))))
18             #endif
19              
20             MODULE = Sys::GetRandom PACKAGE = Sys::GetRandom PREFIX = sgr_
21             PROTOTYPES: ENABLE
22              
23             BOOT:
24             {
25 2           HV *const stash = gv_stashpvs(MY_PKG, GV_ADD);
26 2           newCONSTSUB(stash, "GRND_NONBLOCK", newSVuv(GRND_NONBLOCK));
27 2           newCONSTSUB(stash, "GRND_RANDOM", newSVuv(GRND_RANDOM));
28 2           newCONSTSUB(stash, "SYS_getrandom", newSVuv(SYS_getrandom));
29             }
30              
31             ssize_t
32             sgr_getrandom(buffer, length, flags = 0, offset = 0)
33             SV *buffer
34             size_t length
35             unsigned int flags
36             STRLEN offset
37             PREINIT:
38             char *p;
39             CODE:
40 20 50         if (length >= SSIZE_MAX || length >= (STRLEN)-1 - offset) {
    50          
41 0           errno = EFAULT;
42 0           XSRETURN_UNDEF;
43             }
44 20 100         if (!SvOK(buffer)) {
45             #if PERL_VERSION_GE(5, 25, 6)
46 3           SvPVCLEAR(buffer);
47             #else
48             sv_setpvs(buffer, "");
49             #endif
50             } else {
51             STRLEN curlen;
52 17           SvPVbyte_force(buffer, curlen);
53             (void)curlen;
54             }
55 20 50         p = offset + SvGROW(buffer, offset + length + 1u);
    100          
56 20           RETVAL = getrandom(p, length, flags);
57 20 50         if (RETVAL == -1) {
58 0           XSRETURN_UNDEF;
59             }
60 20           p[RETVAL] = '\0';
61 20           SvCUR_set(buffer, offset + RETVAL);
62 20           SvUTF8_off(buffer);
63 20 50         SvSETMAGIC(buffer);
64             OUTPUT:
65             RETVAL