Port reboot functions to C++
diff --git a/Android.mk b/Android.mk
index e13af68..bd4902d 100644
--- a/Android.mk
+++ b/Android.mk
@@ -39,9 +39,7 @@
     twrp-functions.cpp \
     openrecoveryscript.cpp
 
-ifeq ($(TARGET_RECOVERY_REBOOT_SRC),)
-  LOCAL_SRC_FILES += reboot.c
-else
+ifneq ($(TARGET_RECOVERY_REBOOT_SRC),)
   LOCAL_SRC_FILES += $(TARGET_RECOVERY_REBOOT_SRC)
 endif
 
diff --git a/common.h b/common.h
index 37c0e4c..7bd769a 100644
--- a/common.h
+++ b/common.h
@@ -23,6 +23,8 @@
 extern "C" {
 #endif
 
+static long tmplog_offset = 0;
+
 #define ui_print(...) gui_print(__VA_ARGS__)
 #define ui_print_overwrite(...) gui_print_overwrite(__VA_ARGS__)
 
diff --git a/data.cpp b/data.cpp
index 9c53c46..ab240a7 100644
--- a/data.cpp
+++ b/data.cpp
@@ -44,13 +44,9 @@
 {
     #include "common.h"
     #include "data.h"
-    #include "tw_reboot.h"
-	#include "roots.h"
 	#include "gui/pages.h"
 
 	void gui_notifyVarChange(const char *name, const char* value);
-
-	int __system(const char *command);
 }
 
 #define FILE_VERSION    0x00010001
@@ -627,17 +623,17 @@
 	#endif
 #endif
 
-    mConstValues.insert(make_pair(TW_REBOOT_SYSTEM, tw_isRebootCommandSupported(rb_system) ? "1" : "0"));
+    mConstValues.insert(make_pair(TW_REBOOT_SYSTEM, "1"));
 #ifdef TW_NO_REBOOT_RECOVERY
 	mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, "0"));
 #else
-	mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, tw_isRebootCommandSupported(rb_recovery) ? "1" : "0"));
+	mConstValues.insert(make_pair(TW_REBOOT_RECOVERY, "1"));
 #endif
-    mConstValues.insert(make_pair(TW_REBOOT_POWEROFF, tw_isRebootCommandSupported(rb_poweroff) ? "1" : "0"));
+    mConstValues.insert(make_pair(TW_REBOOT_POWEROFF, "1"));
 #ifdef TW_NO_REBOOT_BOOTLOADER
 	mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, "0"));
 #else
-	mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, tw_isRebootCommandSupported(rb_bootloader) ? "1" : "0"));
+	mConstValues.insert(make_pair(TW_REBOOT_BOOTLOADER, "1"));
 #endif
 #ifdef RECOVERY_SDCARD_ON_DATA
 	mConstValues.insert(make_pair(TW_HAS_DATA_MEDIA, "1"));
diff --git a/extra-functions.c b/extra-functions.c
index 763098d..f202aff 100644
--- a/extra-functions.c
+++ b/extra-functions.c
@@ -55,21 +55,6 @@
 	}
 }
 
-void check_and_run_script(const char* script_file, const char* display_name)
-{
-	// Check for and run startup script if script exists
-	struct stat st;
-	if (stat(script_file, &st) == 0) {
-		ui_print("Running %s script...\n", display_name);
-		char command[255];
-		strcpy(command, "chmod 755 ");
-		strcat(command, script_file);
-		system(command);
-		system(script_file);
-		ui_print("\nFinished running %s script.\n", display_name);
-	}
-}
-
 int check_backup_name(int show_error) {
 	// Check the backup name to ensure that it is the correct size and contains only valid characters
 	// and that a backup with that name doesn't already exist
@@ -118,81 +103,3 @@
 	// No problems found, return 0
 	return 0;
 }
