-rw-r--r-- | core/opiealarm/Makefile | 26 | ||||
-rw-r--r-- | core/opiealarm/opie-opiealarm.control | 13 | ||||
-rwxr-xr-x | core/opiealarm/opie-opiealarm.postinst | 4 | ||||
-rwxr-xr-x | core/opiealarm/opie-opiealarm.prerm | 4 | ||||
-rw-r--r-- | core/opiealarm/opiealarm.c | 91 | ||||
-rwxr-xr-x | core/opiealarm/opieatd | 22 |
6 files changed, 160 insertions, 0 deletions
diff --git a/core/opiealarm/Makefile b/core/opiealarm/Makefile new file mode 100644 index 0000000..e988abf --- a/dev/null +++ b/core/opiealarm/Makefile @@ -0,0 +1,26 @@ + +DESTDIR=../../bin + +CROSS:=arm-linux- +CC :=$(CROSS)gcc +LD :=$(CROSS)gcc +STRIP:=$(CROSS)strip + +CFLAGS:=-O2 +LDFLAGS:= + +all: $(DESTDIR)/opiealarm $(DESTDIR)/opieatd + +$(DESTDIR)/opiealarm: opiealarm.c + $(CC) $(CFLAGS) opiealarm.c -o $(DESTDIR)/opiealarm $(LDFLAGS) + $(STRIP) -s $(DESTDIR)/opiealarm + chmod u+s $(DESTDIR)/opiealarm + chown root $(DESTDIR)/opiealarm 2>/dev/null || echo -e "\nopiealarm must be owned by root to work correctly.\n" + +$(DESTDIR)/opieatd: opieatd + cp opieatd $(DESTDIR)/opieatd + chmod +x $(DESTDIR)/opieatd + +clean: + -rm -f *~ core + diff --git a/core/opiealarm/opie-opiealarm.control b/core/opiealarm/opie-opiealarm.control new file mode 100644 index 0000000..b63fa66 --- a/dev/null +++ b/core/opiealarm/opie-opiealarm.control @@ -0,0 +1,13 @@ +Files: bin/opiealarm bin/opieatd ipaq/etc/init.d/opieatd ipaq/etc/rc2.d/S96opieatd ipaq/etc/suspend-scripts/S46opiealarm ipaq/etc/resume-scripts/R46opiealarm +Priority: required +Provides: ipaqalarm +Conflicts: ipaqalarm +Section: opie/system +Maintainer: Robert Griebl <sandman@handhelds.org> +Architecture: arm +Version: $QPE_VERSION-$SUB_VERSION +Depends: hotplug +Description: A wakeup system for OPIE events. + Tiny, OPIE specific replacement for ipaqalarm, + uschedule and qpe2uschedule + diff --git a/core/opiealarm/opie-opiealarm.postinst b/core/opiealarm/opie-opiealarm.postinst new file mode 100755 index 0000000..7fc8350 --- a/dev/null +++ b/core/opiealarm/opie-opiealarm.postinst @@ -0,0 +1,4 @@ +#/bin/sh + +/etc/init.d/opieatd start +exit 0
\ No newline at end of file diff --git a/core/opiealarm/opie-opiealarm.prerm b/core/opiealarm/opie-opiealarm.prerm new file mode 100755 index 0000000..b37df5e --- a/dev/null +++ b/core/opiealarm/opie-opiealarm.prerm @@ -0,0 +1,4 @@ +#/bin/sh + +/etc/init.d/opieatd stop +exit 0 diff --git a/core/opiealarm/opiealarm.c b/core/opiealarm/opiealarm.c new file mode 100644 index 0000000..071cb24 --- a/dev/null +++ b/core/opiealarm/opiealarm.c @@ -0,0 +1,91 @@ +/* opiealarm.c +* This program is for extracting the event time/date out +* of /etc/resumeat and setting the RTC alarm to that time/date. +* It is designed to run via a script just before the iPaq +* is suspended. +* +* Roughly based on ipaqalarm from Benjamin Long +* +* written by Robert Griebl <sandman@handhelds.org> +*/ + +#include <stdio.h> +#include <linux/rtc.h> +#include <sys/ioctl.h> +#include <sys/time.h> +#include <sys/types.h> +#include <fcntl.h> +#include <unistd.h> +#include <errno.h> +#include <time.h> +#include <stdlib.h> + + +void error_msg_and_die ( int perr, const char *msg ) +{ + if ( perr ) + perror ( msg ); + else + fprintf ( stderr, "%s\n", msg ); + exit ( 1 ); +} + + +void extractevent ( ) +{ + FILE *fp; + char buf [64]; + time_t t; + struct tm *tm; + int fd; + + if (!( fp = fopen ( "/etc/resumeat", "r" ))) + error_msg_and_die ( 1, "/etc/resumeat" ); + + if ( !fgets ( buf, sizeof( buf ) - 1, fp )) + error_msg_and_die ( 1, "/etc/resumeat" ); + + fclose ( fp ); + + t = atoi ( buf ); + + if ( t == 0 ) + error_msg_and_die ( 0, "/etc/resumeat contains an invalid time description" ); + + /* subtract 5 sec from event time... */ + t -= 5; + tm = gmtime ( &t ); + + /* Write alarm time to RTC */ + fd = open ( "/dev/misc/rtc", O_RDWR ); + if ( fd < 0 ) + error_msg_and_die ( 1, "/dev/misc/rtc" ); + + // set alarm time + if ( ioctl ( fd, RTC_ALM_SET, tm ) < 0 ) + error_msg_and_die ( 1, "ioctl RTC_ALM_SET" ); + + // enable alarm irq + if ( ioctl ( fd, RTC_AIE_ON, 0 ) < 0 ) + error_msg_and_die ( 1, "ioctl RTC_AIE_ON" ); + + // wait for alarm irq + if ( read ( fd, buf, sizeof( unsigned long )) < 0 ) + error_msg_and_die ( 1, "read rtc alarm" ); + + // disable alarm irq + if ( ioctl ( fd, RTC_AIE_OFF, 0 ) < 0 ) + error_msg_and_die ( 1, "ioctl RTC_AIE_OFF" ); + + close ( fd ); +} + + +int main ( ) +{ + if ( geteuid ( ) != 0 ) + error_msg_and_die ( 0, "You need root priviledges to run opiealarm." ); + + extractevent ( ); + return 0; +} diff --git a/core/opiealarm/opieatd b/core/opiealarm/opieatd new file mode 100755 index 0000000..3b9dc0e --- a/dev/null +++ b/core/opiealarm/opieatd @@ -0,0 +1,22 @@ +#!/bin/sh + +timefile=/etc/resumeat + +mkdir -p /var/spool/at +[ -p /var/spool/at/trigger ] || mkfifo /var/spool/at/trigger + +while true; do + cat /var/spool/at/trigger | while read line; do + FILE=`ls -1 /var/spool/at/[0-9]* | head -n1` + echo "File = $FILE" + if [ -z "$FILE" ]; then + echo "clear resume at" + echo "" >$timefile + else + unixtime=`basename $FILE | cut -c1-10` + echo "Datestring = $unixtime" + echo "$unixtime" >$timefile + fi + done +done + |