Linux-RTC-Ioctl

 view release on metacpan or  search on metacpan

lib/Linux/RTC/Ioctl.xs  view on Meta::CPAN

# include <sys/ioctl.h>
# include <linux/rtc.h>

#define PERL_NO_GET_CONTEXT
#include "EXTERN.h"
#include "perl.h"
#include "XSUB.h"

#if defined(read) || defined(ioctl)
# warning "POSIX read/ioctl re-defined"
# include "src/IoctlNative.h"
#else
# define linux_rtc_native_read read
# define linux_rtc_native_ioctl ioctl
#endif

#include "const-c.inc"

static const char
    invalidHandleMsg[] = "Invalid device file handle.",
    missingDeviceFileMsg[] = "No device file given.",
    rtcRecordSizeMsg[] = "Unexpected end of file from real time clock device %s.",
    unsignedParamMsg[] = "Unsigned number parameter expected.",
    numericParamMsg[] = "Numeric parameter expected.",
    hashAccessFailedMsg[] = "Failed to access $rtc object hash keys.",
    objectFieldsMissingMsg[] = "Member field \"%s\" is missing or is non-numeric in RTC object.";

MODULE = Linux::RTC::Ioctl		PACKAGE = Linux::RTC::Ioctl		

INCLUDE: const-xs.inc

void
wait_for_timer(HV *rtc)
    PROTOTYPE: \%
    PPCODE:
	int fd = -1;
	char const *node = "";
	unsigned long record = 0;
	ssize_t read_size = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);

	{
	    SV **nodename = hv_fetch(rtc, "nodename", 8, 0);

	    if (nodename && (node = SvPV_nolen(*nodename), SvPOK(*nodename)))
		;
	    else
		node = "";
	}

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	read_size = linux_rtc_native_read(fd, &record, sizeof record);

	if (read_size == sizeof record)
	{
	    EXTEND(SP, 2);
	    PUSHs(sv_2mortal(newSVuv(record & ((1 << CHAR_BIT) - 1))));
	    PUSHs(sv_2mortal(newSVuv(record >> CHAR_BIT)));
	    XSRETURN(2);
	}
	else
	    if (read_size >= 0)
		croak(rtcRecordSizeMsg, node);
	    else
	    {
	        // return undef after a read error, check $!
	        XPUSHs(&PL_sv_undef);
	        XSRETURN(1);
	    }

#if defined(RTC_IRQP_SET) && defined(RTC_IRQP_READ)

void
periodic_frequency(HV *rtc, ...)
    PROTOTYPE: \%;$
    PPCODE:
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	if (items > 1)
	{
	    IV freq = SvIV(ST(1));

	    if (SvIOK(ST(1)) && freq > 0)
	    {
		dXSTARG;
		unsigned long frequency = freq;
		int result = ioctl(fd, RTC_IRQP_SET, frequency);

		if (result < 0)
		    XPUSHs(&PL_sv_undef);
		else
		    XPUSHu(result);

		XSRETURN(1);
	    }
	    else
		croak(unsignedParamMsg);
	}
	else
	{
	    dXSTARG;
	    unsigned long frequency;
	    int result = ioctl(fd, RTC_IRQP_READ, &frequency);

	    if (result < 0)
		XPUSHs(&PL_sv_undef);
	    else
		XPUSHu(frequency);

	    XSRETURN(1);
	}

#endif

#if defined(RTC_PIE_ON) && defined(RTC_PIE_OFF)

void
periodic_interrupt(HV *rtc, bool fEnable)
    PROTOTYPE: \%$
    PPCODE:
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	{
	    dXSTARG;
	    int result = ioctl(fd, fEnable ? RTC_PIE_ON : RTC_PIE_OFF, 0);

	    if (result < 0)
		XPUSHs(&PL_sv_undef);
	    else
		XPUSHu(result);

	    XSRETURN(1);
	}

#endif

#if defined(RTC_UIE_ON) && defined(RTC_UIE_OFF)

void
update_interrupt(HV *rtc, bool fEnable)
    PROTOTYPE: \%$
    PPCODE:
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	{
	    dXSTARG;
	    int result = ioctl(fd, fEnable ? RTC_UIE_ON : RTC_UIE_OFF, 0);

	    if (result < 0)
		XPUSHs(&PL_sv_undef);
	    else
		XPUSHu(result);

	    XSRETURN(1);
	}

#endif

#if defined(RTC_AIE_ON) && defined(RTC_AIE_OFF)

