-rw-r--r-- | core/opiealarm/opiealarm.c | 34 |
1 files changed, 27 insertions, 7 deletions
diff --git a/core/opiealarm/opiealarm.c b/core/opiealarm/opiealarm.c index ce0103e..d96ffaf 100644 --- a/core/opiealarm/opiealarm.c +++ b/core/opiealarm/opiealarm.c @@ -42,8 +42,10 @@ void error_msg_and_die ( int perr, const char *msg ); int onac ( void ); static int opiealarm_was_running; +static pid_t startpid = 0; + void log_msg ( const char *msg ) { if ( log ) { @@ -57,21 +59,31 @@ void error_msg_and_die ( int perr, const char *msg ) if ( perr ) log_msg ( strerror ( errno )); log_msg ( msg ); + if ( getpid ( ) != startpid ) + kill ( startpid, SIGUSR1 ); + while ( 1 ) // pretend we are waiting on RTC, so opiealarm -r can kill us sleep ( 1 ); } void sig_handler ( int sig ) { - log_msg ( "GOT SIGNAL -> EXITING\n" ); - fclose ( log ); + if ( log ) { + log_msg ( "GOT SIGNAL -> EXITING\n" ); + fclose ( log ); + } remove_pidfile ( ); exit ( 0 ); } +void sig_handler_parent ( int sig ) +{ + exit ( 0 ); +} + void usage ( void ) { fprintf ( stderr, "Usage: opiealarm -s [-f] | -r [-a]\n\n" ); fprintf ( stderr, "\t-s\tSuspend mode: set RTC alarm\n" ); @@ -87,10 +99,14 @@ int fork_with_pidfile ( void ) pid_t pid; pid = fork ( ); - if ( pid > 0 ) + if ( pid > 0 ) { + signal ( SIGUSR1, sig_handler_parent ); + while ( 1 ) + sleep ( 1000 ); exit ( 0 ); + } else if ( pid < 0 ) { perror ( "forking failed" ); return 0; } @@ -179,8 +195,9 @@ int main ( int argc, char **argv ) if ( !mode ) usage ( ); // kill running opiealarm + startpid = getpid ( ); opiealarm_was_running = kill_with_pidfile ( ); remove_pidfile ( ); switch ( mode ) { @@ -191,8 +208,9 @@ int main ( int argc, char **argv ) return 0; } + int suspend ( int fix_rtc ) { FILE *fp; char buf [64]; @@ -208,9 +226,8 @@ int suspend ( int fix_rtc ) log = fopen ( "/tmp/opiealarm.log", "w" ); log_msg ( "STARTING\n" ); - if (!( fp = fopen ( "/etc/resumeat", "r" ))) error_msg_and_die ( 1, "/etc/resumeat" ); if ( !fgets ( buf, sizeof( buf ) - 1, fp )) @@ -222,10 +239,10 @@ int suspend ( int fix_rtc ) if ( alrt == 0 ) error_msg_and_die ( 0, "/etc/resumeat contains an invalid time description" ); - /* subtract 5 sec from event time... */ - alrt -= 5; + alrt -= 5; // wake up 5 sec before the specified time + if ( log ) fprintf ( log, "Setting RTC alarm to %d\n", alrt ); @@ -273,9 +290,11 @@ int suspend ( int fix_rtc ) // enable alarm irq if ( ioctl ( fd, RTC_AIE_ON, 0 ) < 0 ) error_msg_and_die ( 1, "ioctl RTC_AIE_ON" ); - log_msg ( "SLEEPING\n" ); + if ( log ) + fprintf( log, "SIGUSR: pid %d - SLEEPING: pid %d\n", startpid, getpid ( )); + kill ( startpid, SIGUSR1 ); // wait for alarm irq if ( read ( fd, buf, sizeof( unsigned long )) < 0 ) error_msg_and_die ( 1, "read rtc alarm" ); @@ -325,8 +344,9 @@ int resume ( int resuspend ) char *argv [4]; if ( !fork_with_pidfile ( )) return 4; + kill ( startpid, SIGUSR1 ); // sleep <resuspend> sec (not less!) time ( &start ); do { |