- ServerInstance->Log(DEBUG,"Handle %s event on fd %d",ref[events[j].data.fd]->Readable() ? "read" : "write", ref[events[j].data.fd]->GetFd());
- ref[events[j].data.fd]->HandleEvent(ref[events[j].data.fd]->Readable() ? EVENT_READ : EVENT_WRITE);
+ if (events[j].events & EPOLLHUP)
+ {
+ if (ref[events[j].data.fd])
+ ref[events[j].data.fd]->HandleEvent(EVENT_ERROR, 0);
+ continue;
+ }
+ if (events[j].events & EPOLLERR)
+ {
+ /* Get error number */
+ if (getsockopt(events[j].data.fd, SOL_SOCKET, SO_ERROR, &errcode, &codesize) < 0)
+ errcode = errno;
+ if (ref[events[j].data.fd])
+ ref[events[j].data.fd]->HandleEvent(EVENT_ERROR, errcode);
+ continue;
+ }
+ if (events[j].events & EPOLLOUT)
+ {
+ struct epoll_event ev;
+ memset(&ev,0,sizeof(struct epoll_event));
+ ev.events = EPOLLIN;
+ ev.data.fd = events[j].data.fd;
+ epoll_ctl(EngineHandle, EPOLL_CTL_MOD, events[j].data.fd, &ev);
+ if (ref[events[j].data.fd])
+ ref[events[j].data.fd]->HandleEvent(EVENT_WRITE);
+ }
+ else
+ {
+ if (ref[events[j].data.fd])
+ ref[events[j].data.fd]->HandleEvent(EVENT_READ);
+ }