void
alarm_interrupt(HV *rtc, bool fEnable)
    PROTOTYPE: \%$
    PPCODE:
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	{
	    dXSTARG;
	    int result = ioctl(fd, fEnable ? RTC_AIE_ON : RTC_AIE_OFF, 0);

	    if (result < 0)
		XPUSHs(&PL_sv_undef);
	    else
		XPUSHu(result);

	    XSRETURN(1);
	}

#endif

#if defined(RTC_RD_TIME)

void
read_time(HV *rtc)
    PROTOTYPE: \%
    PPCODE:
	struct rtc_time tm = { 0, 0, 0,  0, 0, 0,  -1, -1, -1 };
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);
	int result;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	result = ioctl(fd, RTC_RD_TIME, &tm);

	if (result < 0)
	{
	    XPUSHs(&PL_sv_undef);
	    XSRETURN(1);
	}
	else
	    if (G_ARRAY == GIMME_V)
	    {
		/* called in list context, push time members on stack and do not store them. */
		EXTEND(SP, 9);
		mPUSHi(tm.tm_sec);
		mPUSHi(tm.tm_min);
		mPUSHi(tm.tm_hour);

		mPUSHi(tm.tm_mday);
		mPUSHi(tm.tm_mon);
		mPUSHi(tm.tm_year);

		mPUSHi(tm.tm_wday);
		mPUSHi(tm.tm_yday);
		mPUSHi(tm.tm_isdst);
		XSRETURN(9);
	    }
	    else
	    {
		dXSTARG;
		/* called in void (or scalar) context, save members in the perl object. */
		SV **val = hv_fetch(rtc, "sec", 3, !0);

lib/Linux/RTC/Ioctl.xs  view on Meta::CPAN


		val = hv_fetch(rtc, "min", 3, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_min));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "hour", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_hour));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "mday", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_mday));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "mon", 3, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_mon));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "year", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_year));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "wday", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_wday));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "yday", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_yday));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "isdst", 5, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_isdst));
		else
		    croak(hashAccessFailedMsg);

		XPUSHu(result);
		XSRETURN(1);
	    }

#endif

#if defined(RTC_SET_TIME)

void
set_time(HV *rtc, ...)
    PROTOTYPE: \*%;$$$$$$$$$
    PPCODE:
	int args_count = items;
	struct rtc_time tm = { 0, 0, 0,  0, 0, 0,  -1, -1, -1 };
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	if (args_count > 10)
	    args_count = 10;

	switch (args_count)
	{
	case 10:
	    if (tm.tm_isdst = SvIV(ST(9)), SvIOK(ST(9)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 9:
	    if (tm.tm_yday = SvIV(ST(8)), SvIOK(ST(8)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 8:
	    if (tm.tm_wday = SvIV(ST(7)), SvIOK(ST(7)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 7:
	    if (tm.tm_year = SvIV(ST(6)), SvIOK(ST(6)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 6:
	    if (tm.tm_mon = SvIV(ST(5)), SvIOK(ST(5)))

lib/Linux/RTC/Ioctl.xs  view on Meta::CPAN


		val = hv_fetch(rtc, "year", 4, 0);
		if (*val && (tm.tm_year = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "year");

		val = hv_fetch(rtc, "mon", 3, 0);
		if (*val && (tm.tm_mon = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "mon");

		val = hv_fetch(rtc, "mday", 4, 0);
		if (*val && (tm.tm_mday = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "mday");

		val = hv_fetch(rtc, "hour", 4, 0);
		if (*val && (tm.tm_hour = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "hour");

		val = hv_fetch(rtc, "min", 3, 0);
		if (*val && (tm.tm_min = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "min");

		val = hv_fetch(rtc, "sec", 3, 0);
		if (*val && (tm.tm_sec = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "sec");

		break;
	    }
	}

	{
	    dXSTARG;
	    int result = ioctl(fd, RTC_SET_TIME, &tm);

	    if (result < 0)
		XPUSHs(&PL_sv_undef);
	    else
		XPUSHu(result);

	    XSRETURN(1);
	}

#endif

#if defined(RTC_ALM_READ)

void
read_alarm(HV *rtc)
    PROTOTYPE: \%
    PPCODE:
	struct rtc_time tm = { 0, 0, 0,  0, 0, 0,  -1, -1, -1 };
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;
	int result;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	result = ioctl(fd, RTC_ALM_READ, &tm);

	if (result < 0)
	{
	    XPUSHs(&PL_sv_undef);
	    XSRETURN(1);
	}
	else
	    if (G_ARRAY == GIMME_V)
	    {
		/* called in list context, push time members on stack and do not store them. */
		EXTEND(SP, 9);
		mPUSHi(tm.tm_sec);
		mPUSHi(tm.tm_min);
		mPUSHi(tm.tm_hour);

		mPUSHi(tm.tm_mday);
		mPUSHi(tm.tm_mon);
		mPUSHi(tm.tm_year);

		mPUSHi(tm.tm_wday);
		mPUSHi(tm.tm_yday);
		mPUSHi(tm.tm_isdst);
		XSRETURN(9);
	    }
	    else
	    {
		dXSTARG;

		/* called in void (or scalar) context, save members in the perl object. */
		SV **val = hv_fetch(rtc, "sec", 3, !0);

lib/Linux/RTC/Ioctl.xs  view on Meta::CPAN

		val = hv_fetch(rtc, "min", 3, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_min));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "hour", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_hour));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "mday", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_mday));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "mon", 3, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_mon));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "year", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_year));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "wday", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_wday));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "yday", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_yday));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "isdst", 5, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.tm_isdst));
		else
		    croak(hashAccessFailedMsg);

		XPUSHu(result);
		XSRETURN(1);
	    }

