#define _PATH_INITTAB "/etc/inittab"
#define _PATH_RC "/etc/rc"
#define _PATH_REBOOT "/sbin/reboot"
+#define _PATH_SHUTDOWN "/sbin/shutdown"
#define _PATH_SINGLE "/etc/singleboot"
#define _PATH_SHUTDOWN_CONF "/etc/shutdown.conf"
management. This state operates similarly to Suspend-to-RAM, but includes a
final step of writing memory contents to disk.
.TP
+.B off
+ACPI state S5 (Poweroff). This is done by calling '/sbin/shutdown'.
+Not officially supported by ACPI, but usually working.
+.TP
.B no
Don't suspend. The rtcwake command sets RTC wakeup time only.
.TP
#include <linux/rtc.h>
#include "nls.h"
+#include "pathnames.h"
#include "usleep.h"
/* constants from legacy PC/AT hardware */
unsigned seconds = 0;
char *suspend = DEFAULT_MODE;
+ int rc = EXIT_SUCCESS;
int t;
int fd;
time_t alarm = 0;
|| strcmp(optarg, "disk") == 0
|| strcmp(optarg, "on") == 0
|| strcmp(optarg, "no") == 0
+ || strcmp(optarg, "off") == 0
) {
suspend = strdup(optarg);
break;
}
/* this RTC must exist and (if we'll sleep) be wakeup-enabled */
+#ifdef O_CLOEXEC
+ fd = open(devname, O_RDONLY | O_CLOEXEC);
+#else
fd = open(devname, O_RDONLY);
+#endif
if (fd < 0) {
perror(devname);
exit(EXIT_FAILURE);
alarm += sys_time - rtc_time;
} else
alarm = rtc_time + seconds + 1;
+
if (setup_alarm(fd, &alarm) < 0)
exit(EXIT_FAILURE);
else if (strcmp(suspend, "on") != 0) {
sync();
suspend_system(suspend);
+ } else if (strcmp(suspend, "off") == 0) {
+ char *arg[4];
+ int i = 0;
+
+ arg[i++] = _PATH_SHUTDOWN;
+ arg[i++] = "-P";
+ arg[i++] = "now";
+ arg[i] = NULL;
+
+ execv(arg[0], arg);
+
+ fprintf(stderr, _("%s: unable to execute %s: %s\n"),
+ progname, _PATH_SHUTDOWN, strerror(errno));
+ rc = EXIT_FAILURE;
} else {
unsigned long data;
close(fd);
- exit(EXIT_SUCCESS);
+ return rc;
}