/*
- * "$Id: listen.c,v 1.2 1999/06/18 18:36:48 mike Exp $"
+ * "$Id: listen.c,v 1.9.2.2 2001/12/26 16:52:54 mike Exp $"
*
* Server listening routines for the Common UNIX Printing System (CUPS)
* scheduler.
*
- * Copyright 1997-1999 by Easy Software Products, all rights reserved.
+ * Copyright 1997-2001 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
* property of Easy Software Products and are protected by Federal
*
* Contents:
*
- * StartListening() - Create all listening sockets...
- * StopListening() - Close all listening sockets...
+ * PauseListening() - Clear input polling on all listening sockets...
+ * ResumeListening() - Set input polling on all listening sockets...
+ * StartListening() - Create all listening sockets...
+ * StopListening() - Close all listening sockets...
*/
/*
#include "cupsd.h"
+/*
+ * 'PauseListening()' - Clear input polling on all listening sockets...
+ */
+
+void
+PauseListening(void)
+{
+ int i; /* Looping var */
+ listener_t *lis; /* Current listening socket */
+
+
+ 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 ++)
+ FD_CLR(lis->fd, &InputSet);
+}
+
+
+/*
+ * 'ResumeListening()' - Set input polling on all listening sockets...
+ */
+
+void
+ResumeListening(void)
+{
+ int i; /* Looping var */
+ listener_t *lis; /* Current listening socket */
+
+
+ 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 ++)
+ FD_SET(lis->fd, &InputSet);
+}
+
+
/*
* 'StartListening()' - Create all listening sockets...
*/
int i, /* Looping var */
val; /* Parameter value */
listener_t *lis; /* Current listening socket */
+ struct hostent *host; /* Host entry for server address */
+ char s[256]; /* String addresss */
+
+
+ LogMessage(L_DEBUG, "StartListening: NumListeners=%d", NumListeners);
+
+ /*
+ * Get the server's IP address...
+ */
+
+ memset(&ServerAddr, 0, sizeof(ServerAddr));
+
+ if ((host = httpGetHostByName(ServerName)) != NULL)
+ {
+ /*
+ * Found the server's address!
+ */
+
+ httpAddrLoad(host, 0, 0, &ServerAddr);
+ }
+ else
+ {
+ /*
+ * Didn't find it! Use an address of 0...
+ */
+ LogMessage(L_ERROR, "StartListening: Unable to find IP address for server name \"%s\"!\n",
+ ServerName);
+
+ ServerAddr.ipv4.sin_family = AF_INET;
+ }
/*
* Setup socket listeners...
for (i = NumListeners, lis = Listeners; i > 0; i --, lis ++)
{
- LogMessage(LOG_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)
+ httpAddrString(&(lis->address), s, sizeof(s));
+
+#ifdef AF_INET6
+ if (lis->address.addr.sa_family == AF_INET6)
+ LogMessage(L_DEBUG, "StartListening: address=%s port=%d (IPv6)", s,
+ ntohs(lis->address.ipv6.sin6_port));
+ else
+#endif /* AF_INET6 */
+ LogMessage(L_DEBUG, "StartListening: address=%s port=%d", s,
+ ntohs(lis->address.ipv4.sin_port));
+
+ if ((lis->fd = socket(lis->address.addr.sa_family, SOCK_STREAM, 0)) == -1)
{
- LogMessage(LOG_ERROR, "StartListening() Unable to open listen socket - %s.",
+ LogMessage(L_ERROR, "StartListening: Unable to open listen socket - %s.",
strerror(errno));
exit(errno);
}
if (bind(lis->fd, (struct sockaddr *)&(lis->address), sizeof(lis->address)) < 0)
{
- LogMessage(LOG_ERROR, "StartListening() Unable to bind socket - %s.", strerror(errno));
+ LogMessage(L_ERROR, "StartListening: Unable to bind socket - %s.",
+ strerror(errno));
exit(errno);
}
* Listen for new clients.
*/
- if (listen(lis->fd, SOMAXCONN) < 0)
+ if (listen(lis->fd, ListenBackLog) < 0)
{
- LogMessage(LOG_ERROR, "StartListening() Unable to listen for clients - %s.",
+ LogMessage(L_ERROR, "StartListening: Unable to listen for clients - %s.",
strerror(errno));
exit(errno);
}
-
- /*
- * Setup the select() input mask to contain the listening socket we have.
- */
-
- DEBUG_printf(("StartListening: Adding fd %d to InputSet...\n", lis->fd));
- FD_SET(lis->fd, &InputSet);
}
- LogMessage(LOG_DEBUG, "StartListening() NumListeners=%d", NumListeners);
+ ResumeListening();
}
listener_t *lis; /* Current listening socket */
+ LogMessage(L_DEBUG, "StopListening: closing all listen sockets.");
+
+ PauseListening();
+
for (i = NumListeners, lis = Listeners; i > 0; i --, lis ++)
- {
#if defined(WIN32) || defined(__EMX__)
closesocket(lis->fd);
#else
close(lis->fd);
#endif /* WIN32 || __EMX__ */
-
- DEBUG_printf(("StopListening: Removing fd %d from InputSet...\n", lis->fd));
- FD_CLR(lis->fd, &InputSet);
- }
-
- LogMessage(LOG_DEBUG, "StopListening()");
}
/*
- * End of "$Id: listen.c,v 1.2 1999/06/18 18:36:48 mike Exp $".
+ * End of "$Id: listen.c,v 1.9.2.2 2001/12/26 16:52:54 mike Exp $".
*/