#ifndef SSL_HPP_
#define SSL_HPP_
#ifdef USE_OPENSSL
#include "common.hpp"
#include "poll.hpp"
#include "fdtable.hpp"
#include "sock.hpp"
#include <openssl/ssl.h>
bool ssl_init(const char* cert, const char* key); ///< inconsistent state upon error and thus fatal
void ssl_deinit();
class SslClient {
    private:
        const int fd;
        ip_str_t ip;
        SSL* ssl;
        bool polling;
        bool accepted;
        static FdTable<SslClient*> fds;
        void handle(event_t); ///< poll callback. destruct upon error, accept/shutdown otherwise depending on #accepted. creates actual client upon success.
        static void handle(int, event_t);
        SslClient(int, const ip_str_t); ///< create SSL instance for fd and starts accept handshake
        ~SslClient(); ///< removes poll, closes fd, cleanup
    public:
        static void createInst(int, const ip_str_t); ///< static SslCLient() wrapper
        static int shutdown(int); ///< evntually leading to ~SslClient() after ssl shutdown
        static ssize_t ssl_read(int, void*, size_t); ///< io wrapper, as read(). sets errno or returns 0 for eof.
        static ssize_t ssl_write(int, const void*, size_t); ///< io/wrapper, as write(). sets errno.
};
#endif
#endif