1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * * Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * * Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in 12 * the documentation and/or other materials provided with the 13 * distribution. 14 * 15 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 16 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 17 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 18 * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 19 * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 20 * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 21 * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 22 * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 23 * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 * SUCH DAMAGE. 27 */ 28 29 #include <cutils/sockets.h> 30 31 // https://msdn.microsoft.com/en-us/library/windows/desktop/ms741549(v=vs.85).aspx 32 // claims WSACleanup() should be called before program exit, but general 33 // consensus seems to be that it hasn't actually been necessary for a long time, 34 // likely since Windows 3.1. Additionally, trying to properly use WSACleanup() 35 // can be extremely tricky and cause deadlock when using threads or atexit(). 36 // 37 // Both adb (1) and Chrome (2) purposefully avoid WSACleanup() with no issues. 38 // (1) https://android.googlesource.com/platform/system/core.git/+/master/adb/sysdeps_win32.cpp 39 // (2) https://code.google.com/p/chromium/codesearch#chromium/src/net/base/winsock_init.cc 40 bool initialize_windows_sockets() { 41 // There's no harm in calling WSAStartup() multiple times but no benefit 42 // either, we may as well skip it after the first. 43 static bool init_success = false; 44 45 if (!init_success) { 46 WSADATA wsaData; 47 init_success = (WSAStartup(MAKEWORD(2, 2), &wsaData) == 0); 48 } 49 50 return init_success; 51 } 52 53 int socket_close(cutils_socket_t sock) { 54 return closesocket(sock); 55 } 56 57 int socket_set_receive_timeout(cutils_socket_t sock, int timeout_ms) { 58 return setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, 59 reinterpret_cast<char*>(&timeout_ms), sizeof(timeout_ms)); 60 } 61 62 ssize_t socket_send_buffers(cutils_socket_t sock, 63 const cutils_socket_buffer_t* buffers, 64 size_t num_buffers) { 65 if (num_buffers > SOCKET_SEND_BUFFERS_MAX_BUFFERS) { 66 return -1; 67 } 68 69 WSABUF wsa_buffers[SOCKET_SEND_BUFFERS_MAX_BUFFERS]; 70 for (size_t i = 0; i < num_buffers; ++i) { 71 // It's safe to cast away const here; WSABUF declares non-const 72 // void* because it's used for both send and receive, but since 73 // we're only sending, the data won't be modified. 74 wsa_buffers[i].buf = 75 reinterpret_cast<char*>(const_cast<void*>(buffers[i].data)); 76 wsa_buffers[i].len = buffers[i].length; 77 } 78 79 DWORD bytes_sent = 0; 80 if (WSASend(sock, wsa_buffers, num_buffers, &bytes_sent, 0, nullptr, 81 nullptr) != SOCKET_ERROR) { 82 return bytes_sent; 83 } 84 85 return -1; 86 } 87 88 int android_get_control_socket(const char*) { 89 return -1; 90 } 91