- case X_ESTAB_CLIENT:
-
- log(DEBUG,"Type: X_ESTAB_CLIENT: fd=%d",activefds[activefd]);
- cu = fd_ref_table[activefds[activefd]];
- if (cu)
- ProcessUser(cu);
-
- break;
-
- case X_ESTAB_MODULE:
-
- 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 = socket_ref[activefds[activefd]];
-
- if ((s) && (!s->Poll()))
- {
- log(DEBUG,"inspircd.cpp: Socket poll returned false, close and bail");
- SE->DelFd(s->GetFd());
- socket_ref[activefds[activefd]] = NULL;
- for (std::vector<InspSocket*>::iterator a = module_sockets.begin(); a < module_sockets.end(); a++)
- {
- s_del = (InspSocket*)*a;
- if ((s_del) && (s_del->GetFd() == activefds[activefd]))
- {
- module_sockets.erase(a);
- break;
- }
- }
- s->Close();
- DELETE(s);
- }
- else if (!s)
- {
- log(DEBUG,"WTF, X_ESTAB_MODULE for nonexistent InspSocket, removed!");
- SE->DelFd(s->GetFd());
- }
- break;
-
- case X_ESTAB_DNS:
- /* When we are using single-threaded dns,
- * the sockets for dns end up in our mainloop.
- * When we are using multi-threaded dns,
- * each thread has its own basic poll() loop
- * within it, making them 'fire and forget'
- * and independent of the mainloop.
- */
-#ifndef THREADED_DNS
- log(DEBUG,"Type: X_ESTAB_DNS: fd=%d",activefds[activefd]);
- dns_poll(activefds[activefd]);
-#endif
- break;
-
- case X_LISTEN:
-
- log(DEBUG,"Type: X_LISTEN_MODULE: 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)))
- {
- in_port = ntohs(sock_us.sin_port);
- 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
- {
- Config->GetIOHook(in_port)->OnRawSocketAccept(incomingSockfd, (char*)inet_ntoa(client.sin_addr), in_port);
- }
- catch (ModuleException& modexcept)
- {
- log(DEBUG,"Module exception cought: %s",modexcept.GetReason());
- }
- }
- stats->statsAccept++;
- AddClient(incomingSockfd, in_port, false, client.sin_addr);
- log(DEBUG,"Adding client on port %lu fd=%lu",(unsigned long)in_port,(unsigned long)incomingSockfd);
- }
- else
- {
- log(DEBUG,"Accept failed on fd %lu: %s",(unsigned long)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.
- */
- log(DEBUG,"Type: X_WHAT_THE_FUCK_BBQ: fd=%d",activefds[activefd]);
- SE->DelFd(activefds[activefd]);
- break;