Loading adb/adb.cpp +26 −7 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ #include "adb_auth.h" #include "adb_io.h" #include "adb_listeners.h" #include "adb_unique_fd.h" #include "adb_utils.h" #include "sysdeps/chrono.h" #include "transport.h" Loading Loading @@ -656,6 +657,26 @@ static unsigned __stdcall _redirect_stderr_thread(HANDLE h) { #endif static void ReportServerStartupFailure(pid_t pid) { fprintf(stderr, "ADB server didn't ACK\n"); fprintf(stderr, "Full server startup log: %s\n", GetLogFilePath().c_str()); fprintf(stderr, "Server had pid: %d\n", pid); unique_fd fd(adb_open(GetLogFilePath().c_str(), O_RDONLY)); if (fd == -1) return; // Let's not show more than 128KiB of log... adb_lseek(fd, -128 * 1024, SEEK_END); std::string content; if (!android::base::ReadFdToString(fd, &content)) return; std::string header = android::base::StringPrintf("--- adb starting (pid %d) ---", pid); std::vector<std::string> lines = android::base::Split(content, "\n"); int i = lines.size() - 1; while (i >= 0 && lines[i] != header) --i; while (static_cast<size_t>(i) < lines.size()) fprintf(stderr, "%s\n", lines[i++].c_str()); } int launch_server(const std::string& socket_spec) { #if defined(_WIN32) /* we need to start the server in the background */ Loading Loading @@ -835,7 +856,8 @@ int launch_server(const std::string& socket_spec) { memcmp(temp, expected, expected_length) == 0) { got_ack = true; } else { fprintf(stderr, "ADB server didn't ACK\n"); ReportServerStartupFailure(GetProcessId(process_handle.get())); return -1; } } else { const DWORD err = GetLastError(); Loading Loading @@ -911,10 +933,7 @@ int launch_server(const std::string& socket_spec) { fprintf(stderr, "adb: execl returned %d: %s\n", result, strerror(errno)); } else { // parent side of the fork char temp[3]; temp[0] = 'A'; temp[1] = 'B'; temp[2] = 'C'; char temp[3] = {}; // wait for the "OK\n" message adb_close(fd[1]); int ret = adb_read(fd[0], temp, 3); Loading @@ -925,7 +944,7 @@ int launch_server(const std::string& socket_spec) { return -1; } if (ret != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') { fprintf(stderr, "ADB server didn't ACK\n" ); ReportServerStartupFailure(pid); return -1; } } Loading adb/adb_utils.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -278,3 +278,29 @@ int syntax_error(const char* fmt, ...) { fprintf(stderr, "\n"); return 1; } std::string GetLogFilePath() { #if defined(_WIN32) const char log_name[] = "adb.log"; WCHAR temp_path[MAX_PATH]; // https://msdn.microsoft.com/en-us/library/windows/desktop/aa364992%28v=vs.85%29.aspx DWORD nchars = GetTempPathW(arraysize(temp_path), temp_path); if (nchars >= arraysize(temp_path) || nchars == 0) { // If string truncation or some other error. fatal("cannot retrieve temporary file path: %s\n", android::base::SystemErrorCodeToString(GetLastError()).c_str()); } std::string temp_path_utf8; if (!android::base::WideToUTF8(temp_path, &temp_path_utf8)) { fatal_errno("cannot convert temporary file path from UTF-16 to UTF-8"); } return temp_path_utf8 + log_name; #else const char* tmp_dir = getenv("TMPDIR"); if (tmp_dir == nullptr) tmp_dir = "/tmp"; return android::base::StringPrintf("%s/adb.%u.log", tmp_dir, getuid()); #endif } adb/adb_utils.h +2 −0 Original line number Diff line number Diff line Loading @@ -89,4 +89,6 @@ class BlockingQueue { } }; std::string GetLogFilePath(); #endif adb/client/main.cpp +1 −27 Original line number Diff line number Diff line Loading @@ -39,33 +39,7 @@ #include "sysdeps/chrono.h" #include "transport.h" static std::string GetLogFilePath() { #if defined(_WIN32) const char log_name[] = "adb.log"; WCHAR temp_path[MAX_PATH]; // https://msdn.microsoft.com/en-us/library/windows/desktop/aa364992%28v=vs.85%29.aspx DWORD nchars = GetTempPathW(arraysize(temp_path), temp_path); if (nchars >= arraysize(temp_path) || nchars == 0) { // If string truncation or some other error. fatal("cannot retrieve temporary file path: %s\n", android::base::SystemErrorCodeToString(GetLastError()).c_str()); } std::string temp_path_utf8; if (!android::base::WideToUTF8(temp_path, &temp_path_utf8)) { fatal_errno("cannot convert temporary file path from UTF-16 to UTF-8"); } return temp_path_utf8 + log_name; #else const char* tmp_dir = getenv("TMPDIR"); if (tmp_dir == nullptr) tmp_dir = "/tmp"; return android::base::StringPrintf("%s/adb.%u.log", tmp_dir, getuid()); #endif } static void setup_daemon_logging(void) { static void setup_daemon_logging() { const std::string log_file_path(GetLogFilePath()); int fd = unix_open(log_file_path.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0640); if (fd == -1) { Loading Loading
adb/adb.cpp +26 −7 Original line number Diff line number Diff line Loading @@ -49,6 +49,7 @@ #include "adb_auth.h" #include "adb_io.h" #include "adb_listeners.h" #include "adb_unique_fd.h" #include "adb_utils.h" #include "sysdeps/chrono.h" #include "transport.h" Loading Loading @@ -656,6 +657,26 @@ static unsigned __stdcall _redirect_stderr_thread(HANDLE h) { #endif static void ReportServerStartupFailure(pid_t pid) { fprintf(stderr, "ADB server didn't ACK\n"); fprintf(stderr, "Full server startup log: %s\n", GetLogFilePath().c_str()); fprintf(stderr, "Server had pid: %d\n", pid); unique_fd fd(adb_open(GetLogFilePath().c_str(), O_RDONLY)); if (fd == -1) return; // Let's not show more than 128KiB of log... adb_lseek(fd, -128 * 1024, SEEK_END); std::string content; if (!android::base::ReadFdToString(fd, &content)) return; std::string header = android::base::StringPrintf("--- adb starting (pid %d) ---", pid); std::vector<std::string> lines = android::base::Split(content, "\n"); int i = lines.size() - 1; while (i >= 0 && lines[i] != header) --i; while (static_cast<size_t>(i) < lines.size()) fprintf(stderr, "%s\n", lines[i++].c_str()); } int launch_server(const std::string& socket_spec) { #if defined(_WIN32) /* we need to start the server in the background */ Loading Loading @@ -835,7 +856,8 @@ int launch_server(const std::string& socket_spec) { memcmp(temp, expected, expected_length) == 0) { got_ack = true; } else { fprintf(stderr, "ADB server didn't ACK\n"); ReportServerStartupFailure(GetProcessId(process_handle.get())); return -1; } } else { const DWORD err = GetLastError(); Loading Loading @@ -911,10 +933,7 @@ int launch_server(const std::string& socket_spec) { fprintf(stderr, "adb: execl returned %d: %s\n", result, strerror(errno)); } else { // parent side of the fork char temp[3]; temp[0] = 'A'; temp[1] = 'B'; temp[2] = 'C'; char temp[3] = {}; // wait for the "OK\n" message adb_close(fd[1]); int ret = adb_read(fd[0], temp, 3); Loading @@ -925,7 +944,7 @@ int launch_server(const std::string& socket_spec) { return -1; } if (ret != 3 || temp[0] != 'O' || temp[1] != 'K' || temp[2] != '\n') { fprintf(stderr, "ADB server didn't ACK\n" ); ReportServerStartupFailure(pid); return -1; } } Loading
adb/adb_utils.cpp +26 −0 Original line number Diff line number Diff line Loading @@ -278,3 +278,29 @@ int syntax_error(const char* fmt, ...) { fprintf(stderr, "\n"); return 1; } std::string GetLogFilePath() { #if defined(_WIN32) const char log_name[] = "adb.log"; WCHAR temp_path[MAX_PATH]; // https://msdn.microsoft.com/en-us/library/windows/desktop/aa364992%28v=vs.85%29.aspx DWORD nchars = GetTempPathW(arraysize(temp_path), temp_path); if (nchars >= arraysize(temp_path) || nchars == 0) { // If string truncation or some other error. fatal("cannot retrieve temporary file path: %s\n", android::base::SystemErrorCodeToString(GetLastError()).c_str()); } std::string temp_path_utf8; if (!android::base::WideToUTF8(temp_path, &temp_path_utf8)) { fatal_errno("cannot convert temporary file path from UTF-16 to UTF-8"); } return temp_path_utf8 + log_name; #else const char* tmp_dir = getenv("TMPDIR"); if (tmp_dir == nullptr) tmp_dir = "/tmp"; return android::base::StringPrintf("%s/adb.%u.log", tmp_dir, getuid()); #endif }
adb/adb_utils.h +2 −0 Original line number Diff line number Diff line Loading @@ -89,4 +89,6 @@ class BlockingQueue { } }; std::string GetLogFilePath(); #endif
adb/client/main.cpp +1 −27 Original line number Diff line number Diff line Loading @@ -39,33 +39,7 @@ #include "sysdeps/chrono.h" #include "transport.h" static std::string GetLogFilePath() { #if defined(_WIN32) const char log_name[] = "adb.log"; WCHAR temp_path[MAX_PATH]; // https://msdn.microsoft.com/en-us/library/windows/desktop/aa364992%28v=vs.85%29.aspx DWORD nchars = GetTempPathW(arraysize(temp_path), temp_path); if (nchars >= arraysize(temp_path) || nchars == 0) { // If string truncation or some other error. fatal("cannot retrieve temporary file path: %s\n", android::base::SystemErrorCodeToString(GetLastError()).c_str()); } std::string temp_path_utf8; if (!android::base::WideToUTF8(temp_path, &temp_path_utf8)) { fatal_errno("cannot convert temporary file path from UTF-16 to UTF-8"); } return temp_path_utf8 + log_name; #else const char* tmp_dir = getenv("TMPDIR"); if (tmp_dir == nullptr) tmp_dir = "/tmp"; return android::base::StringPrintf("%s/adb.%u.log", tmp_dir, getuid()); #endif } static void setup_daemon_logging(void) { static void setup_daemon_logging() { const std::string log_file_path(GetLogFilePath()); int fd = unix_open(log_file_path.c_str(), O_WRONLY | O_CREAT | O_APPEND, 0640); if (fd == -1) { Loading