From 29fc859a6de4f5566652c4f5750e91c965d4b97f Mon Sep 17 00:00:00 2001 From: Jin Qian Date: Mon, 10 Jul 2017 16:04:41 -0700 Subject: [PATCH] fastboot: call mke2fs to format ext4 filesystem on windows Bug: 35219933 Change-Id: I0cc8c165176e8dc9cbe4b6a52679937bc872e2d0 --- fastboot/fs.cpp | 60 +++++++++++++++++++++++++++++++++++++------------ 1 file changed, 46 insertions(+), 14 deletions(-) diff --git a/fastboot/fs.cpp b/fastboot/fs.cpp index 6058b882d..709f061bd 100644 --- a/fastboot/fs.cpp +++ b/fastboot/fs.cpp @@ -12,10 +12,14 @@ #include #ifndef WIN32 #include +#else +#include +#include #endif #include #include +#include #include #include #include @@ -26,21 +30,49 @@ using android::base::StringPrintf; using android::base::unique_fd; #ifdef WIN32 -static int generate_ext4_image(const char* fileName, long long partSize, const std::string& initial_dir, - unsigned eraseBlkSize, unsigned logicalBlkSize) -{ - unique_fd fd(open(fileName, O_CREAT | O_RDWR | O_TRUNC, S_IRUSR | S_IWUSR)); - if (fd == -1) { - fprintf(stderr, "Unable to open output file for EXT4 filesystem: %s\n", strerror(errno)); +static int exec_e2fs_cmd(const char* path, char* const argv[]) { + std::string cmd; + int i = 0; + while (argv[i] != nullptr) { + cmd += argv[i++]; + cmd += " "; + } + cmd = cmd.substr(0, cmd.size() - 1); + + STARTUPINFO si; + PROCESS_INFORMATION pi; + DWORD exit_code = 0; + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + ZeroMemory(&pi, sizeof(pi)); + + SetEnvironmentVariableA("MKE2FS_CONFIG", ""); + + if (!CreateProcessA(nullptr, // No module name (use command line) + const_cast(cmd.c_str()), // Command line + nullptr, // Process handle not inheritable + nullptr, // Thread handle not inheritable + FALSE, // Set handle inheritance to FALSE + 0, // No creation flags + nullptr, // Use parent's environment block + nullptr, // Use parent's starting directory + &si, // Pointer to STARTUPINFO structure + &pi) // Pointer to PROCESS_INFORMATION structure + ) { + fprintf(stderr, "CreateProcess failed: %s\n", + android::base::SystemErrorCodeToString(GetLastError()).c_str()); return -1; } - if (initial_dir.empty()) { - make_ext4fs_sparse_fd_align(fd, partSize, NULL, NULL, eraseBlkSize, logicalBlkSize); - } else { - make_ext4fs_sparse_fd_directory_align(fd, partSize, NULL, NULL, initial_dir.c_str(), - eraseBlkSize, logicalBlkSize); - } - return 0; + + WaitForSingleObject(pi.hProcess, INFINITE); + + GetExitCodeProcess(pi.hProcess, &exit_code); + + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + + return exit_code != 0; } #else static int exec_e2fs_cmd(const char* path, char* const argv[]) { @@ -68,6 +100,7 @@ static int exec_e2fs_cmd(const char* path, char* const argv[]) { } return ret; } +#endif static int generate_ext4_image(const char* fileName, long long partSize, const std::string& initial_dir, unsigned eraseBlkSize, @@ -121,7 +154,6 @@ static int generate_ext4_image(const char* fileName, long long partSize, return 0; } -#endif #ifdef USE_F2FS static int generate_f2fs_image(const char* fileName, long long partSize, const std::string& initial_dir,