]> git.ipfire.org Git - thirdparty/cups.git/blobdiff - cups/http-addr.c
Greatly simplify the man page handling.
[thirdparty/cups.git] / cups / http-addr.c
index a3a628c54a012db52042d1024ca391e0ea8719c7..86749c84856ad7f56a86e601e1522c3ef10e8614 100644 (file)
@@ -1,16 +1,11 @@
 /*
- * "$Id$"
- *
  * HTTP address routines for CUPS.
  *
- * Copyright 2007-2014 by Apple Inc.
+ * Copyright 2007-2019 by Apple Inc.
  * Copyright 1997-2006 by Easy Software Products, all rights reserved.
  *
- * These coded instructions, statements, and computer programs are the
- * property of Apple Inc. and are protected by Federal copyright
- * law.  Distribution and use rights are outlined in the file "LICENSE.txt"
- * which should have been included with this file.  If this file is
- * file is missing or damaged, see the license at "http://www.cups.org/".
+ * Licensed under Apache License v2.0.  See the file "LICENSE" for more
+ * information.
  */
 
 /*
  */
 
 #include "cups-private.h"
+#include "debug-internal.h"
 #include <sys/stat.h>
 #ifdef HAVE_RESOLV_H
 #  include <resolv.h>
 #endif /* HAVE_RESOLV_H */
 #ifdef __APPLE__
 #  include <CoreFoundation/CoreFoundation.h>
-#  include <SystemConfiguration/SystemConfiguration.h>
+#  ifdef HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME
+#    include <SystemConfiguration/SystemConfiguration.h>
+#  endif /* HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME */
 #endif /* __APPLE__ */
 
 
 /*
  * 'httpAddrAny()' - Check for the "any" address.
  *
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
  */
 
 int                                    /* O - 1 if "any", 0 otherwise */
@@ -58,22 +56,22 @@ httpAddrAny(const http_addr_t *addr)        /* I - Address to check */
  * 'httpAddrClose()' - Close a socket created by @link httpAddrConnect@ or
  *                     @link httpAddrListen@.
  *
- * Pass @code NULL@ for sockets created with @link httpAddrConnect@ and the
- * listen address for sockets created with @link httpAddrListen@. This will
- * ensure that domain sockets are removed when closed.
+ * Pass @code NULL@ for sockets created with @link httpAddrConnect2@ and the
+ * listen address for sockets created with @link httpAddrListen@.  This function
+ * ensures that domain sockets are removed when closed.
  *
- * @since CUPS 2.0@
+ * @since CUPS 2.0/OS 10.10@
  */
 
 int                                            /* O - 0 on success, -1 on failure */
 httpAddrClose(http_addr_t *addr,               /* I - Listen address or @code NULL@ */
               int         fd)                  /* I - Socket file descriptor */
 {
-#ifdef WIN32
+#ifdef _WIN32
   if (closesocket(fd))
 #else
   if (close(fd))
-#endif /* WIN32 */
+#endif /* _WIN32 */
     return (-1);
 
 #ifdef AF_LOCAL
@@ -88,7 +86,7 @@ httpAddrClose(http_addr_t *addr,              /* I - Listen address or @code NULL@ */
 /*
  * 'httpAddrEqual()' - Compare two addresses.
  *
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
  */
 
 int                                            /* O - 1 if equal, 0 if not */
@@ -121,7 +119,7 @@ httpAddrEqual(const http_addr_t *addr1,             /* I - First address */
 /*
  * 'httpAddrLength()' - Return the length of the address in bytes.
  *
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
  */
 
 int                                    /* O - Length in bytes */
@@ -152,7 +150,7 @@ httpAddrLength(const http_addr_t *addr)     /* I - Address */
  * 'httpAddrListen()' - Create a listening socket bound to the specified
  *                      address and port.
  *
- * @since CUPS 1.7/OS X 10.9@
+ * @since CUPS 1.7/macOS 10.9@
  */
 
 int                                    /* O - Socket or -1 on error */
@@ -258,9 +256,9 @@ httpAddrListen(http_addr_t *addr,   /* I - Address to bind to */
   * Close on exec...
   */
 
-#ifndef WIN32
+#ifndef _WIN32
   fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);
-#endif /* !WIN32 */
+#endif /* !_WIN32 */
 
 #ifdef SO_NOSIGPIPE
  /*
@@ -278,7 +276,7 @@ httpAddrListen(http_addr_t *addr,   /* I - Address to bind to */
 /*
  * 'httpAddrLocalhost()' - Check for the local loopback address.
  *
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
  */
 
 int                                    /* O - 1 if local host, 0 otherwise */
@@ -310,7 +308,7 @@ httpAddrLocalhost(
 /*
  * 'httpAddrLookup()' - Lookup the hostname associated with the address.
  *
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
  */
 
 char *                                 /* O - Host name */
@@ -323,8 +321,7 @@ httpAddrLookup(
                                        /* Global data */
 
 
-  DEBUG_printf(("httpAddrLookup(addr=%p, name=%p, namelen=%d)", addr, name,
-               namelen));
+  DEBUG_printf(("httpAddrLookup(addr=%p, name=%p, namelen=%d)", (void *)addr, (void *)name, namelen));
 
  /*
   * Range check input...
@@ -341,7 +338,7 @@ httpAddrLookup(
 #ifdef AF_LOCAL
   if (addr->addr.sa_family == AF_LOCAL)
   {
-    strlcpy(name, addr->un.sun_path, namelen);
+    strlcpy(name, addr->un.sun_path, (size_t)namelen);
     return (name);
   }
 #endif /* AF_LOCAL */
@@ -352,7 +349,7 @@ httpAddrLookup(
 
   if (httpAddrLocalhost(addr))
   {
-    strlcpy(name, "localhost", namelen);
+    strlcpy(name, "localhost", (size_t)namelen);
     return (name);
   }
 
@@ -423,7 +420,7 @@ httpAddrLookup(
       return (httpAddrString(addr, name, namelen));
     }
 
-    strlcpy(name, host->h_name, namelen);
+    strlcpy(name, host->h_name, (size_t)namelen);
   }
 #endif /* HAVE_GETNAMEINFO */
 
@@ -450,7 +447,7 @@ httpAddrFamily(http_addr_t *addr)   /* I - Address */
 /*
  * 'httpAddrPort()' - Get the port number associated with an address.
  *
- * @since CUPS 1.7/OS X 10.9@
+ * @since CUPS 1.7/macOS 10.9@
  */
 
 int                                    /* O - Port number */
@@ -493,7 +490,7 @@ _httpAddrSetPort(http_addr_t *addr, /* I - Address */
 /*
  * 'httpAddrString()' - Convert an address to a numeric string.
  *
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
  */
 
 char *                                 /* O - Numeric address string */
@@ -501,7 +498,7 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
                char              *s,   /* I - String buffer */
               int               slen)  /* I - Length of string */
 {
-  DEBUG_printf(("httpAddrString(addr=%p, s=%p, slen=%d)", addr, s, slen));
+  DEBUG_printf(("httpAddrString(addr=%p, s=%p, slen=%d)", (void *)addr, (void *)s, slen));
 
  /*
   * Range check input...
@@ -519,9 +516,9 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
   if (addr->addr.sa_family == AF_LOCAL)
   {
     if (addr->un.sun_path[0] == '/')
-      strlcpy(s, addr->un.sun_path, slen);
+      strlcpy(s, addr->un.sun_path, (size_t)slen);
     else
-      strlcpy(s, "localhost", slen);
+      strlcpy(s, "localhost", (size_t)slen);
   }
   else
 #endif /* AF_LOCAL */
@@ -529,10 +526,9 @@ httpAddrString(const http_addr_t *addr,    /* I - Address to convert */
   {
     unsigned temp;                     /* Temporary address */
 
-
     temp = ntohl(addr->ipv4.sin_addr.s_addr);
 
-    snprintf(s, slen, "%d.%d.%d.%d", (temp >> 24) & 255,
+    snprintf(s, (size_t)slen, "%d.%d.%d.%d", (temp >> 24) & 255,
              (temp >> 16) & 255, (temp >> 8) & 255, temp & 255);
   }
 #ifdef AF_INET6
@@ -573,8 +569,7 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
     {
       temp = ntohl(addr->ipv6.sin6_addr.s6_addr32[i]);
 
-      snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
-               (temp >> 16) & 0xffff);
+      snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, (temp >> 16) & 0xffff);
       prefix = ":";
       sptr += strlen(sptr);
 
@@ -582,7 +577,7 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
 
       if (temp || i == 3 || addr->ipv6.sin6_addr.s6_addr32[i + 1])
       {
-        snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix, temp);
+        snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, temp);
        sptr += strlen(sptr);
       }
     }
@@ -594,7 +589,7 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
 
       if (i < 4)
       {
-        snprintf(sptr, sizeof(temps) - (sptr - temps), "%s:", prefix);
+        snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s:", prefix);
        prefix = ":";
        sptr += strlen(sptr);
 
@@ -605,13 +600,11 @@ httpAddrString(const http_addr_t *addr,   /* I - Address to convert */
           if ((temp & 0xffff0000) ||
              (i > 0 && addr->ipv6.sin6_addr.s6_addr32[i - 1]))
          {
-            snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
-                    (temp >> 16) & 0xffff);
+            snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, (temp >> 16) & 0xffff);
            sptr += strlen(sptr);
           }
 
-          snprintf(sptr, sizeof(temps) - (sptr - temps), "%s%x", prefix,
-                  temp & 0xffff);
+          snprintf(sptr, sizeof(temps) - (size_t)(sptr - temps), "%s%x", prefix, temp & 0xffff);
          sptr += strlen(sptr);
        }
       }
@@ -629,7 +622,7 @@ httpAddrString(const http_addr_t *addr,     /* I - Address to convert */
        * Empty at end...
        */
 
-        strlcpy(sptr, "::", sizeof(temps) - (sptr - temps));
+        strlcpy(sptr, "::", sizeof(temps) - (size_t)(sptr - temps));
       }
     }
 #  endif /* HAVE_GETNAMEINFO */
@@ -638,11 +631,11 @@ httpAddrString(const http_addr_t *addr,   /* I - Address to convert */
     * Add "[v1." and "]" around IPv6 address to convert to URI form.
     */
 
-    snprintf(s, slen, "[v1.%s]", temps);
+    snprintf(s, (size_t)slen, "[v1.%s]", temps);
   }
 #endif /* AF_INET6 */
   else
-    strlcpy(s, "UNKNOWN", slen);
+    strlcpy(s, "UNKNOWN", (size_t)slen);
 
   DEBUG_printf(("1httpAddrString: returning \"%s\"...", s));
 
@@ -653,9 +646,13 @@ httpAddrString(const http_addr_t *addr,    /* I - Address to convert */
 /*
  * 'httpGetAddress()' - Get the address of the connected peer of a connection.
  *
+ * For connections created with @link httpConnect2@, the address is for the
+ * server.  For connections created with @link httpAccept@, the address is for
+ * the client.
+ *
  * Returns @code NULL@ if the socket is currently unconnected.
  *
- * @since CUPS 2.0@
+ * @since CUPS 2.0/OS 10.10@
  */
 
 http_addr_t *                          /* O - Connected address or @code NULL@ */
@@ -672,7 +669,7 @@ httpGetAddress(http_t *http)                /* I - HTTP connection */
  * 'httpGetHostByName()' - Lookup a hostname or IPv4 address, and return
  *                         address records for the specified name.
  *
- * @deprecated@
+ * @deprecated@ @exclude all@
  */
 
 struct hostent *                       /* O - Host entry */
@@ -786,7 +783,7 @@ httpGetHostByName(const char *name) /* I - Hostname or IP address */
  * Otherwise, return the FQDN for the local system using both gethostname()
  * and gethostbyname() to get the local hostname with domain.
  *
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
  */
 
 const char *                           /* O - FQDN for connection or system */
@@ -804,9 +801,9 @@ httpGetHostname(http_t *http,               /* I - HTTP connection or NULL */
        return (http->hostname);
     }
     else if (http->hostname[0] == '/')
-      strlcpy(s, "localhost", slen);
+      strlcpy(s, "localhost", (size_t)slen);
     else
-      strlcpy(s, http->hostname, slen);
+      strlcpy(s, http->hostname, (size_t)slen);
   }
   else
   {
@@ -818,7 +815,7 @@ httpGetHostname(http_t *http,               /* I - HTTP connection or NULL */
       return (NULL);
 
     if (gethostname(s, (size_t)slen) < 0)
-      strlcpy(s, "localhost", slen);
+      strlcpy(s, "localhost", (size_t)slen);
 
     if (!strchr(s, '.'))
     {
@@ -842,7 +839,7 @@ httpGetHostname(http_t *http,               /* I - HTTP connection or NULL */
         * Append ".local." to the hostname we get...
        */
 
-        snprintf(s, slen, "%s.local.", localStr);
+        snprintf(s, (size_t)slen, "%s.local.", localStr);
       }
 
       if (local)
@@ -863,10 +860,29 @@ httpGetHostname(http_t *http,             /* I - HTTP connection or NULL */
         * Use the resolved hostname...
        */
 
-       strlcpy(s, host->h_name, slen);
+       strlcpy(s, host->h_name, (size_t)slen);
       }
 #endif /* HAVE_SCDYNAMICSTORECOPYCOMPUTERNAME */
     }
+
+   /*
+    * Make sure .local hostnames end with a period...
+    */
+
+    if (strlen(s) > 6 && !strcmp(s + strlen(s) - 6, ".local"))
+      strlcat(s, ".", (size_t)slen);
+  }
+
+ /*
+  * Convert the hostname to lowercase as needed...
+  */
+
+  if (s[0] != '/')
+  {
+    char       *ptr;                   /* Pointer into string */
+
+    for (ptr = s; *ptr; ptr ++)
+      *ptr = (char)_cups_tolower((int)*ptr);
   }
 
  /*
@@ -881,7 +897,7 @@ httpGetHostname(http_t *http,               /* I - HTTP connection or NULL */
  * 'httpResolveHostname()' - Resolve the hostname of the HTTP connection
  *                           address.
  *
- * @since CUPS 2.0@
+ * @since CUPS 2.0/OS 10.10@
  */
 
 const char *                           /* O - Resolved hostname or @code NULL@ */
@@ -916,8 +932,3 @@ httpResolveHostname(http_t *http,   /* I - HTTP connection */
   else
     return (http->hostname);
 }
-
-
-/*
- * End of "$Id$".
- */