#endif


#if defined(RTC_ALM_SET)

void
set_alarm(HV *rtc, ...)
    PROTOTYPE: \*%;$$$$$$$$$
    PPCODE:
	int args_count = items;
	struct rtc_time tm = { 0, 0, 0,  0, 0, 0,  -1, -1, -1 };
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	if (args_count > 10)
	    args_count = 10;

	switch (args_count)
	{
	case 10:
	    if (tm.tm_isdst = SvIV(ST(9)), SvIOK(ST(9)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 9:
	    if (tm.tm_yday = SvIV(ST(8)), SvIOK(ST(8)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 8:
	    if (tm.tm_wday = SvIV(ST(7)), SvIOK(ST(7)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 7:
	    if (tm.tm_year = SvIV(ST(6)), SvIOK(ST(6)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 6:
	    if (tm.tm_mon = SvIV(ST(5)), SvIOK(ST(5)))

lib/Linux/RTC/Ioctl.xs  view on Meta::CPAN


		val = hv_fetch(rtc, "year", 4, 0);
		if (*val && (tm.tm_year = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "year");

		val = hv_fetch(rtc, "mon", 3, 0);
		if (*val && (tm.tm_mon = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "mon");

		val = hv_fetch(rtc, "mday", 4, 0);
		if (*val && (tm.tm_mday = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "mday");

		val = hv_fetch(rtc, "hour", 4, 0);
		if (*val && (tm.tm_hour = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "hour");

		val = hv_fetch(rtc, "min", 3, 0);
		if (*val && (tm.tm_min = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "min");

		val = hv_fetch(rtc, "sec", 3, 0);
		if (*val && (tm.tm_sec = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "sec");

		break;
	    }
	}

	{
	    dXSTARG;
	    int result = ioctl(fd, RTC_ALM_SET, &tm);

	    if (result < 0)
		XPUSHs(&PL_sv_undef);
	    else
		XPUSHu(result);

	    XSRETURN(1);
	}

#endif

#if defined(RTC_WKALM_RD)

void
read_wakeup_alarm(HV *rtc)
    PROTOTYPE: \%
    PPCODE:
	struct rtc_wkalrm tm = { 0, 0, { 0, 0, 0,  0, 0, 0,  -1, -1, -1 } };
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;
	int result;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	result = ioctl(fd, RTC_WKALM_RD, &tm);

	if (result < 0)
	{
	    XPUSHs(&PL_sv_undef);
	    XSRETURN(1);
	}
	else
	    if (G_ARRAY == GIMME_V)
	    {
		/* called in list context, push time members on stack and do not store them. */
		EXTEND(SP, 11);
		mPUSHi(tm.enabled);
		mPUSHi(tm.pending);

		mPUSHi(tm.time.tm_sec);
		mPUSHi(tm.time.tm_min);
		mPUSHi(tm.time.tm_hour);

		mPUSHi(tm.time.tm_mday);
		mPUSHi(tm.time.tm_mon);
		mPUSHi(tm.time.tm_year);

		mPUSHi(tm.time.tm_wday);
		mPUSHi(tm.time.tm_yday);
		mPUSHi(tm.time.tm_isdst);
		XSRETURN(9);
	    }
	    else
	    {
		dXSTARG;

lib/Linux/RTC/Ioctl.xs  view on Meta::CPAN

		val = hv_fetch(rtc, "min", 3, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.time.tm_min));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "hour", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.time.tm_hour));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "mday", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.time.tm_mday));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "mon", 3, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.time.tm_mon));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "year", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.time.tm_year));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "wday", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.time.tm_wday));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "yday", 4, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.time.tm_yday));
		else
		    croak(hashAccessFailedMsg);

		val = hv_fetch(rtc, "isdst", 5, !0);
		if (*val)
		    sv_setiv(*val, (IV)(tm.time.tm_isdst));
		else
		    croak(hashAccessFailedMsg);

		XPUSHu(result);
		XSRETURN(1);
	    }

