1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65
|
TYPEMAP
Fd T_FD
struct signalfd_siginfo T_SIGFDINFO
sigset_t* T_SIGSET
signo_t T_SIGNO
struct timespec T_TIMESPEC
INPUT
T_FD
$var = PerlIO_fileno(IoOFP(sv_2io(SvRV($arg))))
T_SIGSET
if (SvROK($arg)) {
if (!sv_derived_from($arg, \"POSIX::SigSet\")) {
Perl_croak(aTHX_ \"$var is not of type POSIX::SigSet\");
} else {
\x{23}if PERL_VERSION > 15 || PERL_VERSION == 15 && PERL_SUBVERSION > 2
$var = (sigset_t *) SvPV_nolen(SvRV($arg));
\x{23}else
IV tmp = SvIV((SV*)SvRV($arg));
$var = INT2PTR(sigset_t*, tmp);
\x{23}endif
}
} else if (SvOK($arg)) {
int signo = (SvIOK($arg) || looks_like_number($arg)) && SvIV($arg) ? SvIV($arg) : whichsig(SvPV_nolen($arg));
SV* buffer = sv_2mortal(newSVpvn(\"\", 0));
sv_grow(buffer, sizeof(sigset_t));
$var = (sigset_t*)SvPV_nolen(buffer);
sigemptyset($var);
sigaddset($var, signo);
} else {
$var = NULL;
}
T_SIGNO
$var = (SvIOK($arg) || looks_like_number($arg)) && SvIV($arg) ? SvIV($arg) : whichsig(SvPV_nolen($arg));
T_TIMESPEC
if (SvROK($arg) && sv_derived_from($arg, \"Time::Spec\")) {
$var = *(struct timespec*)SvPV_nolen(SvRV($arg));
} else {
NV input = SvNV($arg);
$var.tv_sec = (time_t) floor(input);
$var.tv_nsec = (long) ((input - $var.tv_sec) * 1000000000);
}
OUTPUT
T_SIGFDINFO
{
HV* ret = newHV();
hv_stores(ret, \"signo\", newSViv($var.ssi_signo));
hv_stores(ret, \"code\", newSViv($var.ssi_code));
hv_stores(ret, \"errno\", newSViv($var.ssi_errno));
hv_stores(ret, \"pid\", newSVuv($var.ssi_pid));
hv_stores(ret, \"uid\", newSVuv($var.ssi_uid));
hv_stores(ret, \"fd\", newSViv($var.ssi_fd));
hv_stores(ret, \"tid\", newSVuv($var.ssi_tid));
hv_stores(ret, \"band\", newSVuv($var.ssi_band));
hv_stores(ret, \"overrun\", newSVuv($var.ssi_overrun));
hv_stores(ret, \"trapno\", newSVuv($var.ssi_trapno));
hv_stores(ret, \"status\", newSViv($var.ssi_status));
hv_stores(ret, \"value\", newSViv($var.ssi_int));
hv_stores(ret, \"ptr\", newSVuv(PTR2UV($var.ssi_ptr)));
hv_stores(ret, \"addr\", newSVuv(PTR2UV($var.ssi_addr)));
$arg = newRV_noinc((SV*)ret);
}
T_TIMESPEC
sv_setnv($arg, $var.tv_sec + $var.tv_nsec / 1000000000.0);
|