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
@@ -27,13 +27,13 @@
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 );
@@ -70,13 +70,16 @@ void sig_handler ( int sig )
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;
@@ -136,22 +139,31 @@ void remove_pidfile ( void )
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 ) {
@@ -163,17 +175,17 @@ int main ( int argc, char **argv )
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{
@@ -259,32 +271,32 @@ static int onac ( void )
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()";