*/
/*-
* Copyright (c) 1987, 1990, 1993
- * The Regents of the University of California. All rights reserved.
+ * The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
- * This product includes software developed by the University of
- * California, Berkeley and its contributors.
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
#ifndef lint
static char copyright[] =
"@(#) Copyright (c) 1987, 1990, 1993\n\
- The Regents of the University of California. All rights reserved.\n";
+ The Regents of the University of California. All rights reserved.\n";
#endif /* not lint */
#ifndef lint
-static char sccsid[] = "@(#)update.c 8.1 (Berkeley) 6/6/93";
+static char sccsid[] = "@(#)update.c 8.1 (Berkeley) 6/6/93";
#endif /* not lint */
-#include <sys/time.h>
-#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
+#include <getopt.h>
-main()
+#include "power_mgmt.h"
+#include "disk_power.h"
+
+extern char *optarg;
+
+static void usage(const char *argv0) __attribute__((noreturn));
+static int parsetime(const char *arg);
+
+int main(int argc, char *const argv[])
{
- struct itimerval value;
- void mysync();
+ int normal_intr = 30;
+ int save_pwr_intr = 30;
+ int on_bat, disk_up, last_sync = 0, current_sync_interval = 0;
+
+ if (argc > 3)
+ usage(argv[0]);
+ if (argc > 2)
+ save_pwr_intr = parsetime(argv[2]);
+ if (argc > 1)
+ normal_intr = parsetime(argv[1]);
+
+ if (normal_intr == -1 || save_pwr_intr == -1)
+ usage(argv[0]);
+
+ if (normal_intr > save_pwr_intr)
+ normal_intr = save_pwr_intr;
daemon(0, 0);
- (void)signal(SIGALRM, mysync);
+ for (;;) {
+ if (last_sync >= current_sync_interval) {
+ sync();
+ last_sync = 0;
+ }
+ sleep(30);
+ last_sync += 30;
+
+ on_bat = on_battery_power();
+ disk_up = is_disk_awake();
+
+ current_sync_interval = normal_intr;
+ if (on_bat && !disk_up)
+ current_sync_interval = save_pwr_intr;
+
+ }
+
+}
+
+static int parsetime(const char *arg)
+{
+ char *q = NULL;
+ int r;
+
+ r = strtol(arg, &q, 10);
- value.it_interval.tv_sec = 30;
- value.it_interval.tv_usec = 0;
- value.it_value = value.it_interval;
- if (setitimer(ITIMER_REAL, &value, NULL)) {
- perror("update: setitimer");
- exit(1);
+ if (r < 1)
+ return -1;
+ if (arg == q)
+ return -1;
+
+ switch (*q) {
+ case 'h':
+ r *= 60;
+ case 'm':
+ r *= 60;
+ case 's':
+ case '\0':
+ break;
+ default:
+ return -1;
}
- for (;;)
- sigpause(sigblock(0L));
- /* NOTREACHED */
+
+ return r;
}
-void
-mysync()
+static void usage(const char *argv0)
{
- (void)sync();
+ fprintf(stderr, "usage: %s [normal_interval [power_saving_interval]]\n", argv0);
+ exit(EXIT_FAILURE);
}