]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - scheduler/listen.c
Merge changes from 1.1.x into 1.2 devel.
[thirdparty/cups.git] / scheduler / listen.c
index edbe3c1af490d79c93d9abbef6b2c186529faeff..3b565bf35b9a28fcb5a72d84ea32c167ccbb9a5a 100644 (file)
@@ -1,10 +1,10 @@
 /*
- * "$Id: listen.c,v 1.1 1999/06/18 16:43:02 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
@@ -15,7 +15,7 @@
  *
  *       Attn: CUPS Licensing Information
  *       Easy Software Products
- *       44145 Airport View Drive, Suite 204
+ *       44141 Airport View Drive, Suite 204
  *       Hollywood, Maryland 20636-3111 USA
  *
  *       Voice: (301) 373-9603
  *
  * 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...
  */
@@ -45,7 +95,37 @@ StartListening(void)
   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...
@@ -53,13 +133,20 @@ StartListening(void)
 
   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);
     }
@@ -83,7 +170,8 @@ StartListening(void)
 
     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);
     }
 
@@ -91,22 +179,15 @@ StartListening(void)
     * 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();
 }
 
 
@@ -121,22 +202,19 @@ StopListening(void)
   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.1 1999/06/18 16:43:02 mike Exp $".
+ * End of "$Id: listen.c,v 1.9.2.2 2001/12/26 16:52:54 mike Exp $".
  */