summaryrefslogtreecommitdiff
path: root/core
Unidiff
Diffstat (limited to 'core') (more/less context) (ignore whitespace changes)
-rw-r--r--core/opiealarm/opiealarm.c36
1 files changed, 24 insertions, 12 deletions
diff --git a/core/opiealarm/opiealarm.c b/core/opiealarm/opiealarm.c
index 3a06236..ac98832 100644
--- a/core/opiealarm/opiealarm.c
+++ b/core/opiealarm/opiealarm.c
@@ -21,25 +21,25 @@
21#include <stdlib.h> 21#include <stdlib.h>
22#include <syslog.h> 22#include <syslog.h>
23#include <signal.h> 23#include <signal.h>
24#include <errno.h> 24#include <errno.h>
25#include <string.h> 25#include <string.h>
26 26
27 27
28 #define PIDFILE "/var/run/opiealarm.pid" 28 #define PIDFILE "/var/run/opiealarm.pid"
29 #define APMFILE "/proc/apm" 29 #define APMFILE "/proc/apm"
30 30
31FILE *log; // debug only 31FILE *log; // debug only
32 32
33int resume ( void ); 33int resume ( int resuspend );
34int suspend ( void ); 34int suspend ( void );
35int main ( int argc, char **argv ); 35int main ( int argc, char **argv );
36int fork_with_pidfile ( void ); 36int fork_with_pidfile ( void );
37int kill_with_pidfile ( void ); 37int kill_with_pidfile ( void );
38void remove_pidfile ( void ); 38void remove_pidfile ( void );
39void usage ( void ); 39void usage ( void );
40void sig_handler ( int sig ); 40void sig_handler ( int sig );
41void error_msg_and_die ( int perr, const char *msg ); 41void error_msg_and_die ( int perr, const char *msg );
42int onac ( void ); 42int onac ( void );
43 43
44static int opiealarm_was_running; 44static int opiealarm_was_running;
45 45
@@ -64,25 +64,28 @@ void error_msg_and_die ( int perr, const char *msg )
64 64
65 65
66void sig_handler ( int sig ) 66void sig_handler ( int sig )
67{ 67{
68 log_msg ( "GOT SIGNAL -> EXITING\n" ); 68 log_msg ( "GOT SIGNAL -> EXITING\n" );
69 fclose ( log ); 69 fclose ( log );
70 remove_pidfile ( ); 70 remove_pidfile ( );
71 exit ( 0 ); 71 exit ( 0 );
72} 72}
73 73
74void usage ( void ) 74void usage ( void )
75{ 75{
76 fprintf ( stderr, "Usage: opiealarm -r|-s\n" ); 76 fprintf ( stderr, "Usage: opiealarm -r|-s [-a]\n\n" );
77 fprintf ( stderr, "\t-s\tSuspend mode: set RTC alarm\n" );
78 fprintf ( stderr, "\t-r\tResume mode: kill running opiealarm\n" );
79 fprintf ( stderr, "\t-a <x>\tResuspend in <x> seconds (resume mode)\n\n" );
77 exit ( 1 ); 80 exit ( 1 );
78} 81}
79 82
80int fork_with_pidfile ( void ) 83int fork_with_pidfile ( void )
81{ 84{
82 FILE *fp; 85 FILE *fp;
83 pid_t pid; 86 pid_t pid;
84 87
85 pid = fork ( ); 88 pid = fork ( );
86 89
87 if ( pid > 0 ) 90 if ( pid > 0 )
88 exit ( 0 ); 91 exit ( 0 );
@@ -130,56 +133,65 @@ int kill_with_pidfile ( void )
130void remove_pidfile ( void ) 133void remove_pidfile ( void )
131{ 134{
132 unlink ( PIDFILE ); 135 unlink ( PIDFILE );
133 136
134 signal ( SIGTERM, SIG_DFL ); 137 signal ( SIGTERM, SIG_DFL );
135 signal ( SIGINT, SIG_DFL ); 138 signal ( SIGINT, SIG_DFL );
136} 139}
137 140
138 141
139int main ( int argc, char **argv ) 142int main ( int argc, char **argv )
140{ 143{
141 int mode = 0; 144 int mode = 0;
145 int ac_resusp = 0;
142 int opt; 146 int opt;
143 147
144 while (( opt = getopt ( argc, argv, "rs" )) != EOF ) { 148 while (( opt = getopt ( argc, argv, "a:rs" )) != EOF ) {
145 switch ( opt ) { 149 switch ( opt ) {
146 case 's': 150 case 's':
147 mode = 's'; 151 mode = 's';
148 break; 152 break;
149 case 'r': 153 case 'r':
150 mode = 'r'; 154 mode = 'r';
151 break; 155 break;
156 case 'a':
157 ac_resusp = atoi ( optarg );
158 if ( ac_resusp < 30 ) {
159 ac_resusp = 120;
160
161 fprintf ( stderr, "Warning: resuspend timeout must be >= 30 sec. -- now set to 120 sec\n" );
162 }
163 break;
152 default: 164 default:
153 usage ( ); 165 usage ( );
154 } 166 }
155 } 167 }
156 168
157 if ( geteuid ( ) != 0 ) { 169 if ( geteuid ( ) != 0 ) {
158 fprintf ( stderr, "You need root priviledges to run opiealarm." ); 170 fprintf ( stderr, "You need root priviledges to run opiealarm." );
159 return 2; 171 return 2;
160 } 172 }
161 173
162 if ( !mode ) 174 if ( !mode )
163 usage ( ); 175 usage ( );
164 176
165 // kill running opiealarm 177 // kill running opiealarm
166 opiealarm_was_running = kill_with_pidfile ( ); 178 opiealarm_was_running = kill_with_pidfile ( );
167 remove_pidfile ( ); 179 remove_pidfile ( );
168 180
169 if ( mode == 'r' ) 181 switch ( mode ) {
170 return resume ( ); 182 case 'r': return resume ( ac_resusp );
171 else 183 case 's':
172 return suspend ( ); 184 default : return suspend ( );
173 185 }
174 return 0; 186 return 0;
175 } 187 }
176 188
177 189
178int suspend ( void ) 190int suspend ( void )
179{ 191{
180 FILE *fp; 192 FILE *fp;
181 char buf [64]; 193 char buf [64];
182 time_t t; 194 time_t t;
183 struct tm *tm; 195 struct tm *tm;
184 int fd; 196 int fd;
185 197
@@ -253,44 +265,44 @@ static int onac ( void )
253 265
254 if (( fp = fopen ( APMFILE, "r" ))) { 266 if (( fp = fopen ( APMFILE, "r" ))) {
255 int ac = 0; 267 int ac = 0;
256 268
257 if ( fscanf ( fp, "%*[^ ] %*d.%*d 0x%*x 0x%x 0x%*x 0x%*x %*d%% %*i %*c", &ac ) == 1 ) 269 if ( fscanf ( fp, "%*[^ ] %*d.%*d 0x%*x 0x%x 0x%*x 0x%*x %*d%% %*i %*c", &ac ) == 1 )
258 on = ( ac == 0x01 ) ? 1 : 0; 270 on = ( ac == 0x01 ) ? 1 : 0;
259 271
260 fclose ( fp ); 272 fclose ( fp );
261 } 273 }
262 return on; 274 return on;
263} 275}
264 276
265int resume ( void ) 277int resume ( int resuspend )
266{ 278{
267 FILE *fp; 279 FILE *fp;
268 280
269 // re-suspend when on AC (optional) when woken up via RTC 281 // re-suspend when on AC (optional) when woken up via RTC
270 282
271 if ( !opiealarm_was_running ) { // opiealarm -s got it's RTC signal -> wake up by RTC 283 if ( !opiealarm_was_running ) { // opiealarm -s got it's RTC signal -> wake up by RTC
272 if ( onac ( )) { 284 if ( resuspend && onac ( )) {
273 time_t start, now; 285 time_t start, now;
274 char *argv [4]; 286 char *argv [4];
275 287
276 if ( !fork_with_pidfile ( )) 288 if ( !fork_with_pidfile ( ))
277 return 4; 289 return 4;
278 290
279 // sleep 120sec (not less!) 291 // sleep <resuspend> sec (not less!)
280 time ( &start ); 292 time ( &start );
281 do { 293 do {
282 sleep ( 1 ); 294 sleep ( 1 );
283 time ( &now ); 295 time ( &now );
284 } while (( now - start ) < 120 ); 296 } while (( now - start ) < resuspend );
285 297
286 if ( onac ( )) { // still on ac 298 if ( onac ( )) { // still on ac
287 // system() without fork 299 // system() without fork
288 argv[0] = "qcop"; 300 argv[0] = "qcop";
289 argv[1] = "QPE/Desktop"; 301 argv[1] = "QPE/Desktop";
290 argv[2] = "suspend()"; 302 argv[2] = "suspend()";
291 argv[3] = 0; 303 argv[3] = 0;
292 304
293 // hard coded for now ...but needed 305 // hard coded for now ...but needed
294 setenv ( "LOGNAME", "root", 1 ); 306 setenv ( "LOGNAME", "root", 1 );
295 setenv ( "HOME", "/root", 1 ); 307 setenv ( "HOME", "/root", 1 );
296 setenv ( "LD_LIBRARY_PATH", "/opt/QtPalmtop/lib", 1 ); 308 setenv ( "LD_LIBRARY_PATH", "/opt/QtPalmtop/lib", 1 );