http-addrlist.c revision 25aee82d491492e1fa3b005e5880e684dc081ffb
125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * HTTP address list routines for CUPS. 325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copyright 2007-2016 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 1125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * file is 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 * 3525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 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 */ 6825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int i, /* Looping var */ 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 { 30725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (i = 0; i < nfds; i ++) 30825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 30925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# ifdef HAVE_POLL 31025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("pfds[%d].revents=%x\n", i, pfds[i].revents)); 31125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (pfds[i].revents && !(pfds[i].revents & (POLLERR | POLLHUP))) 31225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# else 31325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (FD_ISSET(fds[i], &input) && !FD_ISSET(fds[i], &error)) 31425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# endif /* HAVE_POLL */ 31525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 31625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *sock = fds[i]; 31725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addrlist = addrs[i]; 31825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 31925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# ifdef DEBUG 32025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann len = sizeof(peer); 32125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!getpeername(fds[i], (struct sockaddr *)&peer, &len)) 32225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann DEBUG_printf(("1httpAddrConnect2: Connected to %s:%d...", httpAddrString(&peer, temp, sizeof(temp)), httpAddrPort(&peer))); 32325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# endif /* DEBUG */ 32425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 32525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 32625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrClose(NULL, fds[i]); 32725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 32825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 32925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (addrlist); 33025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 33125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* O_NONBLOCK */ 33225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (addrlist) 33425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann remaining -= 100; 33525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 33625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann remaining -= 250; 33725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 33825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 33925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (nfds > 0) 34025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 34125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann nfds --; 34225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrClose(NULL, fds[nfds]); 34325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 34425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 34525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef WIN32 34625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, "Connection failed", 0); 34725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 34825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSetError(IPP_STATUS_ERROR_SERVICE_UNAVAILABLE, strerror(errno), 0); 34925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* WIN32 */ 35025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 35225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 35325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 35525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 35625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'httpAddrCopyList()' - Copy an address list. 35725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 35825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.7/macOS 10.9@ 35925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 36025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannhttp_addrlist_t * /* O - New address list or @code NULL@ on error */ 36225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannhttpAddrCopyList( 36325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann http_addrlist_t *src) /* I - Source address list */ 36425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 36525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann http_addrlist_t *dst = NULL, /* First list entry */ 36625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *prev = NULL, /* Previous list entry */ 36725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *current = NULL;/* Current list entry */ 36825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 36925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 37025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (src) 37125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 37225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((current = malloc(sizeof(http_addrlist_t))) == NULL) 37325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 37425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann current = dst; 37525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 37625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (current) 37725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 37825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann prev = current; 37925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann current = current->next; 38025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(prev); 38225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 38325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 38525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 38625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(current, src, sizeof(http_addrlist_t)); 38825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 38925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann current->next = NULL; 39025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 39125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (prev) 39225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann prev->next = current; 39325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 39425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann dst = current; 39525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 39625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann prev = current; 39725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann src = src->next; 39825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 39925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 40025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (dst); 40125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 40225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 40325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 40425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 40525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'httpAddrFreeList()' - Free an address list. 40625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 40725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 40825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 40925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 41025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannvoid 41125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannhttpAddrFreeList( 41225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann http_addrlist_t *addrlist) /* I - Address list to free */ 41325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 41425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann http_addrlist_t *next; /* Next address in list */ 41525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 41625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 41725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 41825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Free each address in the list... 41925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 42025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 42125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann while (addrlist) 42225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 42325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann next = addrlist->next; 42425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 42525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann free(addrlist); 42625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 42725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addrlist = next; 42825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 42925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 43025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 43125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 43225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann/* 43325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 'httpAddrGetList()' - Get a list of addresses for a hostname. 43425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 43525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * @since CUPS 1.2/macOS 10.5@ 43625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 43725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 43825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmannhttp_addrlist_t * /* O - List of addresses or NULL */ 43925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. MoltmannhttpAddrGetList(const char *hostname, /* I - Hostname, IP address, or NULL for passive listen address */ 44025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int family, /* I - Address family or AF_UNSPEC */ 44125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *service) /* I - Service name or port number */ 44225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann{ 44325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann http_addrlist_t *first, /* First address in list */ 44425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *addr, /* Current address in list */ 44525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *temp; /* New address */ 44625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_globals_t *cg = _cupsGlobals(); 44725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* Global data */ 44825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 44925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 45025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef DEBUG 45125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cups_debug_printf("httpAddrGetList(hostname=\"%s\", family=AF_%s, " 45225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann "service=\"%s\")\n", 45325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann hostname ? hostname : "(nil)", 45425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann family == AF_UNSPEC ? "UNSPEC" : 45525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# ifdef AF_LOCAL 45625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann family == AF_LOCAL ? "LOCAL" : 45725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# endif /* AF_LOCAL */ 45825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# ifdef AF_INET6 45925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann family == AF_INET6 ? "INET6" : 46025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# endif /* AF_INET6 */ 46125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann family == AF_INET ? "INET" : "???", service); 46225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* DEBUG */ 46325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 46425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_RES_INIT 46525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 46625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * STR #2920: Initialize resolver after failure in cups-polld 46725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 46825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * If the previous lookup failed, re-initialize the resolver to prevent 46925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * temporary network errors from persisting. This *should* be handled by 47025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * the resolver libraries, but apparently the glibc folks do not agree. 47125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * 47225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * We set a flag at the end of this function if we encounter an error that 47325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * requires reinitialization of the resolver functions. We then call 47425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * res_init() if the flag is set on the next call here or in httpAddrLookup(). 47525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 47625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 47725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (cg->need_res_init) 47825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 47925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann res_init(); 48025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 48125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->need_res_init = 0; 48225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 48325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_RES_INIT */ 48425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 48525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 48625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Lookup the address the best way we can... 48725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 48825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 48925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first = addr = NULL; 49025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 49125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef AF_LOCAL 49225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (hostname && hostname[0] == '/') 49325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 49425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 49525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Domain socket address... 49625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 49725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 49825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t))) != NULL) 49925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 50025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addr = first; 50125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first->addr.un.sun_family = AF_LOCAL; 50225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(first->addr.un.sun_path, hostname, sizeof(first->addr.un.sun_path)); 50325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 50425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 50525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 50625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* AF_LOCAL */ 50725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!hostname || _cups_strcasecmp(hostname, "localhost")) 50825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 50925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef HAVE_GETADDRINFO 51025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann struct addrinfo hints, /* Address lookup hints */ 51125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *results, /* Address lookup results */ 51225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *current; /* Current result */ 51325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann char ipv6[64], /* IPv6 address */ 51425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ipv6zone; /* Pointer to zone separator */ 51525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int ipv6len; /* Length of IPv6 address */ 51625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int error; /* getaddrinfo() error */ 51725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 51825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 51925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 52025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Lookup the address as needed... 52125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 52225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 52325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memset(&hints, 0, sizeof(hints)); 52425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann hints.ai_family = family; 52525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann hints.ai_flags = hostname ? 0 : AI_PASSIVE; 52625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann hints.ai_socktype = SOCK_STREAM; 52725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 52825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (hostname && *hostname == '[') 52925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 53025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 53125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Remove brackets from numeric IPv6 address... 53225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 53325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 53425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!strncmp(hostname, "[v1.", 4)) 53525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 53625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 53725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy the newer address format which supports link-local addresses... 53825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 53925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 54025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(ipv6, hostname + 4, sizeof(ipv6)); 54125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((ipv6len = (int)strlen(ipv6) - 1) >= 0 && ipv6[ipv6len] == ']') 54225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 54325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ipv6[ipv6len] = '\0'; 54425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann hostname = ipv6; 54525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 54625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 54725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Convert "+zone" in address to "%zone"... 54825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 54925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 55025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((ipv6zone = strrchr(ipv6, '+')) != NULL) 55125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann *ipv6zone = '%'; 55225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 55325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 55425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 55525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 55625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 55725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy the regular non-link-local IPv6 address... 55825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 55925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 56025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann strlcpy(ipv6, hostname + 1, sizeof(ipv6)); 56125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((ipv6len = (int)strlen(ipv6) - 1) >= 0 && ipv6[ipv6len] == ']') 56225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 56325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ipv6[ipv6len] = '\0'; 56425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann hostname = ipv6; 56525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 56625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 56725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 56825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 56925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if ((error = getaddrinfo(hostname, service, &hints, &results)) == 0) 57025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 57125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 57225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy the results to our own address list structure... 57325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 57425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 57525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (current = results; current; current = current->ai_next) 57625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (current->ai_family == AF_INET || current->ai_family == AF_INET6) 57725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 57825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 57925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy the address over... 58025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 58125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 58225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); 58325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!temp) 58425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 58525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrFreeList(first); 58625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); 58725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 58825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 58925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 59025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (current->ai_family == AF_INET6) 59125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(&(temp->addr.ipv6), current->ai_addr, 59225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(temp->addr.ipv6)); 59325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 59425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(&(temp->addr.ipv4), current->ai_addr, 59525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(temp->addr.ipv4)); 59625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 59725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 59825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Append the address to the list... 59925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 60025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!first) 60225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first = temp; 60325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (addr) 60525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addr->next = temp; 60625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 60725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addr = temp; 60825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 60925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 61025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 61125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Free the results from getaddrinfo()... 61225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 61325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 61425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann freeaddrinfo(results); 61525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 61625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 61725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 61825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (error == EAI_FAIL) 61925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->need_res_init = 1; 62025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 62125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSetError(IPP_STATUS_ERROR_INTERNAL, gai_strerror(error), 0); 62225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 62325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 62425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#else 62525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (hostname) 62625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 62725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int i; /* Looping vars */ 62825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann unsigned ip[4]; /* IPv4 address components */ 62925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann const char *ptr; /* Pointer into hostname */ 63025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann struct hostent *host; /* Result of lookup */ 63125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann struct servent *port; /* Port number for service */ 63225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int portnum; /* Port number */ 63325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 63425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 63525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 63625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Lookup the service... 63725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 63825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 63925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!service) 64025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 0; 64125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (isdigit(*service & 255)) 64225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = atoi(service); 64325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((port = getservbyname(service, NULL)) != NULL) 64425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = ntohs(port->s_port); 64525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(service, "http")) 64625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 80; 64725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(service, "https")) 64825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 443; 64925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(service, "ipp") || !strcmp(service, "ipps")) 65025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 631; 65125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(service, "lpd")) 65225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 515; 65325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(service, "socket")) 65425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 9100; 65525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 65625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 65725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 65825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 65925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * This code is needed because some operating systems have a 66025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * buggy implementation of gethostbyname() that does not support 66125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * IPv4 addresses. If the hostname string is an IPv4 address, then 66225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * sscanf() is used to extract the IPv4 components. We then pack 66325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * the components into an IPv4 address manually, since the 66425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * inet_aton() function is deprecated. We use the htonl() macro 66525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * to get the right byte order for the address. 66625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 66725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 66825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (ptr = hostname; isdigit(*ptr & 255) || *ptr == '.'; ptr ++); 66925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 67025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!*ptr) 67125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 67225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 67325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * We have an IPv4 address; break it up and create an IPv4 address... 67425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 67525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 67625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (sscanf(hostname, "%u.%u.%u.%u", ip, ip + 1, ip + 2, ip + 3) == 4 && 67725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann ip[0] <= 255 && ip[1] <= 255 && ip[2] <= 255 && ip[3] <= 255) 67825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 67925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); 68025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!first) 68125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 68225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 68325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first->addr.ipv4.sin_family = AF_INET; 68425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first->addr.ipv4.sin_addr.s_addr = htonl((((((((unsigned)ip[0] << 8) | 68525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (unsigned)ip[1]) << 8) | 68625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (unsigned)ip[2]) << 8) | 68725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (unsigned)ip[3])); 68825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first->addr.ipv4.sin_port = htons(portnum); 68925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 69025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 69125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((host = gethostbyname(hostname)) != NULL && 69225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# ifdef AF_INET6 69325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann (host->h_addrtype == AF_INET || host->h_addrtype == AF_INET6)) 69425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# else 69525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann host->h_addrtype == AF_INET) 69625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# endif /* AF_INET6 */ 69725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 69825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann for (i = 0; host->h_addr_list[i]; i ++) 69925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 70025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 70125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Copy the address over... 70225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 70325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 70425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); 70525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!temp) 70625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 70725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrFreeList(first); 70825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 70925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 71025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 71125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# ifdef AF_INET6 71225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (host->h_addrtype == AF_INET6) 71325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 71425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv6.sin6_family = AF_INET6; 71525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(&(temp->addr.ipv6.sin6_addr), host->h_addr_list[i], 71625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(temp->addr.ipv6)); 71725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv6.sin6_port = htons(portnum); 71825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 71925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 72025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# endif /* AF_INET6 */ 72125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 72225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv4.sin_family = AF_INET; 72325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann memcpy(&(temp->addr.ipv4.sin_addr), host->h_addr_list[i], 72425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann sizeof(temp->addr.ipv4)); 72525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv4.sin_port = htons(portnum); 72625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 72725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 72825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 72925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Append the address to the list... 73025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 73125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 73225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!first) 73325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first = temp; 73425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 73525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (addr) 73625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addr->next = temp; 73725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 73825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addr = temp; 73925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 74025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 74125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 74225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 74325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (h_errno == NO_RECOVERY) 74425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann cg->need_res_init = 1; 74525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 74625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSetError(IPP_STATUS_ERROR_INTERNAL, hstrerror(h_errno), 0); 74725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 74825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 74925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* HAVE_GETADDRINFO */ 75025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 75125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 75225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 75325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Detect some common errors and handle them sanely... 75425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 75525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 75625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!addr && (!hostname || !_cups_strcasecmp(hostname, "localhost"))) 75725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 75825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann struct servent *port; /* Port number for service */ 75925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann int portnum; /* Port number */ 76025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 76125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 76225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 76325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Lookup the service... 76425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 76525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 76625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!service) 76725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 0; 76825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (isdigit(*service & 255)) 76925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = atoi(service); 77025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if ((port = getservbyname(service, NULL)) != NULL) 77125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = ntohs(port->s_port); 77225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(service, "http")) 77325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 80; 77425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(service, "https")) 77525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 443; 77625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(service, "ipp") || !strcmp(service, "ipps")) 77725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 631; 77825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(service, "lpd")) 77925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 515; 78025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!strcmp(service, "socket")) 78125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann portnum = 9100; 78225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else 78325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 78425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrFreeList(first); 78525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 78625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Unknown service name."), 1); 78725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 78825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 78925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 79025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (hostname && !_cups_strcasecmp(hostname, "localhost")) 79125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 79225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 79325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Unfortunately, some users ignore all of the warnings in the 79425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * /etc/hosts file and delete "localhost" from it. If we get here 79525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * then we were unable to resolve the name, so use the IPv6 and/or 79625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * IPv4 loopback interface addresses... 79725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 79825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 79925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef AF_INET6 80025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (family != AF_INET) 80125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 80225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 80325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Add [::1] to the address list... 80425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 80525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 80625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); 80725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!temp) 80825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 80925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); 81025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrFreeList(first); 81125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 81225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 81325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 81425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv6.sin6_family = AF_INET6; 81525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv6.sin6_port = htons(portnum); 81625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# ifdef WIN32 81725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv6.sin6_addr.u.Byte[15] = 1; 81825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# else 81925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv6.sin6_addr.s6_addr32[3] = htonl(1); 82025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann# endif /* WIN32 */ 82125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 82225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!first) 82325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first = temp; 82425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 82525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addr = temp; 82625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 82725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 82825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (family != AF_INET6) 82925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* AF_INET6 */ 83025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 83125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 83225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Add 127.0.0.1 to the address list... 83325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 83425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 83525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); 83625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!temp) 83725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 83825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); 83925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrFreeList(first); 84025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 84125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 84225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 84325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv4.sin_family = AF_INET; 84425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv4.sin_port = htons(portnum); 84525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv4.sin_addr.s_addr = htonl(0x7f000001); 84625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 84725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!first) 84825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first = temp; 84925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 85025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (addr) 85125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addr->next = temp; 85225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 85325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 85425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann else if (!hostname) 85525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 85625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 85725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Provide one or more passive listening addresses... 85825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 85925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 86025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#ifdef AF_INET6 86125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (family != AF_INET) 86225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 86325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 86425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Add [::] to the address list... 86525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 86625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 86725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); 86825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!temp) 86925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 87025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); 87125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrFreeList(first); 87225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 87325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 87425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 87525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv6.sin6_family = AF_INET6; 87625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv6.sin6_port = htons(portnum); 87725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 87825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!first) 87925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first = temp; 88025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 88125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addr = temp; 88225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 88325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 88425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (family != AF_INET6) 88525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann#endif /* AF_INET6 */ 88625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 88725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 88825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Add 0.0.0.0 to the address list... 88925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 89025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 89125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp = (http_addrlist_t *)calloc(1, sizeof(http_addrlist_t)); 89225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!temp) 89325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann { 89425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann _cupsSetError(IPP_STATUS_ERROR_INTERNAL, strerror(errno), 0); 89525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann httpAddrFreeList(first); 89625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (NULL); 89725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 89825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 89925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv4.sin_family = AF_INET; 90025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann temp->addr.ipv4.sin_port = htons(portnum); 90125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 90225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (!first) 90325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann first = temp; 90425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 90525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann if (addr) 90625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann addr->next = temp; 90725aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 90825aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 90925aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann } 91025aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 91125aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann /* 91225aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann * Return the address list... 91325aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann */ 91425aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann 91525aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann return (first); 91625aee82d491492e1fa3b005e5880e684dc081ffbPhilip P. Moltmann} 917