summaryrefslogtreecommitdiff
path: root/includes
diff options
context:
space:
mode:
authorNicolas "Pixel" Noble <pixel@nobis-crew.org>2014-08-07 15:51:33 -0700
committerNicolas "Pixel" Noble <pixel@nobis-crew.org>2014-08-07 15:51:33 -0700
commit2f93a2e442c251d0d9de5e828a66acd40086e28d (patch)
tree987f6181c3ae5cdc402e7d400266b68c2fa55985 /includes
parentd36ef7155563734d372d4bb950c6945ce7fb8b1a (diff)
Adding full c-ares support into Balau - untested.
Diffstat (limited to 'includes')
-rw-r--r--includes/Socket.h16
-rw-r--r--includes/TaskMan.h17
2 files changed, 29 insertions, 4 deletions
diff --git a/includes/Socket.h b/includes/Socket.h
index 22bf972..0909763 100644
--- a/includes/Socket.h
+++ b/includes/Socket.h
@@ -18,8 +18,6 @@
namespace Balau {
-struct DNSRequest;
-
class Socket : public Selectable {
public:
Socket() throw (GeneralException);
@@ -34,19 +32,29 @@ class Socket : public Selectable {
bool connect(const char * hostname, int port);
IO<Socket> accept() throw (GeneralException);
bool listen();
- bool resolved();
+ bool resolved() { return m_resolved; }
private:
Socket(int fd);
virtual ssize_t recv(int sockfd, void *buf, size_t len, int flags);
virtual ssize_t send(int sockfd, const void *buf, size_t len, int flags);
+ void resolve(const char * hostname);
+ void initAddr(sockaddr_in6 & out);
+ void resolved(sockaddr_in6 & out);
+
String m_name;
bool m_connected = false;
bool m_connecting = false;
bool m_listening = false;
+ int m_resolving = 0;
+ bool m_resolved = false;
+ bool m_resolve4Failed = false;
+ bool m_resolve6Failed = false;
+ Events::Custom m_resolveEvent;
+ struct in_addr m_resolvedAddr4;
+ struct in6_addr m_resolvedAddr6;
sockaddr_in6 m_localAddr, m_remoteAddr;
- DNSRequest * m_req = NULL;
};
class ListenerBase : public StacklessTask {
diff --git a/includes/TaskMan.h b/includes/TaskMan.h
index e928907..16944a7 100644
--- a/includes/TaskMan.h
+++ b/includes/TaskMan.h
@@ -21,6 +21,8 @@
namespace gnu = __gnu_cxx;
#endif
+struct ares_channeldata;
+
namespace Balau {
class TaskScheduler;
@@ -67,6 +69,9 @@ class TaskMan {
template<class T>
static T * registerTask(T * t, Events::TaskEvent * event) { TaskMan::iRegisterTask(t, NULL, event); return t; }
+ typedef std::function<void(int status, int timeouts, struct hostent * hostent)> AresHostCallback;
+ void getHostByName(const Balau::String & name, int family, AresHostCallback callback);
+
private:
static void iRegisterTask(Task * t, Task * stick, Events::TaskEvent * event);
static void registerAsyncOp(AsyncOperation * op);
@@ -105,6 +110,7 @@ class TaskMan {
int m_stopCode = 0;
bool m_stopped = false;
bool m_allowedToSignal = false;
+
ev::timer m_curlTimer;
CURLM * m_curlMulti = NULL;
int m_curlStillRunning = 0;
@@ -118,6 +124,17 @@ class TaskMan {
void registerCurlHandle(CurlTask * curlTask);
void unregisterCurlHandle(CurlTask * curlTask);
+ struct ares_channeldata * m_aresChannel = NULL;
+ static const int ARES_MAX_SOCKETS = 2;
+ curl_socket_t m_aresSockets[ARES_MAX_SOCKETS];
+ ev::io * m_aresSocketEvents[ARES_MAX_SOCKETS];
+ ev::timer m_aresTimer;
+ static void aresSocketCallbackStatic(void * data, curl_socket_t s, int read, int write);
+ void aresSocketCallback(curl_socket_t s, int read, int write);
+ void aresSocketEventCallback(ev::io & w, int revents);
+ void aresTimerEventCallback(ev::timer & w, int revents);
+ static void aresHostCallback(void * arg, int status, int timeouts, struct hostent * hostent);
+
TaskMan(const TaskMan &) = delete;
TaskMan & operator=(const TaskMan &) = delete;
};