#endif


#if defined(RTC_WKALM_SET)

void
set_wakeup_alarm(HV *rtc, ...)
    PROTOTYPE: \*%;$$$$$$$$$
    PPCODE:
	int args_count = items;
	struct rtc_wkalrm tm = { 0, 0, { 0, 0, 0,  0, 0, 0,  -1, -1, -1 } };
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	if (args_count > 10)
	    args_count = 10;

	switch (args_count)
	{
	case 12:
	    if (tm.time.tm_isdst = SvIV(ST(11)), SvIOK(ST(11)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 11:
	    if (tm.time.tm_yday = SvIV(ST(10)), SvIOK(ST(10)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 10:
	    if (tm.time.tm_wday = SvIV(ST(9)), SvIOK(ST(9)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 9:
	    if (tm.time.tm_year = SvIV(ST(8)), SvIOK(ST(8)))
		;
	    else
		croak(numericParamMsg);
	    // fall-through
	case 8:
	    if (tm.time.tm_mon = SvIV(ST(7)), SvIOK(ST(7)))

lib/Linux/RTC/Ioctl.xs  view on Meta::CPAN

		if (*val && (tm.time.tm_mday = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "mday");

		val = hv_fetch(rtc, "hour", 4, 0);
		if (*val && (tm.time.tm_hour = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "hour");

		val = hv_fetch(rtc, "min", 3, 0);
		if (*val && (tm.time.tm_min = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "min");

		val = hv_fetch(rtc, "sec", 3, 0);
		if (*val && (tm.time.tm_sec = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "sec");

		val = hv_fetch(rtc, "pending", 7, 0);
		if (*val && (tm.pending = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "pending");

		val = hv_fetch(rtc, "enabled", 7, 0);
		if (*val && (tm.enabled = SvIV(*val), SvIOK(*val)))
		    ;
		else
		    croak(objectFieldsMissingMsg, "enabled");

		break;
	    }

	    break;
	}

	{
	    dXSTARG;
	    int result = ioctl(fd, RTC_WKALM_SET, &tm);

	    if (result < 0)
		XPUSHs(&PL_sv_undef);
	    else
		XPUSHu(result);

	    XSRETURN(1);
	}

#endif

#if defined(RTC_VL_READ)

void
read_voltage_low_indicator(HV *rtc)
    PROTOTYPE: \%
    PPCODE:
	int result, voltage_low_indicator;
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	result = ioctl(fd, RTC_VL_READ, &voltage_low_indicator);

	if (result < 0)
	    XSRETURN_UNDEF;
	else
	{
	    dXSTARG;
	    XPUSHi(voltage_low_indicator);
	    XSRETURN(1);
	}

#endif

#if defined(RTC_VL_CLR)

void
clear_voltage_low_indicator(HV *rtc)
    PROTOTYPE: \%
    PPCODE:
	int fd = -1;
	SV **device = hv_fetch(rtc, "device", 6, 0);;

	if (device)
	{
	    IO *file_io = sv_2io(*device);

	    if (file_io)
	    {
		PerlIO *device_perlio = IoIFP(file_io);

		if (device_perlio)
		{
		    fd = PerlIO_fileno(device_perlio);

		    if (fd < 0)
			croak(invalidHandleMsg);
		}
		else
		    croak(invalidHandleMsg);
	    }
	    else
		croak(invalidHandleMsg);
	}
	else
	    croak(missingDeviceFileMsg);

	{
	    dXSTARG;
	    int result = ioctl(fd, RTC_VL_CLR, 0);

	    if (result < 0)
		XPUSHs(&PL_sv_undef);
	    else
		XPUSHu(result);

	    XSRETURN(1);
	}

#endif



( run in 0.513 second using v1.01-cache-2.11-cpan-5511b514fd6 )