diff --git a/init/init.cpp b/init/init.cpp index 704597d2d..bac27df88 100644 --- a/init/init.cpp +++ b/init/init.cpp @@ -74,7 +74,8 @@ static int property_triggers_enabled = 0; static char qemu[32]; -std::vector console_names; +int have_console; +std::string console_name = "/dev/console"; static time_t process_needs_restart; const char *ENV[32]; @@ -297,23 +298,38 @@ static int keychord_init_action(const std::vector& args) static int console_init_action(const std::vector& args) { - std::vector consoles; - std::string c_prop = property_get("ro.boot.console"); - if (c_prop.empty()) { - // Property is missing, so check the system console by default. - consoles.emplace_back(DEFAULT_CONSOLE); - } else { - consoles = android::base::Split(c_prop, ":"); + std::string console = property_get("ro.boot.console"); + if (!console.empty()) { + console_name = "/dev/" + console; } - for (const auto& c : consoles) { - std::string console = "/dev/" + c; - int fd = open(console.c_str(), O_RDWR | O_CLOEXEC); - if (fd != -1) { - console_names.emplace_back(c); - close(fd); - } + int fd = open(console_name.c_str(), O_RDWR | O_CLOEXEC); + if (fd >= 0) + have_console = 1; + close(fd); + + fd = open("/dev/tty0", O_WRONLY | O_CLOEXEC); + if (fd >= 0) { + const char *msg; + msg = "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" // console is 40 cols x 30 lines + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + "\n" + " A N D R O I D "; + write(fd, msg, strlen(msg)); + close(fd); } + return 0; } diff --git a/init/init.h b/init/init.h index c844489ac..b6a095b94 100644 --- a/init/init.h +++ b/init/init.h @@ -18,17 +18,16 @@ #define _INIT_INIT_H #include -#include class Action; class Service; #define COMMAND_RETRY_TIMEOUT 5 -#define DEFAULT_CONSOLE "console" extern const char *ENV[32]; extern bool waiting_for_exec; -extern std::vector console_names; +extern int have_console; +extern std::string console_name; extern struct selabel_handle *sehandle; extern struct selabel_handle *sehandle_prop; diff --git a/init/readme.txt b/init/readme.txt index 7d453c674..ef85ccf1f 100644 --- a/init/readme.txt +++ b/init/readme.txt @@ -115,11 +115,6 @@ Options Options are modifiers to services. They affect how and when init runs the service. -console [] - This service needs a console. The optional second parameter chooses a - specific console instead of the default "/dev/console". The leading "/dev/" - should be omitted, so "/dev/tty0" would be specified as just "console tty0". - critical This is a device-critical service. If it exits more than four times in four minutes, the device will reboot into recovery mode. diff --git a/init/service.cpp b/init/service.cpp index e7bbf7b20..bdecc324f 100644 --- a/init/service.cpp +++ b/init/service.cpp @@ -172,7 +172,6 @@ bool Service::HandleClass(const std::vector& args, std::string* err bool Service::HandleConsole(const std::vector& args, std::string* err) { flags_ |= SVC_CONSOLE; - console_ = args.size() > 1 ? args[1] : DEFAULT_CONSOLE; return true; } @@ -283,7 +282,7 @@ Service::OptionHandlerMap::Map& Service::OptionHandlerMap::map() const { constexpr std::size_t kMax = std::numeric_limits::max(); static const Map option_handlers = { {"class", {1, 1, &Service::HandleClass}}, - {"console", {0, 1, &Service::HandleConsole}}, + {"console", {0, 0, &Service::HandleConsole}}, {"critical", {0, 0, &Service::HandleCritical}}, {"disabled", {0, 0, &Service::HandleDisabled}}, {"group", {1, NR_SVC_SUPP_GIDS + 1, &Service::HandleGroup}}, @@ -330,7 +329,7 @@ bool Service::Start(const std::vector& dynamic_args) { } bool needs_console = (flags_ & SVC_CONSOLE); - if (needs_console && console_names.empty()) { + if (needs_console && !have_console) { ERROR("service '%s' requires console\n", name_.c_str()); flags_ |= SVC_DISABLED; return false; @@ -607,12 +606,10 @@ void Service::ZapStdio() const { } void Service::OpenConsole() const { - int fd = -1; - if (std::find(console_names.begin(), console_names.end(), console_) != console_names.end()) { - std::string c_path = "/dev/" + console_; - fd = open(c_path.c_str(), O_RDWR); + int fd; + if ((fd = open(console_name.c_str(), O_RDWR)) < 0) { + fd = open("/dev/null", O_RDWR); } - if (fd == -1) fd = open("/dev/null", O_RDWR); ioctl(fd, TIOCSCTTY, 0); dup2(fd, 0); dup2(fd, 1); diff --git a/init/service.h b/init/service.h index b003ca0cc..35abde9b7 100644 --- a/init/service.h +++ b/init/service.h @@ -129,7 +129,6 @@ private: std::string name_; std::string classname_; - std::string console_; unsigned flags_; pid_t pid_;