-
-static const char *COMMAND_FILE = "/cache/recovery/command";
-static const char *INTENT_FILE = "/cache/recovery/intent";
-static const char *LOG_FILE = "/cache/recovery/log";
-static const char *LAST_LOG_FILE = "/cache/recovery/last_log";
-static const char *LAST_INSTALL_FILE = "/cache/recovery/last_install";
-static const char *CACHE_ROOT = "/cache";
-static const char *SDCARD_ROOT = "/sdcard";
-static const char *TEMPORARY_LOG_FILE = "/tmp/recovery.log";
-static const char *TEMPORARY_INSTALL_FILE = "/tmp/last_install";
-
-// close a file, log an error if the error indicator is set
-static void check_and_fclose(FILE *fp, const char *name) {
-    fflush(fp);
-    if (ferror(fp)) LOGE("Error in %s\n(%s)\n", name, strerror(errno));
-    fclose(fp);
-}
-
-static void copy_log_file(const char* source, const char* destination, int append) {
-    FILE *log = fopen_path(destination, append ? "a" : "w");
-    if (log == NULL) {
-        LOGE("Can't open %s\n", destination);
-    } else {
-        FILE *tmplog = fopen(source, "r");
-        if (tmplog != NULL) {
-            if (append) {
-                fseek(tmplog, tmplog_offset, SEEK_SET);  // Since last write
-            }
-            char buf[4096];
-            while (fgets(buf, sizeof(buf), tmplog)) fputs(buf, log);
-            if (append) {
-                tmplog_offset = ftell(tmplog);
-            }
-            check_and_fclose(tmplog, source);
-        }
-        check_and_fclose(log, destination);
-    }
-}
-
-// clear the recovery command and prepare to boot a (hopefully working) system,
-// copy our log file to cache as well (for the system to read), and
-// record any intent we were asked to communicate back to the system.
-// this function is idempotent: call it as many times as you like.
-void twfinish_recovery(const char *send_intent) {
-    // By this point, we're ready to return to the main system...
-    if (send_intent != NULL) {
-        FILE *fp = fopen_path(INTENT_FILE, "w");
-        if (fp == NULL) {
-            LOGE("Can't open %s\n", INTENT_FILE);
-        } else {
-            fputs(send_intent, fp);
-            check_and_fclose(fp, INTENT_FILE);
-        }
-    }
-
-    // Copy logs to cache so the system can find out what happened.
-    copy_log_file(TEMPORARY_LOG_FILE, LOG_FILE, true);
-    copy_log_file(TEMPORARY_LOG_FILE, LAST_LOG_FILE, false);
-    copy_log_file(TEMPORARY_INSTALL_FILE, LAST_INSTALL_FILE, false);
-    chmod(LOG_FILE, 0600);
-    chown(LOG_FILE, 1000, 1000);   // system user
-    chmod(LAST_LOG_FILE, 0640);
-    chmod(LAST_INSTALL_FILE, 0644);
-
-    // Reset to normal system boot so recovery won't cycle indefinitely.
-    struct bootloader_message boot;
-    memset(&boot, 0, sizeof(boot));
-    set_bootloader_message(&boot);
-
-    // Remove the command file, so recovery won't repeat indefinitely.
-    if (system("mount /cache") != 0 ||
-        (unlink(COMMAND_FILE) && errno != ENOENT)) {
-        LOGW("Can't unlink %s\n", COMMAND_FILE);
-    }
-
-    system("umount /cache");
-    sync();  // For good measure.
-}
diff --git a/extra-functions.h b/extra-functions.h
index f355cdc..114c902 100644
--- a/extra-functions.h
+++ b/extra-functions.h
@@ -4,12 +4,8 @@
 #include "mincrypt/rsa.h"
 #include "minzip/Zip.h"
 
-static long tmplog_offset = 0;
-
 void run_script(const char *str1, const char *str2, const char *str3, const char *str4, const char *str5, const char *str6, const char *str7, int request_confirm);
 
-void check_and_run_script(const char* script_file, const char* display_name);
 int check_backup_name(int show_error);
-void twfinish_recovery(const char *send_intent);
 
 #endif // _EXTRAFUNCTIONS_HEADER
