]> git.netwichtig.de Git - user/henk/code/inspircd.git/blobdiff - src/socketengine.cpp
Move already sent id rollover handling and static LocalUser::already_sent_id into...
[user/henk/code/inspircd.git] / src / socketengine.cpp
index 1c91ccdea0c37f52d6cb5d1ac2c8469bd79004aa..4183488b723ac0f063c5af9aa71b76a9d9caf688 100644 (file)
@@ -53,6 +53,14 @@ void EventHandler::SetFd(int FD)
        this->fd = FD;
 }
 
+void EventHandler::OnEventHandlerWrite()
+{
+}
+
+void EventHandler::OnEventHandlerError(int errornum)
+{
+}
+
 void SocketEngine::ChangeEventMask(EventHandler* eh, int change)
 {
        int old_m = eh->event_mask;
@@ -91,9 +99,9 @@ void SocketEngine::DispatchTrialWrites()
                int mask = eh->event_mask;
                eh->event_mask &= ~(FD_ADD_TRIAL_READ | FD_ADD_TRIAL_WRITE);
                if ((mask & (FD_ADD_TRIAL_READ | FD_READ_WILL_BLOCK)) == FD_ADD_TRIAL_READ)
-                       eh->HandleEvent(EVENT_READ, 0);
+                       eh->OnEventHandlerRead();
                if ((mask & (FD_ADD_TRIAL_WRITE | FD_WRITE_WILL_BLOCK)) == FD_ADD_TRIAL_WRITE)
-                       eh->HandleEvent(EVENT_WRITE, 0);
+                       eh->OnEventHandlerWrite();
        }
 }
 
@@ -224,6 +232,33 @@ int SocketEngine::SendTo(EventHandler* fd, const void *buf, size_t len, int flag
        return nbSent;
 }
 
+int SocketEngine::WriteV(EventHandler* fd, const IOVector* iovec, int count)
+{
+       int sent = writev(fd->GetFd(), iovec, count);
+       if (sent > 0)
+               stats.Update(0, sent);
+       return sent;
+}
+
+#ifdef _WIN32
+int SocketEngine::WriteV(EventHandler* fd, const iovec* iovec, int count)
+{
+       // On Windows the fields in iovec are not in the order required by the Winsock API; IOVector has
+       // the fields in the correct order.
+       // Create temporary IOVectors from the iovecs and pass them to the WriteV() method that accepts the
+       // platform's native struct.
+       IOVector wiovec[128];
+       count = std::min(count, static_cast<int>(sizeof(wiovec) / sizeof(IOVector)));
+
+       for (int i = 0; i < count; i++)
+       {
+               wiovec[i].iov_len = iovec[i].iov_len;
+               wiovec[i].iov_base = reinterpret_cast<char*>(iovec[i].iov_base);
+       }
+       return WriteV(fd, wiovec, count);
+}
+#endif
+
 int SocketEngine::Connect(EventHandler* fd, const sockaddr *serv_addr, socklen_t addrlen)
 {
        int ret = connect(fd->GetFd(), serv_addr, addrlen);