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