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);
};