]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - cups/http-addrlist.c
Some more localization fixes and simplifications.
[thirdparty/cups.git] / cups / http-addrlist.c
index e9ef53ea43e91c6d8c388c00e3d9a0cd4d535dba..5d510140b91a0b1b90135b2cc5b38dca2b8198a6 100644 (file)
@@ -1,16 +1,10 @@
 /*
  * HTTP address list routines for CUPS.
  *
- * Copyright 2007-2016 by Apple Inc.
+ * Copyright 2007-2017 by Apple Inc.
  * Copyright 1997-2007 by Easy Software Products, all rights reserved.
  *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file.  If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
- *
- * This file is subject to the Apple OS-Developed Software exception.
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more information.
  */
 
 /*
@@ -32,7 +26,7 @@
 /*
  * 'httpAddrConnect()' - Connect to any of the addresses in the list.
  *
- * @since CUPS 1.2/macOS 10.5@
+ * @since CUPS 1.2/macOS 10.5@ @exclude all@
  */
 
 http_addrlist_t *                      /* O - Connected address or NULL on failure */
@@ -65,7 +59,7 @@ httpAddrConnect2(
   int                  flags;          /* Socket flags */
 #endif /* !WIN32 */
   int                  remaining;      /* Remaining timeout */
-  int                  i,              /* Looping var */
+  int                  i, j,           /* Looping vars */
                        nfds,           /* Number of file descriptors */
                        fds[100],       /* Socket file descriptors */
                        result;         /* Result from select() or poll() */
@@ -312,7 +306,7 @@ httpAddrConnect2(
        DEBUG_printf(("pfds[%d].revents=%x\n", i, pfds[i].revents));
        if (pfds[i].revents && !(pfds[i].revents & (POLLERR | POLLHUP)))
 #  else
-       if (FD_ISSET(fds[i], &input) && !FD_ISSET(fds[i], &error))
+       if (FD_ISSET(fds[i], &input_set) && !FD_ISSET(fds[i], &error_set))
 #  endif /* HAVE_POLL */
        {
          *sock    = fds[i];
@@ -323,11 +317,13 @@ httpAddrConnect2(
          if (!getpeername(fds[i], (struct sockaddr *)&peer, &len))
            DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...", httpAddrString(&peer, temp, sizeof(temp)), httpAddrPort(&peer)));
 #  endif /* DEBUG */
+
+          break;
        }
 #  ifdef HAVE_POLL
        else if (pfds[i].revents & (POLLERR | POLLHUP))
 #  else
-       else if (FD_ISSET(fds[i], &error))
+       else if (FD_ISSET(fds[i], &error_set))
 #  endif /* HAVE_POLL */
         {
          /*
@@ -346,7 +342,20 @@ httpAddrConnect2(
       }
 
       if (connaddr)
+      {
+       /*
+        * Connected on one address, close all of the other sockets we have so
+        * far and return...
+        */
+
+        for (j = 0; j < i; j ++)
+          httpAddrClose(NULL, fds[j]);
+
+        for (j ++; j < nfds; j ++)
+          httpAddrClose(NULL, fds[j]);
+
         return (connaddr);
+      }
     }
 #endif /* O_NONBLOCK */