X-Git-Url: https://git.netwichtig.de/gitweb/?a=blobdiff_plain;f=include%2Finspsocket.h;h=d165d64f2429285a449a20ec1cf68a13fa7daaeb;hb=8683e1c80d9d37ee7ffae54c0d888195a5e8d1a7;hp=43555ff438cc27e2fd154741473323abdb4937c0;hpb=696ee9ff66bb94be2229bfa9c3dc288affc38a72;p=user%2Fhenk%2Fcode%2Finspircd.git diff --git a/include/inspsocket.h b/include/inspsocket.h index 43555ff43..d165d64f2 100644 --- a/include/inspsocket.h +++ b/include/inspsocket.h @@ -6,7 +6,7 @@ * See: http://www.inspircd.org/wiki/index.php/Credits * * This program is free but copyrighted software; see - * the file COPYING for details. + * the file COPYING for details. * * --------------------------------------------------- */ @@ -26,13 +26,42 @@ /** * States which a socket may be in */ -enum InspSocketState { I_DISCONNECTED, I_CONNECTING, I_CONNECTED, I_LISTENING, I_ERROR }; +enum InspSocketState +{ + /** Socket disconnected */ + I_DISCONNECTED, + /** Socket connecting */ + I_CONNECTING, + /** Socket fully connected */ + I_CONNECTED, + /** Socket listening for connections */ + I_LISTENING, + /** Socket has an error */ + I_ERROR +}; /** * Error types which a socket may exhibit */ -enum InspSocketError { I_ERR_TIMEOUT, I_ERR_SOCKET, I_ERR_CONNECT, I_ERR_BIND, I_ERR_RESOLVE, I_ERR_WRITE, I_ERR_NOMOREFDS }; +enum InspSocketError +{ + /** Socket connect timed out */ + I_ERR_TIMEOUT, + /** Socket could not be created */ + I_ERR_SOCKET, + /** Socket could not connect (refused) */ + I_ERR_CONNECT, + /** Socket could not bind to local port/ip */ + I_ERR_BIND, + /** Socket could not reslve host (depreciated) */ + I_ERR_RESOLVE, + /** Socket could not write data */ + I_ERR_WRITE, + /** No more file descriptors left to create socket! */ + I_ERR_NOMOREFDS +}; +/* Required forward declarations */ class InspSocket; class InspIRCd; @@ -43,14 +72,29 @@ using irc::sockets::insp_aton; /** Used to time out socket connections */ -class SocketTimeout : public InspTimer +class CoreExport SocketTimeout : public InspTimer { private: + /** InspSocket the class is attached to + */ InspSocket* sock; + /** Server instance creating the timeout class + */ InspIRCd* ServerInstance; + /** File descriptor of class this is attached to + */ int sfd; public: + /** Create a socket timeout class + * @param fd File descriptor of InspSocket + * @pram Instance server instance to attach to + * @param thesock InspSocket to attach to + * @param secs_from_now Seconds from now to time out + * @param now The current time + */ SocketTimeout(int fd, InspIRCd* Instance, InspSocket* thesock, long secs_from_now, time_t now) : InspTimer(secs_from_now, now), sock(thesock), ServerInstance(Instance), sfd(fd) { }; + /** Handle tick event + */ virtual void Tick(time_t now); }; @@ -65,18 +109,38 @@ class SocketTimeout : public InspTimer * and use the InspSocket constructors to establish connections * and bindings. */ -class InspSocket : public EventHandler +class CoreExport InspSocket : public EventHandler { public: + /** + * Bind IP + */ + std::string cbindip; + + /** + * Is hooked by a module for low level IO + */ bool IsIOHooked; + /** + * Instance we were created by + */ InspIRCd* Instance; + /** + * Timeout class or NULL + */ SocketTimeout* Timeout; + /** + * Timeout length + */ unsigned long timeout_val; + /** + * Socket output buffer (binary safe) + */ std::deque outbuffer; /** @@ -97,23 +161,11 @@ class InspSocket : public EventHandler */ InspSocketState state; - /** - * The host being connected to, - * in sockaddr form - */ - insp_sockaddr addr; - - /** - * The host being connected to, - * in in_addr form - */ - insp_inaddr addy; - /** * This value is true if the * socket has timed out. */ - bool timeout; + bool timeout; /** * Socket input buffer, used by read(). The class which @@ -131,18 +183,6 @@ class InspSocket : public EventHandler */ char IP[MAXBUF]; - /** - * Client sockaddr structure used - * by accept() - */ - insp_sockaddr client; - - /** - * Server sockaddr structure used - * by accept() - */ - insp_sockaddr server; - /** * Used by accept() to indicate the * sizes of the sockaddr_in structures @@ -173,7 +213,12 @@ class InspSocket : public EventHandler */ bool WaitingForWriteEvent; - bool BindAddr(); + /** + * Bind to an address + * @param ip IP to bind to + * @return True is the binding succeeded + */ + bool BindAddr(const std::string &ip); /** * The default constructor does nothing @@ -201,8 +246,10 @@ class InspSocket : public EventHandler * @param port The port number to connect to, or bind to * @param listening true to listen on the given host:port pair, or false to connect to them * @param maxtime Number of seconds to wait, if connecting, before the connection times out and an OnTimeout() event is generated + * @param connectbindip When creating an outbound connection, the IP to bind the connection to. If not defined, the port is not bound. + * @return On exit, GetState() returns I_ERROR if an error occured, and errno can be used to read the socket error. */ - InspSocket(InspIRCd* SI, const std::string &ipaddr, int port, bool listening, unsigned long maxtime); + InspSocket(InspIRCd* SI, const std::string &ipaddr, int port, bool listening, unsigned long maxtime, const std::string &connectbindip = ""); /** * This method is called when an outbound @@ -239,6 +286,15 @@ class InspSocket : public EventHandler */ virtual bool OnDataReady(); + /** + * When it is ok to write to the socket, and a + * write event was requested, this method is + * triggered. Within this method you should call + * write() or send() etc, to send data to the + * other end of the socket. Further write events + * will not be triggered unless you call WantWrite(). + * @return false to close the socket + */ virtual bool OnWriteReady(); /** @@ -362,12 +418,20 @@ class InspSocket : public EventHandler * The next time the core examines a socket marked * as closed, the socket will be closed and the * memory reclaimed. + * + * NOTE: This method is DEPRECIATED and will be + * ignored if called! */ void MarkAsClosed(); + /** Handle event from EventHandler parent class + */ void HandleEvent(EventType et, int errornum = 0); + /** Returns true if this socket is readable + */ bool Readable(); }; #endif +