- if (!(numberactive = SE->Wait(activefds)))
- return;
-
- /**
- * Now process each of the fd's. For users, we have a fast
- * lookup table which can find a user by file descriptor, so
- * processing them by fd isnt expensive. If we have a lot of
- * listening ports or module sockets though, things could get
- * ugly.
- */
- this->Log(DEBUG,"There are %d fd's to process.",numberactive);
-
- for (unsigned int activefd = 0; activefd < numberactive; activefd++)
- {
- int socket_type = SE->GetType(activefds[activefd]);
- switch (socket_type)
- {
- case X_ESTAB_CLIENT:
-
- this->Log(DEBUG,"Type: X_ESTAB_CLIENT: fd=%d",activefds[activefd]);
- cu = this->fd_ref_table[activefds[activefd]];
- if (cu)
- this->ProcessUser(cu);
-
- break;
-
- case X_ESTAB_MODULE:
-
- this->Log(DEBUG,"Type: X_ESTAB_MODULE: fd=%d",activefds[activefd]);
-
- if (!process_module_sockets)
- break;
-
- /* Process module-owned sockets.
- * Modules are encouraged to inherit their sockets from
- * InspSocket so we can process them neatly like this.
- */
- s = this->socket_ref[activefds[activefd]];
-
- if ((s) && (!s->Poll()))
- {
- this->Log(DEBUG,"Socket poll returned false, close and bail");
- SE->DelFd(s->GetFd());
- this->socket_ref[activefds[activefd]] = NULL;
- for (std::vector<InspSocket*>::iterator a = module_sockets.begin(); a < module_sockets.end(); a++)
- {
- s_del = *a;
- if ((s_del) && (s_del->GetFd() == activefds[activefd]))
- {
- module_sockets.erase(a);
- break;
- }
- }
- s->Close();
- DELETE(s);
- }
- else if (!s)
- {
- this->Log(DEBUG,"WTF, X_ESTAB_MODULE for nonexistent InspSocket, removed!");
- SE->DelFd(s->GetFd());
- }
- break;
-
- case X_ESTAB_DNS:
- /* Handles instances of the Resolver class,
- * a simple class extended by modules and the core for
- * nonblocking resolving of addresses.
- */
- this->Res->MarshallReads(activefds[activefd]);
- break;
-
- case X_LISTEN:
-
- this->Log(DEBUG,"Type: X_LISTEN: fd=%d",activefds[activefd]);
-
- /* It's a listener */
- uslen = sizeof(sock_us);
- length = sizeof(client);
- incomingSockfd = accept (activefds[activefd],(struct sockaddr*)&client,&length);
-
- if ((incomingSockfd > -1) && (!getsockname(incomingSockfd,(sockaddr*)&sock_us,&uslen)))
- {
-#ifdef IPV6
- in_port = ntohs(sock_us.sin6_port);
-#else
- in_port = ntohs(sock_us.sin_port);
-#endif
- this->Log(DEBUG,"Accepted socket %d",incomingSockfd);
- /* Years and years ago, we used to resolve here
- * using gethostbyaddr(). That is sucky and we
- * don't do that any more...
- */
- NonBlocking(incomingSockfd);
- if (Config->GetIOHook(in_port))
- {
- try
- {
-#ifdef IPV6
- Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, insp_ntoa(client.sin6_addr), in_port);
-#else
- Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, insp_ntoa(client.sin_addr), in_port);
-#endif
- }
- catch (ModuleException& modexcept)
- {
- this->Log(DEBUG,"Module exception cought: %s",modexcept.GetReason());
- }
- }
- stats->statsAccept++;
-#ifdef IPV6
- this->Log(DEBUG,"Add ipv6 client");
- userrec::AddClient(this, incomingSockfd, in_port, false, client.sin6_addr);
-#else
- this->Log(DEBUG,"Add ipv4 client");
- userrec::AddClient(this, incomingSockfd, in_port, false, client.sin_addr);
-#endif
- this->Log(DEBUG,"Adding client on port %d fd=%d",in_port,incomingSockfd);
- }
- else
- {
- this->Log(DEBUG,"Accept failed on fd %d: %s",incomingSockfd,strerror(errno));
- shutdown(incomingSockfd,2);
- close(incomingSockfd);
- stats->statsRefused++;
- }
- break;
-
- default:
- /* Something went wrong if we're in here.
- * In fact, so wrong, im not quite sure
- * what we would do, so for now, its going
- * to safely do bugger all.
- */
- this->Log(DEBUG,"Type: X_WHAT_THE_FUCK_BBQ: fd=%d",activefds[activefd]);
- SE->DelFd(activefds[activefd]);
- break;
- }
- }