diff --git a/gui/action.cpp b/gui/action.cpp
index d636934..7d66861 100644
--- a/gui/action.cpp
+++ b/gui/action.cpp
@@ -27,7 +27,6 @@
 
 extern "C" {
 #include "../common.h"
-#include "../tw_reboot.h"
 #include "../minuitwrp/minui.h"
 #include "../recovery_ui.h"
 #include "../extra-functions.h"
@@ -314,16 +313,16 @@
 
         sync();
 
-        if (arg == "recovery")
-            tw_reboot(rb_recovery);
-        else if (arg == "poweroff")
-            tw_reboot(rb_poweroff);
-        else if (arg == "bootloader")
-            tw_reboot(rb_bootloader);
-        else if (arg == "download")
-	    tw_reboot(rb_download);
-        else
-            tw_reboot(rb_system);
+		if (arg == "recovery")
+			TWFunc::tw_reboot(rb_recovery);
+		else if (arg == "poweroff")
+			TWFunc::tw_reboot(rb_poweroff);
+		else if (arg == "bootloader")
+			TWFunc::tw_reboot(rb_bootloader);
+		else if (arg == "download")
+			TWFunc::tw_reboot(rb_download);
+		else
+			TWFunc::tw_reboot(rb_system);
 
         // This should never occur
         return -1;
@@ -1051,7 +1050,7 @@
 						ui_print("Processing OpenRecoveryScript file...\n");
 						if (OpenRecoveryScript::run_script_file() == 0) {
 							usleep(2000000); // Sleep for 2 seconds before rebooting
-							tw_reboot(rb_system);
+							TWFunc::tw_reboot(rb_system);
 							load_theme = 0;
 						}
 					}
diff --git a/partition.cpp b/partition.cpp
index 4d1c9c5..12e1f53 100644
--- a/partition.cpp
+++ b/partition.cpp
@@ -42,7 +42,6 @@
 extern "C" {
 	#include "mtdutils/mtdutils.h"
 	#include "mtdutils/mounts.h"
-	#include "extra-functions.h"
 }
 
 TWPartition::TWPartition(void) {
diff --git a/reboot.c b/reboot.c
deleted file mode 100644
index 9d87ff2..0000000
--- a/reboot.c
+++ /dev/null
@@ -1,71 +0,0 @@
-#include <errno.h>
-#include <stdio.h>
-#include <stdlib.h>
-#include <sys/reboot.h>
-//#include <reboot/reboot.h>
-#include <unistd.h>
-
-#include "tw_reboot.h"
-#include "recovery_ui.h"
-#include "roots.h"
-#include "extra-functions.h"
-#include "data.h"
-#include "variables.h"
-
-// isRebootCommandSupported: Return 1 if command is supported, 0 if the command is not supported, -1 on error
-int tw_isRebootCommandSupported(RebootCommand command)
-{
-    switch (command)
-    {
-    case rb_system:
-    case rb_recovery:
-    case rb_poweroff:
-    case rb_bootloader:
-    case rb_download:
-        return 1;
-
-    default:
-        return 0;
-    }
-    return -1;
-}
-
-// setRebootMode: Set the reboot state (without rebooting). Return 0 on success, -1 on error or unsupported
-int tw_setRebootMode(RebootCommand command)
-{
-    return -1;
-}
-
-// reboot: Reboot the system. Return -1 on error, no return on success
-int tw_reboot(RebootCommand command)
-{
-	// Always force a sync before we reboot
-    sync();
-
-    switch (command)
-    {
-    case rb_current:
-    case rb_system:
-        twfinish_recovery("s");
-		sync();
-		check_and_run_script("/sbin/rebootsystem.sh", "reboot system");
-        return reboot(RB_AUTOBOOT);
-    case rb_recovery:
-		check_and_run_script("/sbin/rebootrecovery.sh", "reboot recovery");
-        return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "recovery");
-    case rb_bootloader:
-		check_and_run_script("/sbin/rebootbootloader.sh", "reboot bootloader");
-        return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "bootloader");
-    case rb_poweroff:
-		check_and_run_script("/sbin/poweroff.sh", "power off");
-        return reboot(RB_POWER_OFF);
-    case rb_download:
-		check_and_run_script("/sbin/rebootdownload.sh", "reboot download");
-		return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "download");
-	return 1;
-    default:
-        return -1;
-    }
-    return -1;
-}
-
diff --git a/recovery.cpp b/recovery.cpp
index d6ed79c..35e6116 100644
--- a/recovery.cpp
+++ b/recovery.cpp
@@ -57,6 +57,7 @@
 #include "partitions.hpp"
 #include "variables.h"
 #include "openrecoveryscript.hpp"
+#include "twrp-functions.hpp"
 
 TWPartitionManager PartitionManager;
 
@@ -887,8 +888,8 @@
     printf("\n");
 
 	// Check for and run startup script if script exists
