| Return Type | Function name | Arguments |
|---|---|---|
| hzEcode | hzIpServer::ProxyTo | (hzIpConnex*,unsigned int,) |
Declared in file: hzIpServer.h
Defined in file : hzIpServer.cpp
Function Logic:
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 ;
}