125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * HTTP address list routines for CUPS.
325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
4985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann * Copyright 2007-2017 by Apple Inc.
525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 1997-2007 by Easy Software Products, all rights reserved.
625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * These coded instructions, statements, and computer programs are the
825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * property of Apple Inc. and are protected by Federal copyright
925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
1025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * which should have been included with this file.  If this file is
112447373f182dbfeb47fb86c0f5a6ac5773c65ac2Philip P. Moltmann * missing or damaged, see the license at "http://www.cups.org/".
1225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
1325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This file is subject to the Apple OS-Developed Software exception.
1425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
1525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
1625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
1725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Include necessary headers...
1825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
1925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
2025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#include "cups-private.h"
2125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_RESOLV_H
2225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  include <resolv.h>
2325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_RESOLV_H */
2425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_POLL
2525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  include <poll.h>
2625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_POLL */
2725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifndef WIN32
2825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  include <fcntl.h>
2925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */
3025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
3325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'httpAddrConnect()' - Connect to any of the addresses in the list.
3425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
35985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann * @since CUPS 1.2/macOS 10.5@ @exclude all@
3625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
3725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
3825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannhttp_addrlist_t *			/* O - Connected address or NULL on failure */
3925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannhttpAddrConnect(
4025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    http_addrlist_t *addrlist,		/* I - List of potential addresses */
4125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int             *sock)		/* O - Socket */
4225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
4325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("httpAddrConnect(addrlist=%p, sock=%p)", (void *)addrlist, (void *)sock));
4425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (httpAddrConnect2(addrlist, sock, 30000, NULL));
4625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
4725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
4925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
5025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'httpAddrConnect2()' - Connect to any of the addresses in the list with a
5125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *                        timeout and optional cancel.
5225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
5325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.7/macOS 10.9@
5425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
5525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
5625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannhttp_addrlist_t *			/* O - Connected address or NULL on failure */
5725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannhttpAddrConnect2(
5825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    http_addrlist_t *addrlist,		/* I - List of potential addresses */
5925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int             *sock,		/* O - Socket */
6025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int             msec,		/* I - Timeout in milliseconds */
6125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int             *cancel)		/* I - Pointer to "cancel" variable */
6225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
6325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int			val;		/* Socket option value */
6425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifndef WIN32
6525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int			flags;		/* Socket flags */
6625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* !WIN32 */
6725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int			remaining;	/* Remaining timeout */
68985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann  int			i, j,		/* Looping vars */
6925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			nfds,		/* Number of file descriptors */
7025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			fds[100],	/* Socket file descriptors */
7125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			result;		/* Result from select() or poll() */
7225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  http_addrlist_t	*addrs[100];	/* Addresses */
7325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifndef HAVE_POLL
7425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  int			max_fd = -1;	/* Highest file descriptor */
7525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* !HAVE_POLL */
7625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef O_NONBLOCK
7725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  ifdef HAVE_POLL
7825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  struct pollfd		pfds[100];	/* Polled file descriptors */
7925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  else
8025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  fd_set		input_set,	/* select() input set */
8125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			output_set,	/* select() output set */
8225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			error_set;	/* select() error set */
8325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  struct timeval	timeout;	/* Timeout */
8425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  endif /* HAVE_POLL */
8525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* O_NONBLOCK */
8625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG
8725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  socklen_t		len;		/* Length of value */
8825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  http_addr_t		peer;		/* Peer address */
8925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  char			temp[256];	/* Temporary address string */
9025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */
9125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  DEBUG_printf(("httpAddrConnect2(addrlist=%p, sock=%p, msec=%d, cancel=%p)", (void *)addrlist, (void *)sock, msec, (void *)cancel));
9425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
9525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!sock)
9625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
9725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    errno = EINVAL;
9825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
9925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
10025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
10125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
10225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (cancel && *cancel)
10325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    return (NULL);
10425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
10525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (msec <= 0)
10625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    msec = INT_MAX;
10725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
10825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
10925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Loop through each address until we connect or run out of addresses...
11025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
11125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  nfds      = 0;
11325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  remaining = msec;
11425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
11525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  while (remaining > 0)
11625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
11725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (cancel && *cancel)
11825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
11925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      while (nfds > 0)
12025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
12125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        nfds --;
12225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	httpAddrClose(NULL, fds[nfds]);
12325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
12425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
12525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      return (NULL);
12625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
12725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
12825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (addrlist && nfds < (int)(sizeof(fds) / sizeof(fds[0])))
12925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
13025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
13125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Create the socket...
13225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
13325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
13425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      DEBUG_printf(("2httpAddrConnect2: Trying %s:%d...", httpAddrString(&(addrlist->addr), temp, sizeof(temp)), httpAddrPort(&(addrlist->addr))));
13525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
13625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if ((fds[nfds] = (int)socket(httpAddrFamily(&(addrlist->addr)), SOCK_STREAM, 0)) < 0)
13725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
13825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
13925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* Don't abort yet, as this could just be an issue with the local
14025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* system not being configured with IPv4/IPv6/domain socket enabled.
14125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*
14225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* Just skip this address...
14325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
14425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        addrlist = addrlist->next;
14625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	continue;
14725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
14825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
14925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
15025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Set options...
15125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
15225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      val = 1;
15425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      setsockopt(fds[nfds], SOL_SOCKET, SO_REUSEADDR, CUPS_SOCAST &val, sizeof(val));
15525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
15625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef SO_REUSEPORT
15725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      val = 1;
15825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      setsockopt(fds[nfds], SOL_SOCKET, SO_REUSEPORT, CUPS_SOCAST &val, sizeof(val));
15925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* SO_REUSEPORT */
16025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
16125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef SO_NOSIGPIPE
16225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      val = 1;
16325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      setsockopt(fds[nfds], SOL_SOCKET, SO_NOSIGPIPE, CUPS_SOCAST &val, sizeof(val));
16425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* SO_NOSIGPIPE */
16525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
16625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
16725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Using TCP_NODELAY improves responsiveness, especially on systems
16825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * with a slow loopback interface...
16925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
17025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
17125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      val = 1;
17225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      setsockopt(fds[nfds], IPPROTO_TCP, TCP_NODELAY, CUPS_SOCAST &val, sizeof(val));
17325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
17425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef FD_CLOEXEC
17525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
17625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Close this socket when starting another process...
17725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
17825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
17925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      fcntl(fds[nfds], F_SETFD, FD_CLOEXEC);
18025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* FD_CLOEXEC */
18125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
18225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef O_NONBLOCK
18325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
18425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Do an asynchronous connect by setting the socket non-blocking...
18525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
18625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
18725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      DEBUG_printf(("httpAddrConnect2: Setting non-blocking connect()"));
18825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
18925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      flags = fcntl(fds[nfds], F_GETFL, 0);
19025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      fcntl(fds[nfds], F_SETFL, flags | O_NONBLOCK);
19125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* O_NONBLOCK */
19225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
19325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
19425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Then connect...
19525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
19625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
19725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (!connect(fds[nfds], &(addrlist->addr.addr), (socklen_t)httpAddrLength(&(addrlist->addr))))
19825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
19925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...", httpAddrString(&(addrlist->addr), temp, sizeof(temp)), httpAddrPort(&(addrlist->addr))));
20025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef O_NONBLOCK
20225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	fcntl(fds[nfds], F_SETFL, flags);
20325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* O_NONBLOCK */
20425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*sock = fds[nfds];
20625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
20725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	while (nfds > 0)
20825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
20925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  nfds --;
21025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  httpAddrClose(NULL, fds[nfds]);
21125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
21225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
21325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	return (addrlist);
21425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
21525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
21625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32
21725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (WSAGetLastError() != WSAEINPROGRESS && WSAGetLastError() != WSAEWOULDBLOCK)
21825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else
21925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (errno != EINPROGRESS && errno != EWOULDBLOCK)
22025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */
22125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
22225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	DEBUG_printf(("1httpAddrConnect2: Unable to connect to %s:%d: %s", httpAddrString(&(addrlist->addr), temp, sizeof(temp)), httpAddrPort(&(addrlist->addr)), strerror(errno)));
22325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	httpAddrClose(NULL, fds[nfds]);
22425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	addrlist = addrlist->next;
22525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	continue;
22625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
22725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
22825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifndef WIN32
22925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      fcntl(fds[nfds], F_SETFL, flags);
23025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* !WIN32 */
23125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifndef HAVE_POLL
23325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (fds[nfds] > max_fd)
23425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	max_fd = fds[nfds];
23525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* !HAVE_POLL */
23625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
23725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      addrs[nfds] = addrlist;
23825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      nfds ++;
23925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      addrlist = addrlist->next;
24025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
24125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (!addrlist && nfds == 0)
24325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      break;
24425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
24625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * See if we can connect to any of the addresses so far...
24725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
24825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
24925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef O_NONBLOCK
25025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    DEBUG_puts("1httpAddrConnect2: Finishing async connect()");
25125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
25225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    do
25325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
25425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (cancel && *cancel)
25525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
25625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
25725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* Close this socket and return...
25825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
25925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	DEBUG_puts("1httpAddrConnect2: Canceled connect()");
26125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	while (nfds > 0)
26325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
26425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  nfds --;
26525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  httpAddrClose(NULL, fds[nfds]);
26625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
26725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
26825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*sock = -1;
26925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
27025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	return (NULL);
27125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
27225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
27325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  ifdef HAVE_POLL
27425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      for (i = 0; i < nfds; i ++)
27525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
27625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	pfds[i].fd     = fds[i];
27725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	pfds[i].events = POLLIN | POLLOUT;
27825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
27925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
28025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      result = poll(pfds, (nfds_t)nfds, addrlist ? 100 : remaining > 250 ? 250 : remaining);
28125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
28225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      DEBUG_printf(("1httpAddrConnect2: poll() returned %d (%d)", result, errno));
28325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
28425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  else
28525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      FD_ZERO(&input_set);
28625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      for (i = 0; i < nfds; i ++)
28725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	FD_SET(fds[i], &input_set);
28825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      output_set = input_set;
28925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      error_set  = input_set;
29025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
29125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      timeout.tv_sec  = 0;
29225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      timeout.tv_usec = (addrlist ? 100 : remaining > 250 ? 250 : remaining) * 1000;
29325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
29425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      result = select(max_fd + 1, &input_set, &output_set, &error_set, &timeout);
29525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
29625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      DEBUG_printf(("1httpAddrConnect2: select() returned %d (%d)", result, errno));
29725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  endif /* HAVE_POLL */
29825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
29925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  ifdef WIN32
30025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    while (result < 0 && (WSAGetLastError() == WSAEINTR || WSAGetLastError() == WSAEWOULDBLOCK));
30125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  else
30225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    while (result < 0 && (errno == EINTR || errno == EAGAIN));
30325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  endif /* WIN32 */
30425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
30525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (result > 0)
30625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
307bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann      http_addrlist_t *connaddr = NULL;	/* Connected address, if any */
308bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann
30925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      for (i = 0; i < nfds; i ++)
31025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
31125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  ifdef HAVE_POLL
31225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	DEBUG_printf(("pfds[%d].revents=%x\n", i, pfds[i].revents));
31325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if (pfds[i].revents && !(pfds[i].revents & (POLLERR | POLLHUP)))
31425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  else
3152447373f182dbfeb47fb86c0f5a6ac5773c65ac2Philip P. Moltmann	if (FD_ISSET(fds[i], &input_set) && !FD_ISSET(fds[i], &error_set))
31625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  endif /* HAVE_POLL */
31725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
31825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  *sock    = fds[i];
319bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann	  connaddr = addrs[i];
32025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
32125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  ifdef DEBUG
32225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  len   = sizeof(peer);
32325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (!getpeername(fds[i], (struct sockaddr *)&peer, &len))
32425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...", httpAddrString(&peer, temp, sizeof(temp)), httpAddrPort(&peer)));
32525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  endif /* DEBUG */
326985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann
327985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann          break;
32825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
329bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann#  ifdef HAVE_POLL
330bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann	else if (pfds[i].revents & (POLLERR | POLLHUP))
331bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann#  else
3322447373f182dbfeb47fb86c0f5a6ac5773c65ac2Philip P. Moltmann	else if (FD_ISSET(fds[i], &error_set))
333bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann#  endif /* HAVE_POLL */
334bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann        {
335bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann         /*
336bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann          * Error on socket, remove from the "pool"...
337bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann          */
338bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann
33925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  httpAddrClose(NULL, fds[i]);
340bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann          nfds --;
341bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann          if (i < nfds)
342bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann          {
343bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann            memmove(fds + i, fds + i + 1, (size_t)(nfds - i) * (sizeof(fds[0])));
344bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann            memmove(addrs + i, addrs + i + 1, (size_t)(nfds - i) * (sizeof(addrs[0])));
345bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann          }
346bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann          i --;
347bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann        }
34825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
34925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
350bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann      if (connaddr)
351985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann      {
352985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann       /*
353985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann        * Connected on one address, close all of the other sockets we have so
354985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann        * far and return...
355985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann        */
356985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann
357985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann        for (j = 0; j < i; j ++)
358985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann          httpAddrClose(NULL, fds[j]);
359985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann
360985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann        for (j ++; j < nfds; j ++)
361985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann          httpAddrClose(NULL, fds[j]);
362985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann
363bfe95db54f1c346a8a14ce89a2a7825d6c2303bdPhilip P. Moltmann        return (connaddr);
364985548d9a7de8cde72ea0b5a81f6f0854d049454Philip P. Moltmann      }
36525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
36625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* O_NONBLOCK */
36725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
36825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (addrlist)
36925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      remaining -= 100;
37025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
37125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      remaining -= 250;
37225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
37325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
37425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  while (nfds > 0)
37525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
37625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    nfds --;
37725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    httpAddrClose(NULL, fds[nfds]);
37825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
37925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32
38125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, "Connection failed", 0);
38225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else
38325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, strerror(errno), 0);
38425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */
38525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (NULL);
38725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
38825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
38925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
39025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
39125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'httpAddrCopyList()' - Copy an address list.
39225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
39325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.7/macOS 10.9@
39425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
39525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
39625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannhttp_addrlist_t	*			/* O - New address list or @code NULL@ on error */
39725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannhttpAddrCopyList(
39825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    http_addrlist_t *src)		/* I - Source address list */
39925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
40025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  http_addrlist_t	*dst = NULL,	/* First list entry */
40125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			*prev = NULL,	/* Previous list entry */
40225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			*current = NULL;/* Current list entry */
40325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
40425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
40525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  while (src)
40625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
40725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if ((current = malloc(sizeof(http_addrlist_t))) == NULL)
40825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
40925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      current = dst;
41025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
41125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      while (current)
41225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
41325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        prev    = current;
41425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        current = current->next;
41525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
41625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        free(prev);
41725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
41825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
41925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      return (NULL);
42025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
42125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    memcpy(current, src, sizeof(http_addrlist_t));
42325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    current->next = NULL;
42525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
42625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (prev)
42725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      prev->next = current;
42825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
42925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      dst = current;
43025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
43125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    prev = current;
43225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    src  = src->next;
43325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
43425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
43525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (dst);
43625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
43725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
43825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
43925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
44025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'httpAddrFreeList()' - Free an address list.
44125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
44225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
44325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
44425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
44525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid
44625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannhttpAddrFreeList(
44725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    http_addrlist_t *addrlist)		/* I - Address list to free */
44825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
44925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  http_addrlist_t	*next;		/* Next address in list */
45025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
45125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
45225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
45325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Free each address in the list...
45425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
45525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
45625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  while (addrlist)
45725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
45825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    next = addrlist->next;
45925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
46025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    free(addrlist);
46125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
46225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    addrlist = next;
46325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
46425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
46525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
46625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
46725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/*
46825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'httpAddrGetList()' - Get a list of addresses for a hostname.
46925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *
47025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@
47125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */
47225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
47325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannhttp_addrlist_t	*			/* O - List of addresses or NULL */
47425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannhttpAddrGetList(const char *hostname,	/* I - Hostname, IP address, or NULL for passive listen address */
47525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                int        family,	/* I - Address family or AF_UNSPEC */
47625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		const char *service)	/* I - Service name or port number */
47725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{
47825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  http_addrlist_t	*first,		/* First address in list */
47925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			*addr,		/* Current address in list */
48025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			*temp;		/* New address */
48125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  _cups_globals_t	*cg = _cupsGlobals();
48225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann					/* Global data */
48325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
48425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
48525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG
48625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  _cups_debug_printf("httpAddrGetList(hostname=\"%s\", family=AF_%s, "
48725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann                     "service=\"%s\")\n",
48825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		     hostname ? hostname : "(nil)",
48925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann		     family == AF_UNSPEC ? "UNSPEC" :
49025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  ifdef AF_LOCAL
49125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	                 family == AF_LOCAL ? "LOCAL" :
49225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  endif /* AF_LOCAL */
49325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  ifdef AF_INET6
49425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	                 family == AF_INET6 ? "INET6" :
49525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  endif /* AF_INET6 */
49625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	                 family == AF_INET ? "INET" : "???", service);
49725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */
49825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
49925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_RES_INIT
50025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
50125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * STR #2920: Initialize resolver after failure in cups-polld
50225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *
50325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * If the previous lookup failed, re-initialize the resolver to prevent
50425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * temporary network errors from persisting.  This *should* be handled by
50525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * the resolver libraries, but apparently the glibc folks do not agree.
50625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  *
50725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * We set a flag at the end of this function if we encounter an error that
50825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * requires reinitialization of the resolver functions.  We then call
50925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * res_init() if the flag is set on the next call here or in httpAddrLookup().
51025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
51125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
51225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (cg->need_res_init)
51325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
51425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    res_init();
51525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
51625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    cg->need_res_init = 0;
51725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
51825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_RES_INIT */
51925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
52025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
52125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Lookup the address the best way we can...
52225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
52325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
52425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  first = addr = NULL;
52525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
52625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef AF_LOCAL
52725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (hostname && hostname[0] == '/')
52825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
52925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
53025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Domain socket address...
53125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
53225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
53325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if ((first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t))) != NULL)
53425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
53525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      addr = first;
53625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      first->addr.un.sun_family = AF_LOCAL;
53725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      strlcpy(first->addr.un.sun_path, hostname, sizeof(first->addr.un.sun_path));
53825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
53925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
54025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  else
54125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* AF_LOCAL */
54225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!hostname || _cups_strcasecmp(hostname, "localhost"))
54325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
54425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_GETADDRINFO
54525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    struct addrinfo	hints,		/* Address lookup hints */
54625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			*results,	/* Address lookup results */
54725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			*current;	/* Current result */
54825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    char		ipv6[64],	/* IPv6 address */
54925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann			*ipv6zone;	/* Pointer to zone separator */
55025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int			ipv6len;	/* Length of IPv6 address */
55125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int			error;		/* getaddrinfo() error */
55225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
55525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Lookup the address as needed...
55625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
55725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
55825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    memset(&hints, 0, sizeof(hints));
55925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    hints.ai_family   = family;
56025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    hints.ai_flags    = hostname ? 0 : AI_PASSIVE;
56125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    hints.ai_socktype = SOCK_STREAM;
56225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
56325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hostname && *hostname == '[')
56425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
56525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
56625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Remove brackets from numeric IPv6 address...
56725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
56825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
56925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (!strncmp(hostname, "[v1.", 4))
57025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
57125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
57225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Copy the newer address format which supports link-local addresses...
57325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
57425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
57525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	strlcpy(ipv6, hostname + 4, sizeof(ipv6));
57625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if ((ipv6len = (int)strlen(ipv6) - 1) >= 0 && ipv6[ipv6len] == ']')
57725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
57825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          ipv6[ipv6len] = '\0';
57925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  hostname      = ipv6;
58025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
58125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann         /*
58225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  * Convert "+zone" in address to "%zone"...
58325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  */
58425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
58525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          if ((ipv6zone = strrchr(ipv6, '+')) != NULL)
58625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    *ipv6zone = '%';
58725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
58825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
58925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
59025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
59125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
59225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Copy the regular non-link-local IPv6 address...
59325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
59425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
59525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	strlcpy(ipv6, hostname + 1, sizeof(ipv6));
59625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if ((ipv6len = (int)strlen(ipv6) - 1) >= 0 && ipv6[ipv6len] == ']')
59725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
59825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          ipv6[ipv6len] = '\0';
59925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  hostname      = ipv6;
60025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
60125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
60225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
60325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
60425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if ((error = getaddrinfo(hostname, service, &hints, &results)) == 0)
60525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
60625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
60725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Copy the results to our own address list structure...
60825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
60925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
61025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      for (current = results; current; current = current->ai_next)
61125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (current->ai_family == AF_INET || current->ai_family == AF_INET6)
61225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
61325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	 /*
61425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          * Copy the address over...
61525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  */
61625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
61725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
61825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (!temp)
61925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
62025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    httpAddrFreeList(first);
62125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
62225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    return (NULL);
62325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  }
62425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
62525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          if (current->ai_family == AF_INET6)
62625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    memcpy(&(temp->addr.ipv6), current->ai_addr,
62725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	           sizeof(temp->addr.ipv6));
62825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else
62925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    memcpy(&(temp->addr.ipv4), current->ai_addr,
63025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	           sizeof(temp->addr.ipv4));
63125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann         /*
63325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  * Append the address to the list...
63425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  */
63525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (!first)
63725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    first = temp;
63825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
63925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (addr)
64025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    addr->next = temp;
64125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
64225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  addr = temp;
64325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
64425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
64525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
64625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Free the results from getaddrinfo()...
64725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
64825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
64925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      freeaddrinfo(results);
65025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
65125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
65225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
65325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (error == EAI_FAIL)
65425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        cg->need_res_init = 1;
65525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
65625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gai_strerror(error), 0);
65725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
65825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
65925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else
66025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hostname)
66125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
66225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      int		i;		/* Looping vars */
66325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      unsigned		ip[4];		/* IPv4 address components */
66425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      const char	*ptr;		/* Pointer into hostname */
66525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      struct hostent	*host;		/* Result of lookup */
66625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      struct servent	*port;		/* Port number for service */
66725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      int		portnum;	/* Port number */
66825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
66925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
67025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
67125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Lookup the service...
67225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
67325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
67425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (!service)
67525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	portnum = 0;
67625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (isdigit(*service & 255))
67725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	portnum = atoi(service);
67825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if ((port = getservbyname(service, NULL)) != NULL)
67925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	portnum = ntohs(port->s_port);
68025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (!strcmp(service, "http"))
68125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        portnum = 80;
68225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (!strcmp(service, "https"))
68325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        portnum = 443;
68425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (!strcmp(service, "ipp") || !strcmp(service, "ipps"))
68525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        portnum = 631;
68625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (!strcmp(service, "lpd"))
68725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        portnum = 515;
68825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if (!strcmp(service, "socket"))
68925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        portnum = 9100;
69025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
69125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	return (NULL);
69225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
69325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
69425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * This code is needed because some operating systems have a
69525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * buggy implementation of gethostbyname() that does not support
69625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * IPv4 addresses.  If the hostname string is an IPv4 address, then
69725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * sscanf() is used to extract the IPv4 components.  We then pack
69825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * the components into an IPv4 address manually, since the
69925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * inet_aton() function is deprecated.  We use the htonl() macro
70025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * to get the right byte order for the address.
70125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
70225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
70325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      for (ptr = hostname; isdigit(*ptr & 255) || *ptr == '.'; ptr ++);
70425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
70525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (!*ptr)
70625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
70725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
70825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	* We have an IPv4 address; break it up and create an IPv4 address...
70925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
71025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
71125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if (sscanf(hostname, "%u.%u.%u.%u", ip, ip + 1, ip + 2, ip + 3) == 4 &&
71225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            ip[0] <= 255 && ip[1] <= 255 && ip[2] <= 255 && ip[3] <= 255)
71325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
71425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
71525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (!first)
71625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    return (NULL);
71725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
71825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          first->addr.ipv4.sin_family = AF_INET;
71925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          first->addr.ipv4.sin_addr.s_addr = htonl((((((((unsigned)ip[0] << 8) |
72025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	                                               (unsigned)ip[1]) << 8) |
72125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann						     (unsigned)ip[2]) << 8) |
72225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann						   (unsigned)ip[3]));
72325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          first->addr.ipv4.sin_port = htons(portnum);
72425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
72525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
72625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else if ((host = gethostbyname(hostname)) != NULL &&
72725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  ifdef AF_INET6
72825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               (host->h_addrtype == AF_INET || host->h_addrtype == AF_INET6))
72925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  else
73025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann               host->h_addrtype == AF_INET)
73125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  endif /* AF_INET6 */
73225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
73325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	for (i = 0; host->h_addr_list[i]; i ++)
73425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
73525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	 /*
73625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          * Copy the address over...
73725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  */
73825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
73925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
74025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (!temp)
74125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
74225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    httpAddrFreeList(first);
74325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    return (NULL);
74425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  }
74525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
74625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  ifdef AF_INET6
74725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          if (host->h_addrtype == AF_INET6)
74825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
74925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            temp->addr.ipv6.sin6_family = AF_INET6;
75025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    memcpy(&(temp->addr.ipv6.sin6_addr), host->h_addr_list[i],
75125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	           sizeof(temp->addr.ipv6));
75225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            temp->addr.ipv6.sin6_port = htons(portnum);
75325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  }
75425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  else
75525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  endif /* AF_INET6 */
75625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  {
75725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            temp->addr.ipv4.sin_family = AF_INET;
75825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    memcpy(&(temp->addr.ipv4.sin_addr), host->h_addr_list[i],
75925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	           sizeof(temp->addr.ipv4));
76025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann            temp->addr.ipv4.sin_port = htons(portnum);
76125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          }
76225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
76325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	 /*
76425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  * Append the address to the list...
76525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  */
76625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
76725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (!first)
76825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    first = temp;
76925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
77025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  if (addr)
77125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	    addr->next = temp;
77225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
77325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  addr = temp;
77425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
77525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
77625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      else
77725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
77825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (h_errno == NO_RECOVERY)
77925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          cg->need_res_init = 1;
78025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
78125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	_cupsSetError(IPP_STATUS_ERROR_INTERNAL, hstrerror(h_errno), 0);
78225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
78325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
78425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_GETADDRINFO */
78525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
78625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
78725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
78825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Detect some common errors and handle them sanely...
78925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
79025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
79125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  if (!addr && (!hostname || !_cups_strcasecmp(hostname, "localhost")))
79225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  {
79325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    struct servent	*port;		/* Port number for service */
79425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    int			portnum;	/* Port number */
79525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
79625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
79725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann   /*
79825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    * Lookup the service...
79925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    */
80025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
80125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (!service)
80225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      portnum = 0;
80325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (isdigit(*service & 255))
80425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      portnum = atoi(service);
80525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if ((port = getservbyname(service, NULL)) != NULL)
80625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      portnum = ntohs(port->s_port);
80725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (!strcmp(service, "http"))
80825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      portnum = 80;
80925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (!strcmp(service, "https"))
81025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      portnum = 443;
81125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (!strcmp(service, "ipp") || !strcmp(service, "ipps"))
81225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      portnum = 631;
81325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (!strcmp(service, "lpd"))
81425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      portnum = 515;
81525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (!strcmp(service, "socket"))
81625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      portnum = 9100;
81725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else
81825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
81925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      httpAddrFreeList(first);
82025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
82125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown service name."), 1);
82225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      return (NULL);
82325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
82425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
82525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    if (hostname && !_cups_strcasecmp(hostname, "localhost"))
82625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
82725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
82825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Unfortunately, some users ignore all of the warnings in the
82925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * /etc/hosts file and delete "localhost" from it. If we get here
83025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * then we were unable to resolve the name, so use the IPv6 and/or
83125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * IPv4 loopback interface addresses...
83225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
83325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
83425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef AF_INET6
83525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (family != AF_INET)
83625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
83725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
83825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Add [::1] to the address list...
83925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
84025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
84125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
84225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if (!temp)
84325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
84425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
84525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  httpAddrFreeList(first);
84625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  return (NULL);
84725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
84825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
84925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        temp->addr.ipv6.sin6_family            = AF_INET6;
85025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp->addr.ipv6.sin6_port              = htons(portnum);
85125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  ifdef WIN32
85225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp->addr.ipv6.sin6_addr.u.Byte[15]   = 1;
85325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  else
85425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp->addr.ipv6.sin6_addr.s6_addr32[3] = htonl(1);
85525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#  endif /* WIN32 */
85625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
85725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (!first)
85825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          first = temp;
85925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
86025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        addr = temp;
86125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
86225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
86325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (family != AF_INET6)
86425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* AF_INET6 */
86525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
86625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
86725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Add 127.0.0.1 to the address list...
86825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
86925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
87025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
87125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if (!temp)
87225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
87325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
87425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  httpAddrFreeList(first);
87525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  return (NULL);
87625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
87725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
87825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        temp->addr.ipv4.sin_family      = AF_INET;
87925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp->addr.ipv4.sin_port        = htons(portnum);
88025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp->addr.ipv4.sin_addr.s_addr = htonl(0x7f000001);
88125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
88225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (!first)
88325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          first = temp;
88425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
88525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (addr)
88625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  addr->next = temp;
88725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
88825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
88925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    else if (!hostname)
89025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    {
89125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann     /*
89225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      * Provide one or more passive listening addresses...
89325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      */
89425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
89525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef AF_INET6
89625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (family != AF_INET)
89725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
89825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
89925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Add [::] to the address list...
90025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
90125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
90225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
90325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if (!temp)
90425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
90525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
90625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  httpAddrFreeList(first);
90725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  return (NULL);
90825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
90925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
91025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        temp->addr.ipv6.sin6_family = AF_INET6;
91125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp->addr.ipv6.sin6_port   = htons(portnum);
91225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
91325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (!first)
91425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          first = temp;
91525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
91625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        addr = temp;
91725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
91825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
91925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      if (family != AF_INET6)
92025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* AF_INET6 */
92125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      {
92225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann       /*
92325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        * Add 0.0.0.0 to the address list...
92425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	*/
92525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
92625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t));
92725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	if (!temp)
92825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	{
92925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0);
93025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  httpAddrFreeList(first);
93125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  return (NULL);
93225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	}
93325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
93425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        temp->addr.ipv4.sin_family = AF_INET;
93525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	temp->addr.ipv4.sin_port   = htons(portnum);
93625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
93725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (!first)
93825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann          first = temp;
93925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
94025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann        if (addr)
94125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann	  addr->next = temp;
94225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann      }
94325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann    }
94425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  }
94525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
94625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /*
94725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  * Return the address list...
94825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  */
94925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann
95025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann  return (first);
95125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann}
952