-	check_and_run_script("/sbin/runatboot.sh", "boot");
-	check_and_run_script("/sbin/postrecoveryboot.sh", "boot");
+	TWFunc::check_and_run_script("/sbin/runatboot.sh", "boot");
+	TWFunc::check_and_run_script("/sbin/postrecoveryboot.sh", "boot");
 
 #ifdef TW_INCLUDE_INJECTTWRP
 	// Back up TWRP Ramdisk if needed:
diff --git a/tw_reboot.h b/tw_reboot.h
deleted file mode 100644
index e04c0a7..0000000
--- a/tw_reboot.h
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2007 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-#ifndef REBOOT_H_
-#define REBOOT_H_
-
-typedef enum
-{
-    rb_current = 0,
-    rb_system, 
-    rb_recovery, 
-    rb_poweroff, 
-    rb_bootloader,     // May also be fastboot
-    rb_download,
-} RebootCommand;
-
-// tw_isRebootCommandSupported: Return 1 if command is supported, 0 if the command is not supported, -1 on error
-int tw_isRebootCommandSupported(RebootCommand command);
-
-// tw_setRebootMode: Set the reboot state (without rebooting). Return 0 on success, -1 on error or unsupported
-int tw_setRebootMode(RebootCommand command);
-
-// tw_reboot: Reboot the system. Return -1 on error, no return on success
-int tw_reboot(RebootCommand command);
-
-#endif  // REBOOT_H_
-
-
-
diff --git a/twrp-functions.cpp b/twrp-functions.cpp
index 066e6e5..28d0ba5 100644
--- a/twrp-functions.cpp
+++ b/twrp-functions.cpp
@@ -8,11 +8,13 @@
 #include <dirent.h>
 #include <time.h>
 #include <errno.h>
+#include <sys/reboot.h>
 
 #include "twrp-functions.hpp"
 #include "partitions.hpp"
 #include "common.h"
 #include "data.hpp"
