Return TypeFunction nameArguments
hzEcodehzIpServer::ProxyTo(hzIpConnex*,unsigned int,)

Declared in file: hzIpServer.h
Defined in file : hzIpServer.cpp

Function Logic:

0:START 1:!pConn 2:Return hzerr(E_ARGUMENT,No connection) 3:pConn->m_pProxy 4:pExt 5:hostname gethostbyname pHost 6:!(pHost=gethostbyname(*hostname)) 7:Return E_HOSTFAIL 8:memset svrAddr memcpy htons svrAddr 9:(nSock=socket(AF_INET,SOCK_STREAM,0))<0 10:Return hzerr(E_NOSOCKET,Could not create socket (returns %d, errno %d),nSock,errno) 11:connect(nSock,(structsockaddr*)&svrAddr,sizeof(svrAddr))<0 12:Return hzerr(E_HOSTFAIL,Could not connect to %s on port %d (errno=%d),*hostname,nPort,errno) 13:hzIpServer::_nonblock rc 14:rc!=E_OK 15:Return rc 16:tv tv 17:setsockopt(nSock,SOL_SOCKET,SO_RCVTIMEO,&tv,sizeof(tv))<0 18:Return E_HOSTFAIL 19:epEventNew epEventNew 20:epoll_ctl(s_epollSocket,EPOLL_CTL_ADD,nSock,&epEventNew)<0 21:hzIpConnex::CliPort strerror hzLogger::Log 22:close(nSock)<0 23:hzLogger::Log 24:m_bShutdown 25:Return E_HOSTFAIL 26:pConn pExt pExt currCC hzIpConnex::SetSocket hzIpConnex::Oxygen hzXDate::SysDateTime hzXDate::Txt hzIpConnex::CliPort hzIpConnex::CliSocket hzIpConnex::CliPort hzLogger::Log 27:hzIpConnex::InputZone hzIpConnex::SendData hzIpConnex::InputZone hzChain::Clear 28:Return E_OK

Function body:

hzEcode hzIpServer::ProxyTo (hzIpConnex* pConn, unsigned int nPort)
{
   _hzfunc("hzIpServer::ProxyTo") ;
   SOCKADDRIN          svrAddr ;
   HOSTENT*            pHost ;
   struct epoll_event  epEventNew ;
   struct timeval      tv ;
   hzIpConnex*         pExt ;
   hzXDate             now ;
   hzString            hostname ;
   int32_t             nSock ;
   hzEcode             rc ;
   if (!pConn)
       return hzerr(E_ARGUMENT, "No connection") ;
   if (pConn->m_pProxy)
       pExt = pConn->m_pProxy ;
   else
   {
       hostname = "127.0.0.1" ;
       if (!(pHost = gethostbyname(*hostname)))
       {
           threadLog("Unknown Host [%s]\n", *hostname) ;
           return E_HOSTFAIL ;
       }
       memset(&svrAddr, 0,sizeof(svrAddr)) ;
       svrAddr.sin_family = AF_INET ;
       memcpy(&svrAddr.sin_addr, pHost->h_addr, pHost->h_length) ;
       svrAddr.sin_port = htons(nPort) ;
       if ((nSock = socket(AF_INET, SOCK_STREAM, 0))< 0)
           return hzerr(E_NOSOCKET, "Could not create socket (returns %d, errno %d)", nSock, errno) ;
       if (connect(nSock, (struct sockaddr *) &svrAddr, sizeof(svrAddr)) < 0)
           return hzerr(E_HOSTFAIL, "Could not connect to %s on port %d (errno=%d)", *hostname, nPort, errno) ;
       rc = _nonblock(nSock) ;
       if (rc != E_OK)
           return rc ;
       tv.tv_sec = 10;
       tv.tv_usec = 0;
       if (setsockopt(nSock, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0)
           return E_HOSTFAIL ;
       epEventNew.data.fd = nSock ;
       epEventNew.events = EPOLLIN | EPOLLOUT ;
       if (epoll_ctl(s_epollSocket, EPOLL_CTL_ADD, nSock, &epEventNew) < 0)
       {
           m_pLog->Log("Loop %u: EPOLL ERROR: Could not add client connection handler on sock %d/%d. Error=%s\n", m_nLoop, nSock, pConn->CliPort(), strerror(errno)) ;
           if (close(nSock) < 0)
               m_pLog->Log("NOTE: Could not close socket %d after memory allocation failure. errno=%d\n", nSock, errno) ;
           m_bShutdown = true ;
           return E_HOSTFAIL ;
       }
       pExt = pConn->m_pProxy = new hzIpConnex(m_pLog) ;
       pExt->m_pProxy = pConn ;
       currCC[nSock] = pExt ;
       pExt->SetSocket(nSock) ;
       pExt->Oxygen() ;
       now.SysDateTime() ;
       m_pLog->Log("%s: Loop %u: NEW Proxy on socket %d/%d from %d:%d\n", now.Txt(FMT_TIME_USEC), m_nLoop, nSock, pExt->CliPort(), pConn->CliSocket(), pConn->CliPort()) ;
   }
   pExt->SendData(pConn->InputZone()) ;
   pConn->InputZone().Clear() ;
   return E_OK ;
}