#include "cupsd.h"
void
PauseListening(void)
{
int i;
listener_t *lis;
if (!FD_ISSET(Listeners[0].fd, &InputSet))
return;
if (NumClients == MaxClients)
LogMessage(L_WARN, "Max clients reached, holding new connections...");
LogMessage(L_DEBUG, "PauseListening: clearing input bits...");
for (i = NumListeners, lis = Listeners; i > 0; i --, lis ++)
{
LogMessage(L_DEBUG2, "PauseListening: Removing fd %d from InputSet...",
lis->fd);
FD_CLR(lis->fd, &InputSet);
}
}
void
ResumeListening(void)
{
int i;
listener_t *lis;
if (FD_ISSET(Listeners[0].fd, &InputSet))
return;
if (NumClients >= (MaxClients - 1))
LogMessage(L_WARN, "Resuming new connection processing...");
LogMessage(L_DEBUG, "ResumeListening: setting input bits...");
for (i = NumListeners, lis = Listeners; i > 0; i --, lis ++)
{
LogMessage(L_DEBUG2, "ResumeListening: Adding fd %d to InputSet...",
lis->fd);
FD_SET(lis->fd, &InputSet);
}
}
void
StartListening(void)
{
int i,
val;
listener_t *lis;
struct hostent *host;
LogMessage(L_DEBUG, "StartListening: NumListeners=%d", NumListeners);
memset(&ServerAddr, 0, sizeof(ServerAddr));
if ((host = httpGetHostByName(ServerName)) != NULL)
{
memcpy((char *)&(ServerAddr.sin_addr), host->h_addr, host->h_length);
ServerAddr.sin_family = host->h_addrtype;
}
else
{
LogMessage(L_ERROR, "StartListening: Unable to find IP address for server name \"%s\"!\n",
ServerName);
ServerAddr.sin_family = AF_INET;
}
for (i = NumListeners, lis = Listeners; i > 0; i --, lis ++)
{
LogMessage(L_DEBUG, "StartListening: address=%08x port=%d",
ntohl(lis->address.sin_addr.s_addr),
ntohs(lis->address.sin_port));
if ((lis->fd = socket(AF_INET, SOCK_STREAM, 0)) == -1)
{
LogMessage(L_ERROR, "StartListening: Unable to open listen socket - %s.",
strerror(errno));
exit(errno);
}
fcntl(lis->fd, F_SETFD, fcntl(lis->fd, F_GETFD) | FD_CLOEXEC);
val = 1;
#ifdef __sun
setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, (char *)&val, sizeof(val));
#else
setsockopt(lis->fd, SOL_SOCKET, SO_REUSEADDR, &val, sizeof(val));
#endif
if (bind(lis->fd, (struct sockaddr *)&(lis->address), sizeof(lis->address)) < 0)
{
LogMessage(L_ERROR, "StartListening: Unable to bind socket - %s.", strerror(errno));
exit(errno);
}
if (listen(lis->fd, ListenBackLog) < 0)
{
LogMessage(L_ERROR, "StartListening: Unable to listen for clients - %s.",
strerror(errno));
exit(errno);
}
}
ResumeListening();
}
void
StopListening(void)
{
int i;
listener_t *lis;
LogMessage(L_DEBUG, "StopListening: closing all listen sockets.");
PauseListening();
for (i = NumListeners, lis = Listeners; i > 0; i --, lis ++)
#ifdef WIN32
closesocket(lis->fd);
#else
close(lis->fd);
#endif
}