+#include "bootloader.h"
 
 /*  Checks md5 for a path
     Return values:
@@ -257,4 +259,130 @@
 	if (stat(Path.c_str(), &st) != 0)
 		return 0;
 	return st.st_size;
+}
+
+static const char *COMMAND_FILE = "/cache/recovery/command";
+static const char *INTENT_FILE = "/cache/recovery/intent";
+static const char *LOG_FILE = "/cache/recovery/log";
+static const char *LAST_LOG_FILE = "/cache/recovery/last_log";
+static const char *LAST_INSTALL_FILE = "/cache/recovery/last_install";
+static const char *CACHE_ROOT = "/cache";
+static const char *SDCARD_ROOT = "/sdcard";
+static const char *TEMPORARY_LOG_FILE = "/tmp/recovery.log";
+static const char *TEMPORARY_INSTALL_FILE = "/tmp/last_install";
+
+// close a file, log an error if the error indicator is set
+void TWFunc::check_and_fclose(FILE *fp, const char *name) {
+    fflush(fp);
+    if (ferror(fp)) LOGE("Error in %s\n(%s)\n", name, strerror(errno));
+    fclose(fp);
+}
+
+void TWFunc::copy_log_file(const char* source, const char* destination, int append) {
+    FILE *log = fopen_path(destination, append ? "a" : "w");
+    if (log == NULL) {
+        LOGE("Can't open %s\n", destination);
+    } else {
+        FILE *tmplog = fopen(source, "r");
+        if (tmplog != NULL) {
+            if (append) {
+                fseek(tmplog, tmplog_offset, SEEK_SET);  // Since last write
+            }
+            char buf[4096];
+            while (fgets(buf, sizeof(buf), tmplog)) fputs(buf, log);
+            if (append) {
+                tmplog_offset = ftell(tmplog);
+            }
+            check_and_fclose(tmplog, source);
+        }
+        check_and_fclose(log, destination);
+    }
+}
+
+// clear the recovery command and prepare to boot a (hopefully working) system,
+// copy our log file to cache as well (for the system to read), and
+// record any intent we were asked to communicate back to the system.
+// this function is idempotent: call it as many times as you like.
+void TWFunc::twfinish_recovery(const char *send_intent) {
+    // By this point, we're ready to return to the main system...
+    if (send_intent != NULL) {
+        FILE *fp = fopen_path(INTENT_FILE, "w");
+        if (fp == NULL) {
+            LOGE("Can't open %s\n", INTENT_FILE);
+        } else {
+            fputs(send_intent, fp);
+            check_and_fclose(fp, INTENT_FILE);
+        }
+    }
+
+    // Copy logs to cache so the system can find out what happened.
+    copy_log_file(TEMPORARY_LOG_FILE, LOG_FILE, true);
+    copy_log_file(TEMPORARY_LOG_FILE, LAST_LOG_FILE, false);
+    copy_log_file(TEMPORARY_INSTALL_FILE, LAST_INSTALL_FILE, false);
+    chmod(LOG_FILE, 0600);
+    chown(LOG_FILE, 1000, 1000);   // system user
+    chmod(LAST_LOG_FILE, 0640);
+    chmod(LAST_INSTALL_FILE, 0644);
+
+    // Reset to normal system boot so recovery won't cycle indefinitely.
+    struct bootloader_message boot;
+    memset(&boot, 0, sizeof(boot));
+    set_bootloader_message(&boot);
+
+    // Remove the command file, so recovery won't repeat indefinitely.
+    if (system("mount /cache") != 0 ||
+        (unlink(COMMAND_FILE) && errno != ENOENT)) {
+        LOGW("Can't unlink %s\n", COMMAND_FILE);
+    }
+
+    system("umount /cache");
+    sync();  // For good measure.
+}
+
+// reboot: Reboot the system. Return -1 on error, no return on success
+int TWFunc::tw_reboot(RebootCommand command)
+{
+	// Always force a sync before we reboot
+    sync();
+
+    switch (command)
+    {
+    case rb_current:
+    case rb_system:
+        twfinish_recovery("s");
+		sync();
+		check_and_run_script("/sbin/rebootsystem.sh", "reboot system");
+        return reboot(RB_AUTOBOOT);
+    case rb_recovery:
+		check_and_run_script("/sbin/rebootrecovery.sh", "reboot recovery");
+        return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "recovery");
+    case rb_bootloader:
+		check_and_run_script("/sbin/rebootbootloader.sh", "reboot bootloader");
+        return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "bootloader");
+    case rb_poweroff:
+		check_and_run_script("/sbin/poweroff.sh", "power off");
+        return reboot(RB_POWER_OFF);
+    case rb_download:
+		check_and_run_script("/sbin/rebootdownload.sh", "reboot download");
+		return __reboot(LINUX_REBOOT_MAGIC1, LINUX_REBOOT_MAGIC2, LINUX_REBOOT_CMD_RESTART2, (void*) "download");
+	return 1;
+    default:
+        return -1;
+    }
+    return -1;
+}
+
+void TWFunc::check_and_run_script(const char* script_file, const char* display_name)
+{
+	// Check for and run startup script if script exists
+	struct stat st;
+	if (stat(script_file, &st) == 0) {
+		ui_print("Running %s script...\n", display_name);
+		char command[255];
+		strcpy(command, "chmod 755 ");
+		strcat(command, script_file);
+		system(command);
+		system(script_file);
+		ui_print("\nFinished running %s script.\n", display_name);
+	}
 }
\ No newline at end of file
diff --git a/twrp-functions.hpp b/twrp-functions.hpp
index aebd7c3..7bda287 100644
--- a/twrp-functions.hpp
+++ b/twrp-functions.hpp
@@ -5,6 +5,16 @@
 
 using namespace std;
 
+typedef enum
+{
+    rb_current = 0,
+    rb_system,
+    rb_recovery,
+    rb_poweroff,
+    rb_bootloader,     // May also be fastboot
+    rb_download,
+} RebootCommand;
+
 // Partition class
 class TWFunc
 {
@@ -23,6 +33,13 @@
 	static void GUI_Operation_Text(string Read_Value, string Default_Text);     // Updates text for display in the GUI, e.g. Backing up %partition name%
 	static void GUI_Operation_Text(string Read_Value, string Partition_Name, string Default_Text); // Same as above but includes partition name
 	static unsigned long Get_File_Size(string Path);                            // Returns the size of a file
+	static void twfinish_recovery(const char *send_intent);
+	static int tw_reboot(RebootCommand command);
+	static void check_and_run_script(const char* script_file, const char* display_name);
+
+private:
+	static void check_and_fclose(FILE *fp, const char *name);
+	static void copy_log_file(const char* source, const char* destination, int append);
 
 };