Since a TLS (SSL) module will always be the last IOHook attached
to a socket, IsSSL() needs to ignore any Middle IOHooks that may
also be attached.
* @return IOHook belonging to the module or NULL if the module haven't attached an IOHook to this socket
*/
IOHook* GetModHook(Module* mod) const;
+
+ /** Get the last IOHook attached to this socket
+ * @return The last IOHook attached to this socket or NULL if no IOHooks are attached
+ */
+ IOHook* GetLastHook() const;
};
/**
* BufferedSocket is an extendable socket class which modules
public:
static SSLIOHook* IsSSL(StreamSocket* sock)
{
- IOHook* const iohook = sock->GetIOHook();
- if ((iohook) && ((iohook->prov->type == IOHookProvider::IOH_SSL)))
- return static_cast<SSLIOHook*>(iohook);
+ IOHook* const lasthook = sock->GetLastHook();
+ if (lasthook && (lasthook->prov->type == IOHookProvider::IOH_SSL))
+ return static_cast<SSLIOHook*>(lasthook);
+
return NULL;
}
return NULL;
}
+IOHook* StreamSocket::GetLastHook() const
+{
+ IOHook* curr = GetIOHook();
+ IOHook* last = curr;
+
+ for (; curr; curr = GetNextHook(curr))
+ last = curr;
+
+ return last;
+}
+
+
void StreamSocket::AddIOHook(IOHook* newhook)
{
IOHook* curr = GetIOHook();