1 /* 2 * OS specific utility functions 3 * (C) 2015,2016,2017 Jack Lloyd 4 * 5 * Botan is released under the Simplified BSD License (see license.txt) 6 */ 7 8 #ifndef BOTAN_SOCKET_H_ 9 #define BOTAN_SOCKET_H_ 10 11 #include <botan/types.h> 12 #include <string> 13 #include <chrono> 14 15 namespace Botan { 16 17 namespace OS { 18 19 /* 20 * This header is internal (not installed) and these functions are not 21 * intended to be called by applications. However they are given public 22 * visibility (using BOTAN_TEST_API macro) for the tests. This also probably 23 * allows them to be overridden by the application on ELF systems, but 24 * this hasn't been tested. 25 */ 26 27 28 /** 29 * A wrapper around a simple blocking TCP socket 30 */ 31 class BOTAN_TEST_API Socket 32 { 33 public: 34 /** 35 * The socket will be closed upon destruction 36 */ 37 virtual ~Socket() = default; 38 39 /** 40 * Write to the socket. Blocks until all bytes sent. 41 * Throws on error. 42 */ 43 virtual void write(const uint8_t buf[], size_t len) = 0; 44 45 /** 46 * Reads up to len bytes, returns bytes written to buf. 47 * Returns 0 on EOF. Throws on error. 48 */ 49 virtual size_t read(uint8_t buf[], size_t len) = 0; 50 }; 51 52 /** 53 * Open up a socket. Will throw on error. Returns null if sockets are 54 * not available on this platform. 55 */ 56 std::unique_ptr<Socket> 57 BOTAN_TEST_API open_socket(const std::string& hostname, 58 const std::string& service, 59 std::chrono::milliseconds timeout); 60 61 } // OS 62 } // Botan 63 64 #endif 65