1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 #define TRACE_TAG RWX 18 19 #include "adb_io.h" 20 21 #include <unistd.h> 22 23 #if !ADB_HOST 24 #include <sys/socket.h> 25 #include <sys/un.h> 26 #endif 27 28 #include <thread> 29 30 #include <android-base/stringprintf.h> 31 32 #include "adb.h" 33 #include "adb_trace.h" 34 #include "adb_utils.h" 35 #include "sysdeps.h" 36 37 bool SendProtocolString(borrowed_fd fd, std::string_view s) { 38 unsigned int length = s.size(); 39 if (length > MAX_PAYLOAD - 4) { 40 errno = EMSGSIZE; 41 return false; 42 } 43 44 // The cost of sending two strings outweighs the cost of formatting. 45 // "adb sync" performance is affected by this. 46 auto str = android::base::StringPrintf("%04x", length).append(s); 47 return WriteFdExactly(fd, str); 48 } 49 50 bool ReadProtocolString(borrowed_fd fd, std::string* s, std::string* error) { 51 char buf[5]; 52 if (!ReadFdExactly(fd, buf, 4)) { 53 *error = perror_str("protocol fault (couldn't read status length)"); 54 return false; 55 } 56 buf[4] = 0; 57 58 unsigned long len = strtoul(buf, nullptr, 16); 59 s->resize(len, '\0'); 60 if (!ReadFdExactly(fd, &(*s)[0], len)) { 61 *error = perror_str("protocol fault (couldn't read status message)"); 62 return false; 63 } 64 65 return true; 66 } 67 68 bool SendOkay(borrowed_fd fd) { 69 return WriteFdExactly(fd, "OKAY", 4); 70 } 71 72 bool SendFail(borrowed_fd fd, std::string_view reason) { 73 return WriteFdExactly(fd, "FAIL", 4) && SendProtocolString(fd, reason); 74 } 75 76 bool ReadFdExactly(borrowed_fd fd, void* buf, size_t len) { 77 char* p = reinterpret_cast<char*>(buf); 78 79 size_t len0 = len; 80 81 D("readx: fd=%d wanted=%zu", fd.get(), len); 82 while (len > 0) { 83 int r = adb_read(fd, p, len); 84 if (r > 0) { 85 len -= r; 86 p += r; 87 } else if (r == -1) { 88 D("readx: fd=%d error %d: %s", fd.get(), errno, strerror(errno)); 89 return false; 90 } else { 91 D("readx: fd=%d disconnected", fd.get()); 92 errno = 0; 93 return false; 94 } 95 } 96 97 VLOG(RWX) << "readx: fd=" << fd.get() << " wanted=" << len0 << " got=" << (len0 - len) << " " 98 << dump_hex(reinterpret_cast<const unsigned char*>(buf), len0); 99 100 return true; 101 } 102 103 bool WriteFdExactly(borrowed_fd fd, const void* buf, size_t len) { 104 const char* p = reinterpret_cast<const char*>(buf); 105 int r; 106 107 VLOG(RWX) << "writex: fd=" << fd.get() << " len=" << len << " " 108 << dump_hex(reinterpret_cast<const unsigned char*>(buf), len); 109 110 while (len > 0) { 111 r = adb_write(fd, p, len); 112 if (r == -1) { 113 D("writex: fd=%d error %d: %s", fd.get(), errno, strerror(errno)); 114 if (errno == EAGAIN) { 115 std::this_thread::yield(); 116 continue; 117 } else if (errno == EPIPE) { 118 D("writex: fd=%d disconnected", fd.get()); 119 errno = 0; 120 return false; 121 } else { 122 return false; 123 } 124 } else { 125 len -= r; 126 p += r; 127 } 128 } 129 return true; 130 } 131 132 bool WriteFdExactly(borrowed_fd fd, const char* str) { 133 return WriteFdExactly(fd, str, strlen(str)); 134 } 135 136 bool WriteFdExactly(borrowed_fd fd, const std::string& str) { 137 return WriteFdExactly(fd, str.c_str(), str.size()); 138 } 139 140 bool WriteFdFmt(borrowed_fd fd, const char* fmt, ...) { 141 std::string str; 142 143 va_list ap; 144 va_start(ap, fmt); 145 android::base::StringAppendV(&str, fmt, ap); 146 va_end(ap); 147 148 return WriteFdExactly(fd, str); 149 } 150 151 bool ReadOrderlyShutdown(borrowed_fd fd) { 152 char buf[16]; 153 154 // Only call this function if you're sure that the peer does 155 // orderly/graceful shutdown of the socket, closing the socket so that 156 // adb_read() will return 0. If the peer keeps the socket open, adb_read() 157 // will never return. 158 int result = adb_read(fd, buf, sizeof(buf)); 159 if (result == -1) { 160 // If errno is EAGAIN, that means this function was called on a 161 // nonblocking socket and it would have blocked (which would be bad 162 // because we'd probably block the main thread where nonblocking IO is 163 // done). Don't do that. If you have a nonblocking socket, use the 164 // fdevent APIs to get called on FDE_READ, and then call this function 165 // if you really need to, but it shouldn't be needed for server sockets. 166 CHECK_NE(errno, EAGAIN); 167 168 // Note that on Windows, orderly shutdown sometimes causes 169 // recv() == SOCKET_ERROR && WSAGetLastError() == WSAECONNRESET. That 170 // can be ignored. 171 return false; 172 } else if (result == 0) { 173 // Peer has performed an orderly/graceful shutdown. 174 return true; 175 } else { 176 // Unexpectedly received data. This is essentially a protocol error 177 // because you should not call this function unless you expect no more 178 // data. We don't repeatedly call adb_read() until we get zero because 179 // we don't know how long that would take, but we do know that the 180 // caller wants to close the socket soon. 181 VLOG(RWX) << "ReadOrderlyShutdown(" << fd.get() << ") unexpectedly read " 182 << dump_hex(buf, result); 183 // Shutdown the socket to prevent the caller from reading or writing to 184 // it which doesn't make sense if we just read and discarded some data. 185 adb_shutdown(fd); 186 errno = EINVAL; 187 return false; 188 } 189 } 190