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