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