am 6b40d0aa: Merge "adb: win32: fix exec-in and exec-out to use binary mode"
* commit '6b40d0aaa1e8142dbe14a1fb1bfd7ff04de54e53':
adb: win32: fix exec-in and exec-out to use binary mode
diff --git a/adb/commandline.cpp b/adb/commandline.cpp
index 7d6de98..f190336 100644
--- a/adb/commandline.cpp
+++ b/adb/commandline.cpp
@@ -302,13 +302,32 @@
if (buf == nullptr) fatal("couldn't allocate buffer for copy_to_file");
int len;
long total = 0;
+#ifdef _WIN32
+ int old_stdin_mode = -1;
+ int old_stdout_mode = -1;
+#endif
D("copy_to_file(%d -> %d)\n", inFd, outFd);
if (inFd == STDIN_FILENO) {
stdin_raw_init(STDIN_FILENO);
+#ifdef _WIN32
+ old_stdin_mode = _setmode(STDIN_FILENO, _O_BINARY);
+ if (old_stdin_mode == -1) {
+ fatal_errno("could not set stdin to binary");
+ }
+#endif
}
+#ifdef _WIN32
+ if (outFd == STDOUT_FILENO) {
+ old_stdout_mode = _setmode(STDOUT_FILENO, _O_BINARY);
+ if (old_stdout_mode == -1) {
+ fatal_errno("could not set stdout to binary");
+ }
+ }
+#endif
+
while (true) {
if (inFd == STDIN_FILENO) {
len = unix_read(inFd, buf, BUFSIZE);
@@ -338,8 +357,21 @@
if (inFd == STDIN_FILENO) {
stdin_raw_restore(STDIN_FILENO);
+#ifdef _WIN32
+ if (_setmode(STDIN_FILENO, old_stdin_mode) == -1) {
+ fatal_errno("could not restore stdin mode");
+ }
+#endif
}
+#ifdef _WIN32
+ if (outFd == STDOUT_FILENO) {
+ if (_setmode(STDOUT_FILENO, old_stdout_mode) == -1) {
+ fatal_errno("could not restore stdout mode");
+ }
+ }
+#endif
+
D("copy_to_file() finished after %lu bytes\n", total);
free(buf);
}