adb: win32: write ACK to separate pipe instead of stdout
The win32 version of 9f2d1a9cfc04e1d5970823da1878097288a9a9cd. The big
technique is to fit a Win32 HANDLE value in an int because it only uses
32-bits. This allows most of the other adb code to stay the same.
Also, fix a regression in the 'adb server nodaemon' command that was
erroneously returning an error when --reply-fd was not used, which
should not be necessary for this particular command.
Change-Id: I37e9c609014b813af93bf0d6c12f665b59c93c41
Signed-off-by: Spencer Low <CompareAndSwap@gmail.com>
diff --git a/adb/commandline.cpp b/adb/commandline.cpp
index 2e182e8..1e1690e 100644
--- a/adb/commandline.cpp
+++ b/adb/commandline.cpp
@@ -953,14 +953,7 @@
int is_server = 0;
int r;
TransportType transport_type = kTransportAny;
-
-#if defined(_WIN32)
- // TODO(compareandswap): Windows should use a separate reply fd too.
- int ack_reply_fd = STDOUT_FILENO;
-#else
int ack_reply_fd = -1;
-#endif
-
// If defined, this should be an absolute path to
// the directory containing all of the various system images
@@ -1003,7 +996,14 @@
argc--;
argv++;
ack_reply_fd = strtol(reply_fd_str, nullptr, 10);
+#ifdef _WIN32
+ const HANDLE ack_reply_handle = cast_int_to_handle(ack_reply_fd);
+ if ((GetStdHandle(STD_INPUT_HANDLE) == ack_reply_handle) ||
+ (GetStdHandle(STD_OUTPUT_HANDLE) == ack_reply_handle) ||
+ (GetStdHandle(STD_ERROR_HANDLE) == ack_reply_handle)) {
+#else
if (ack_reply_fd <= 2) { // Disallow stdin, stdout, and stderr.
+#endif
fprintf(stderr, "adb: invalid reply fd \"%s\"\n", reply_fd_str);
return usage();
}
@@ -1084,7 +1084,7 @@
if (is_server) {
if (no_daemon || is_daemon) {
- if (ack_reply_fd == -1) {
+ if (is_daemon && (ack_reply_fd == -1)) {
fprintf(stderr, "reply fd for adb server to client communication not specified.\n");
return usage();
}