Add manatee halt/poweroff/reboot logic.

BUG=b:197259207
TEST=USE=manatee emerge-${BOARD} upstart

Cq-Depend: chromium:3169361
Change-Id: Ic3f2d6ba50cb8506019fa35915fa46c6cdd4ccf9
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/upstart/+/3169569
Tested-by: Allen Webb <allenwebb@google.com>
Reviewed-by: Jorge Lucangeli Obes <jorgelo@chromium.org>
Reviewed-by: Junichi Uekawa <uekawa@chromium.org>
Commit-Queue: Allen Webb <allenwebb@google.com>
diff --git a/configure.ac b/configure.ac
index 4344865..00d1b6f 100644
--- a/configure.ac
+++ b/configure.ac
@@ -78,6 +78,15 @@
 	AC_DEFINE(RESTORE_PATHS, [{"/dev", "/run"}], [Define restorecon paths])
 fi
 
+# Define a preprocessor value if building for a manatee guest.
+AC_ARG_ENABLE(manatee,
+	AS_HELP_STRING([--enable-manatee], [enable ManaTEE guest support]),
+	[], [enable_manatee=no])
+
+if test "x$enable_manatee" = "xyes" ; then
+	AC_DEFINE(ENABLE_MANATEE, 1, [Define if we support ManaTEE])
+fi
+
 # If this argument is set, it means that we want to generate and include the
 # global seccomp policy in Upstart.
 AC_ARG_WITH([seccomp-constants],
diff --git a/util/reboot.c b/util/reboot.c
index fa2e863..4a2114f 100644
--- a/util/reboot.c
+++ b/util/reboot.c
@@ -66,6 +66,10 @@
 #define SHUTDOWN SBINDIR "/shutdown"
 #endif
 
+#ifdef ENABLE_MANATEE
+const char MANATEE_CLIENT[] = "/usr/bin/manatee";
+#endif
+
 
 /* Operation modes */
 enum {
@@ -228,6 +232,32 @@
 	/* Re-enable Control-Alt-Delete in case it breaks */
 	reboot (RB_ENABLE_CAD);
 
+#ifdef ENABLE_MANATEE
+	int val = fork ();
+	if (val == 0) {
+		const char *flag;
+		/* Do the syscall */
+		switch (mode) {
+		case REBOOT:
+			nih_info (_("Rebooting"));
+			flag = "--reboot";
+			break;
+		case HALT:
+			nih_info (_("Halting"));
+			flag = "--halt";
+			break;
+		case POWEROFF:
+			nih_info (_("Powering off"));
+			flag = "--poweroff";
+			break;
+		}
+		const char *manatee_args[] = { MANATEE_CLIENT, flag };
+		execv (manatee_args[0], manatee_args);
+	} else {
+		waitpid (val, NULL, 0);
+	}
+#endif
+
 	/* Do the syscall */
 	switch (mode) {
 	case REBOOT: