]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Update Bonjour support to resolve the server's hostname to a FQDN (not just a
authormike <mike@7a7537e8-13f0-0310-91df-b6672ffda945>
Fri, 29 Apr 2011 22:45:35 +0000 (22:45 +0000)
committermike <mike@7a7537e8-13f0-0310-91df-b6672ffda945>
Fri, 29 Apr 2011 22:45:35 +0000 (22:45 +0000)
.local name) when needed.

git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@9731 7a7537e8-13f0-0310-91df-b6672ffda945

cups/backend.c
cups/http-private.h
cups/http-support.c
cups/testhttp.c
cups/util.c
xcode/CUPS.xcodeproj/project.pbxproj

index d63628052bb223f09ba3e2d12b459d7b44d8fd96..d09794f8bdc81066ce64ac71bfdb972dbf54e95b 100644 (file)
@@ -50,8 +50,10 @@ static void  quote_string(const char *s);
 const char *                           /* O - Device URI or @code NULL@ */
 cupsBackendDeviceURI(char **argv)      /* I - Command-line arguments */
 {
-  const char   *device_uri;            /* Device URI */
+  const char   *device_uri,            /* Device URI */
+               *auth_info_required;    /* AUTH_INFO_REQUIRED env var */
   _cups_globals_t *cg = _cupsGlobals();        /* Global info */
+  int          options;                /* Resolve options */
 
 
   if ((device_uri = getenv("DEVICE_URI")) == NULL)
@@ -62,8 +64,13 @@ cupsBackendDeviceURI(char **argv)    /* I - Command-line arguments */
     device_uri = argv[0];
   }
 
+  options = _HTTP_RESOLVE_STDERR;
+  if ((auth_info_required = getenv("AUTH_INFO_REQUIRED")) != NULL &&
+      !strcmp(auth_info_required, "negotiate"))
+    options |= _HTTP_RESOLVE_FQDN;
+
   return (_httpResolveURI(device_uri, cg->resolved_uri,
-                          sizeof(cg->resolved_uri), 1, NULL, NULL));
+                          sizeof(cg->resolved_uri), options, NULL, NULL));
 }
 
 
index 63e9785d371db58cd1e9b6951dadafd6082180c4..f5dbebbde35bab7c145e1266a786751b3ca202fb 100644 (file)
@@ -136,6 +136,16 @@ extern "C" {
 #  endif /* __cplusplus */
 
 
+/*
+ * Constants...
+ */
+
+
+#define _HTTP_RESOLVE_DEFAULT  0       /* Just resolve with default options */
+#define _HTTP_RESOLVE_STDERR   1       /* Log resolve progress to stderr */
+#define _HTTP_RESOLVE_FQDN     2       /* Resolve to a FQDN */
+
+
 /*
  * Types and functions for SSL support...
  */
@@ -215,7 +225,6 @@ typedef void *http_tls_t;
 typedef void *http_tls_credentials_t;
 #  endif /* HAVE_LIBSSL */
 
-
 typedef int (*_http_timeout_cb_t)(http_t *http, void *user_data);
 
 struct _http_s                         /**** HTTP connection structure. ****/
@@ -365,7 +374,7 @@ extern char         *_httpEncodeURI(char *dst, const char *src,
 extern void            _httpFreeCredentials(http_tls_credentials_t credentials);
 extern ssize_t         _httpPeek(http_t *http, char *buffer, size_t length);
 extern const char      *_httpResolveURI(const char *uri, char *resolved_uri,
-                                        size_t resolved_size, int log,
+                                        size_t resolved_size, int options,
                                         int (*cb)(void *context),
                                         void *context);
 extern void            _httpSetTimeout(http_t *http, double timeout,
index a9ba050ed666965763d4624b8aff1404845dbbda..c0b34d78308db9c333ad5ce8302428c2a6f9f0da 100644 (file)
  *                          components.
  *   httpStatus()         - Return a short string describing a HTTP status code.
  *   _cups_hstrerror()    - hstrerror() emulation function for Solaris and
- *                          others...
+ *                          others.
  *   _httpDecodeURI()     - Percent-decode a HTTP request URI.
  *   _httpEncodeURI()     - Percent-encode a HTTP request URI.
  *   _httpResolveURI()    - Resolve a DNS-SD URI.
  *   http_copy_decode()   - Copy and decode a URI.
  *   http_copy_encode()   - Copy and encode a URI.
- *   resolve_callback()   - Build a device URI for the given service name.
+ *   http_resolve_cb()    - Build a device URI for the given service name.
  */
 
 /*
@@ -70,6 +70,7 @@ typedef struct _http_uribuf_s         /* URI buffer */
 {
   char         *buffer;                /* Pointer to buffer */
   size_t       bufsize;                /* Size of buffer */
+  int          options;                /* Options passed to _httpResolveURI */
 } _http_uribuf_t;
 
 
@@ -115,15 +116,15 @@ static char               *http_copy_encode(char *dst, const char *src,
                                          char *dstend, const char *reserved,
                                          const char *term, int encode);
 #ifdef HAVE_DNSSD
-static void DNSSD_API  resolve_callback(DNSServiceRef sdRef,
-                                        DNSServiceFlags flags,
-                                        uint32_t interfaceIndex,
-                                        DNSServiceErrorType errorCode,
-                                        const char *fullName,
-                                        const char *hostTarget,
-                                        uint16_t port, uint16_t txtLen,
-                                        const unsigned char *txtRecord,
-                                        void *context);
+static void DNSSD_API  http_resolve_cb(DNSServiceRef sdRef,
+                                       DNSServiceFlags flags,
+                                       uint32_t interfaceIndex,
+                                       DNSServiceErrorType errorCode,
+                                       const char *fullName,
+                                       const char *hostTarget,
+                                       uint16_t port, uint16_t txtLen,
+                                       const unsigned char *txtRecord,
+                                       void *context);
 #endif /* HAVE_DNSSD */
 
 
@@ -1319,7 +1320,7 @@ httpStatus(http_status_t status)  /* I - HTTP status code */
 
 #ifndef HAVE_HSTRERROR
 /*
- * '_cups_hstrerror()' - hstrerror() emulation function for Solaris and others...
+ * '_cups_hstrerror()' - hstrerror() emulation function for Solaris and others.
  */
 
 const char *                           /* O - Error string */
@@ -1382,7 +1383,7 @@ _httpResolveURI(
     const char *uri,                   /* I - DNS-SD URI */
     char       *resolved_uri,          /* I - Buffer for resolved URI */
     size_t     resolved_size,          /* I - Size of URI buffer */
-    int        logit,                  /* I - Log progress to stderr? */
+    int        options,                        /* I - Resolve options */
     int        (*cb)(void *context),   /* I - Continue callback function */
     void       *context)               /* I - Context pointer for callback */
 {
@@ -1416,7 +1417,7 @@ _httpResolveURI(
                      sizeof(resource)) < HTTP_URI_OK)
 #endif /* DEBUG */
   {
-    if (logit)
+    if (options & _HTTP_RESOLVE_STDERR)
       _cupsLangPrintFilter(stderr, "ERROR", _("Bad device-uri \"%s\"."), uri);
 
     DEBUG_printf(("6_httpResolveURI: httpSeparateURI returned %d!", status));
@@ -1449,7 +1450,7 @@ _httpResolveURI(
     struct timeval     stimeout;       /* Timeout value for select() */
 #endif /* HAVE_POLL */
 
-    if (logit)
+    if (options & _HTTP_RESOLVE_STDERR)
       fprintf(stderr, "DEBUG: Resolving \"%s\"...\n", hostname);
 
    /*
@@ -1484,14 +1485,14 @@ _httpResolveURI(
     if (domain)
       *domain++ = '\0';
 
-    uribuf.buffer  = resolved_uri;
-    uribuf.bufsize = resolved_size;
-
+    uribuf.buffer   = resolved_uri;
+    uribuf.bufsize  = resolved_size;
+    uribuf.options  = options;
     resolved_uri[0] = '\0';
 
     DEBUG_printf(("6_httpResolveURI: Resolving hostname=\"%s\", regtype=\"%s\", "
                   "domain=\"%s\"\n", hostname, regtype, domain));
-    if (logit)
+    if (options & _HTTP_RESOLVE_STDERR)
     {
       fputs("STATE: +connecting-to-device\n", stderr);
       fprintf(stderr, "DEBUG: Resolving \"%s\", regtype=\"%s\", "
@@ -1504,7 +1505,7 @@ _httpResolveURI(
     {
       localref = ref;
       if (DNSServiceResolve(&localref, kDNSServiceFlagsShareConnection, 0,
-                           hostname, regtype, "local.", resolve_callback,
+                           hostname, regtype, "local.", http_resolve_cb,
                            &uribuf) == kDNSServiceErr_NoError)
       {
        int     fds;                    /* Number of ready descriptors */
@@ -1513,7 +1514,7 @@ _httpResolveURI(
 
        for (;;)
        {
-         if (logit)
+         if (options & _HTTP_RESOLVE_STDERR)
            _cupsLangPrintFilter(stderr, "INFO", _("Looking for printer."));
 
          if (cb && !(*cb)(context))
@@ -1561,17 +1562,19 @@ _httpResolveURI(
            * comes in, do an additional domain resolution...
            */
 
-           if (domainsent == 0 && strcasecmp(domain, "local."))
+           if (domainsent == 0 && (domain && strcasecmp(domain, "local.")))
            {
-             if (logit)
+             if (options & _HTTP_RESOLVE_STDERR)
                fprintf(stderr,
                        "DEBUG: Resolving \"%s\", regtype=\"%s\", "
-                       "domain=\"%s\"...\n", hostname, regtype, domain);
+                       "domain=\"%s\"...\n", hostname, regtype,
+                       domain ? domain : "");
   
              domainref = ref;
-             if (DNSServiceResolve(&domainref, kDNSServiceFlagsShareConnection, 0,
-                                   hostname, regtype, domain, resolve_callback,
-                                   &uribuf) == kDNSServiceErr_NoError)
+             if (DNSServiceResolve(&domainref, kDNSServiceFlagsShareConnection,
+                                   0, hostname, regtype, domain,
+                                   http_resolve_cb, &uribuf)
+                     == kDNSServiceErr_NoError)
                domainsent = 1;
            }
 
@@ -1580,7 +1583,8 @@ _httpResolveURI(
            * printer-state-reason...
            */
 
-           if (logit && offline == 0 && time(NULL) > (start_time + 5))
+           if ((options & _HTTP_RESOLVE_STDERR) && offline == 0 &&
+               time(NULL) > (start_time + 5))
            {
              fputs("STATE: +offline-report\n", stderr);
              offline = 1;
@@ -1605,7 +1609,7 @@ _httpResolveURI(
       DNSServiceRefDeallocate(ref);
     }
 
-    if (logit)
+    if (options & _HTTP_RESOLVE_STDERR)
     {
       if (uri)
         fprintf(stderr, "DEBUG: Resolved as \"%s\"...\n", uri);
@@ -1623,7 +1627,7 @@ _httpResolveURI(
     uri = NULL;
 #endif /* HAVE_DNSSD */
 
-    if (logit && !uri)
+    if ((options & _HTTP_RESOLVE_STDERR) && !uri)
       _cupsLangPrintFilter(stderr, "ERROR", _("Unable to find printer."));
   }
 
@@ -1752,11 +1756,11 @@ http_copy_encode(char       *dst,       /* O - Destination buffer */
 
 #ifdef HAVE_DNSSD
 /*
- * 'resolve_callback()' - Build a device URI for the given service name.
+ * 'http_resolve_cb()' - Build a device URI for the given service name.
  */
 
 static void DNSSD_API
-resolve_callback(
+http_resolve_cb(
     DNSServiceRef       sdRef,         /* I - Service reference */
     DNSServiceFlags     flags,         /* I - Results flags */
     uint32_t            interfaceIndex,        /* I - Interface number */
@@ -1768,25 +1772,35 @@ resolve_callback(
     const unsigned char *txtRecord,    /* I - TXT record data */
     void                *context)      /* I - Pointer to URI buffer */
 {
-  const char           *scheme;        /* URI scheme */
-  char                 rp[257];        /* Remote printer */
+  const char           *scheme,        /* URI scheme */
+                       *hostptr;       /* Pointer into hostTarget */
+  char                 rp[257],        /* Remote printer */
+                       fqdn[256];      /* FQDN of the .local name */
   const void           *value;         /* Value from TXT record */
   uint8_t              valueLen;       /* Length of value */
   _http_uribuf_t       *uribuf;        /* URI buffer */
 
 
-  DEBUG_printf(("7resolve_callback(sdRef=%p, flags=%x, interfaceIndex=%u, "
+  DEBUG_printf(("7http_resolve_cb(sdRef=%p, flags=%x, interfaceIndex=%u, "
                "errorCode=%d, fullName=\"%s\", hostTarget=\"%s\", port=%u, "
                "txtLen=%u, txtRecord=%p, context=%p)", sdRef, flags,
                interfaceIndex, errorCode, fullName, hostTarget, port, txtLen,
                txtRecord, context));
 
+  uribuf = (_http_uribuf_t *)context;
+
  /*
   * Figure out the scheme from the full name...
   */
 
-  if (strstr(fullName, "._ipp") || strstr(fullName, "._fax-ipp"))
+  if (strstr(fullName, "._ipps") || strstr(fullName, "._ipp-tls"))
+    scheme = "ipps";
+  else if (strstr(fullName, "._ipp") || strstr(fullName, "._fax-ipp"))
     scheme = "ipp";
+  else if (strstr(fullName, "._http."))
+    scheme = "http";
+  else if (strstr(fullName, "._https."))
+    scheme = "https";
   else if (strstr(fullName, "._printer."))
     scheme = "lpd";
   else if (strstr(fullName, "._pdl-datastream."))
@@ -1813,16 +1827,61 @@ resolve_callback(
     rp[0] = '\0';
 
  /*
-  * Assemble the final device URI...
+  * Lookup the FQDN if needed...
   */
 
-  uribuf = (_http_uribuf_t *)context;
+  if ((uribuf->options & _HTTP_RESOLVE_FQDN) &&
+      (hostptr = hostTarget + strlen(hostTarget) - 7) > hostTarget &&
+      !strcasecmp(hostptr, ".local."))
+  {
+   /*
+    * OK, we got a .local name but the caller needs a real domain.  Start by
+    * getting the IP address of the .local name and then do reverse-lookups...
+    */
+
+    http_addrlist_t    *addrlist,      /* List of addresses */
+                       *addr;          /* Current address */
+
+    DEBUG_printf(("8http_resolve_cb: Looking up \"%s\".", hostTarget));
+
+    snprintf(fqdn, sizeof(fqdn), "%d", ntohs(port));
+    if ((addrlist = httpAddrGetList(hostTarget, AF_UNSPEC, fqdn)) != NULL)
+    {
+      for (addr = addrlist; addr; addr = addr->next)
+      {
+        int error = getnameinfo(&(addr->addr.addr),
+                               httpAddrLength(&(addr->addr)),
+                               fqdn, sizeof(fqdn), NULL, 0, NI_NAMEREQD);
+
+        if (!error)
+       {
+         DEBUG_printf(("8http_resolve_cb: Found \"%s\".", fqdn));
+
+         if ((hostptr = fqdn + strlen(fqdn) - 6) <= fqdn ||
+             strcasecmp(hostptr, ".local"))
+         {
+           hostTarget = fqdn;
+           break;
+         }
+       }
+#ifdef DEBUG
+       else
+         DEBUG_printf(("8http_resolve_cb: \"%s\" did not resolve: %d",
+                       httpAddrString(&(addr->addr), fqdn, sizeof(fqdn)),
+                       error));
+#endif /* DEBUG */
+      }
+    }
+  }
+
+ /*
+  * Assemble the final device URI...
+  */
 
   httpAssembleURI(HTTP_URI_CODING_ALL, uribuf->buffer, uribuf->bufsize, scheme,
                   NULL, hostTarget, ntohs(port), rp);
 
-  DEBUG_printf(("8resolve_callback: Resolved URI is \"%s\"...",
-                uribuf->buffer));
+  DEBUG_printf(("8http_resolve_cb: Resolved URI is \"%s\"...", uribuf->buffer));
 }
 #endif /* HAVE_DNSSD */
 
index dacdb6ffb5c5d571a8a9e6056c8b730f5ea261ce..3b752f4cd3d1ea7197f3521d2b8193ba96789f30 100644 (file)
@@ -465,14 +465,32 @@ main(int  argc,                           /* I - Number of command-line arguments */
     char       resolved[1024];         /* Resolved URI */
 
 
-    printf("_httpResolveURI(%s): ", argv[1]);
+    printf("_httpResolveURI(%s, _HTTP_RESOLVE_DEFAULT): ", argv[1]);
     fflush(stdout);
 
-    if (!_httpResolveURI(argv[1], resolved, sizeof(resolved), 1, NULL, NULL))
+    if (!_httpResolveURI(argv[1], resolved, sizeof(resolved),
+                         _HTTP_RESOLVE_DEFAULT, NULL, NULL))
     {
       puts("FAIL");
       return (1);
     }
+    else
+      printf("PASS (%s)\n", resolved);
+
+    printf("_httpResolveURI(%s, _HTTP_RESOLVE_FQDN): ", argv[1]);
+    fflush(stdout);
+
+    if (!_httpResolveURI(argv[1], resolved, sizeof(resolved),
+                         _HTTP_RESOLVE_FQDN, NULL, NULL))
+    {
+      puts("FAIL");
+      return (1);
+    }
+    else if (strstr(resolved, ".local:"))
+    {
+      printf("FAIL (%s)\n", resolved);
+      return (1);
+    }
     else
     {
       printf("PASS (%s)\n", resolved);
index c36c7aaada7b48a005067c7f2cf4b73bc7761a4c..1625fb9b1bff4a6e6fbcdc95cd93c1644531944d 100644 (file)
@@ -3,7 +3,7 @@
  *
  *   Printing utilities for CUPS.
  *
- *   Copyright 2007-2010 by Apple Inc.
+ *   Copyright 2007-2011 by Apple Inc.
  *   Copyright 1997-2006 by Easy Software Products.
  *
  *   These coded instructions, statements, and computer programs are the
@@ -1762,7 +1762,8 @@ cups_get_printer_uri(
     {
       httpSeparateURI(HTTP_URI_CODING_ALL,
                       _httpResolveURI(attr->values[0].string.text, uri,
-                                     sizeof(uri), 0, NULL, NULL),
+                                     sizeof(uri), _HTTP_RESOLVE_DEFAULT,
+                                     NULL, NULL),
                       scheme, sizeof(scheme), username, sizeof(username),
                      host, hostsize, port, resource, resourcesize);
       ippDelete(response);
index d81d45f0ffe13674fd650c508410be00c170a9fe..a4c5c0745d5f90732efb53b476a863ca662ed143 100644 (file)
@@ -14,8 +14,9 @@
                        );
                        dependencies = (
                                726AD704135E8AA1002C930D /* PBXTargetDependency */,
-                               270CCDB2135E3CDE00007BE2 /* PBXTargetDependency */,
                                273BF6DE1333B6370022CAAB /* PBXTargetDependency */,
+                               278C58D6136B641D00836530 /* PBXTargetDependency */,
+                               270CCDB2135E3CDE00007BE2 /* PBXTargetDependency */,
                        );
                        name = Tests;
                        productName = Tests;
                276683FD1337F7B8000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
                2766840F1337FA38000D33D0 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
                276684111337FA7C000D33D0 /* cupsaddsmb.c in Sources */ = {isa = PBXBuildFile; fileRef = 276684101337FA7C000D33D0 /* cupsaddsmb.c */; };
+               278C58D9136B645C00836530 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A4C1336F31B004BB496 /* libcups_static.a */; };
+               278C58DE136B645C00836530 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58DA136B645C00836530 /* CoreFoundation.framework */; };
+               278C58DF136B645C00836530 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58DB136B645C00836530 /* Kerberos.framework */; };
+               278C58E0136B645C00836530 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58DC136B645C00836530 /* libresolv.dylib */; };
+               278C58E1136B645C00836530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58DD136B645C00836530 /* SystemConfiguration.framework */; };
+               278C58E3136B647200836530 /* testhttp.c in Sources */ = {isa = PBXBuildFile; fileRef = 278C58E2136B647200836530 /* testhttp.c */; };
+               278C58E4136B649200836530 /* libcups_static.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 72F75A4C1336F31B004BB496 /* libcups_static.a */; };
+               278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E5136B64AF00836530 /* CoreFoundation.framework */; };
+               278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E6136B64B000836530 /* Kerberos.framework */; };
+               278C58EB136B64B000836530 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E7136B64B000836530 /* Security.framework */; };
+               278C58EC136B64B000836530 /* SystemConfiguration.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58E8136B64B000836530 /* SystemConfiguration.framework */; };
+               278C58EF136B64C400836530 /* libresolv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58ED136B64C300836530 /* libresolv.dylib */; };
+               278C58F0136B64C400836530 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58EE136B64C400836530 /* libz.dylib */; };
+               278C58F2136B64FE00836530 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58F1136B64FD00836530 /* libiconv.dylib */; };
+               278C58F5136B652300836530 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58F3136B652300836530 /* libiconv.dylib */; };
+               278C58F6136B652300836530 /* Security.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58F4136B652300836530 /* Security.framework */; };
+               278C58F8136B653800836530 /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 278C58F7136B653800836530 /* libz.dylib */; };
                720DD6CD1358FD720064AA82 /* libcups.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 72220EAE1333047D00FCA411 /* libcups.dylib */; };
                720DD6D31358FDDE0064AA82 /* snmp.c in Sources */ = {isa = PBXBuildFile; fileRef = 720DD6D21358FDDE0064AA82 /* snmp.c */; };
                720DD6D413590AB90064AA82 /* ieee1284.c in Sources */ = {isa = PBXBuildFile; fileRef = 724379CA1334000E009631B9 /* ieee1284.c */; };
                        remoteGlobalIDString = 276684031337FA1D000D33D0;
                        remoteInfo = cupsaddsmb;
                };
+               278C58D5136B641D00836530 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 278C58CA136B640300836530;
+                       remoteInfo = testhttp;
+               };
+               278C58D7136B642F00836530 /* PBXContainerItemProxy */ = {
+                       isa = PBXContainerItemProxy;
+                       containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
+                       proxyType = 1;
+                       remoteGlobalIDString = 274FF6891333B1C400317ECB;
+                       remoteInfo = libcups_static;
+               };
                720DD6CE1358FD790064AA82 /* PBXContainerItemProxy */ = {
                        isa = PBXContainerItemProxy;
                        containerPortal = 72BF96371333042100B1EAD7 /* Project object */;
                        );
                        runOnlyForDeploymentPostprocessing = 1;
                };
+               278C58C9136B640300836530 /* CopyFiles */ = {
+                       isa = PBXCopyFilesBuildPhase;
+                       buildActionMask = 2147483647;
+                       dstPath = /usr/share/man/man1/;
+                       dstSubfolderSpec = 0;
+                       files = (
+                       );
+                       runOnlyForDeploymentPostprocessing = 1;
+               };
                720DD6C01358FD5F0064AA82 /* CopyFiles */ = {
                        isa = PBXCopyFilesBuildPhase;
                        buildActionMask = 2147483647;
                276683F91337F7A9000D33D0 /* ipptool.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = ipptool.c; path = ../test/ipptool.c; sourceTree = "<group>"; };
                276684041337FA1D000D33D0 /* cupsaddsmb */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = cupsaddsmb; sourceTree = BUILT_PRODUCTS_DIR; };
                276684101337FA7C000D33D0 /* cupsaddsmb.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = cupsaddsmb.c; path = ../systemv/cupsaddsmb.c; sourceTree = "<group>"; };
+               278C58CB136B640300836530 /* testhttp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = testhttp; sourceTree = BUILT_PRODUCTS_DIR; };
+               278C58DA136B645C00836530 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/CoreFoundation.framework; sourceTree = DEVELOPER_DIR; };
+               278C58DB136B645C00836530 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Kerberos.framework; sourceTree = DEVELOPER_DIR; };
+               278C58DC136B645C00836530 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libresolv.dylib; sourceTree = DEVELOPER_DIR; };
+               278C58DD136B645C00836530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/SystemConfiguration.framework; sourceTree = DEVELOPER_DIR; };
+               278C58E2136B647200836530 /* testhttp.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = testhttp.c; path = ../cups/testhttp.c; sourceTree = "<group>"; };
+               278C58E5136B64AF00836530 /* CoreFoundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreFoundation.framework; path = ../../../../../System/Library/Frameworks/CoreFoundation.framework; sourceTree = "<group>"; };
+               278C58E6136B64B000836530 /* Kerberos.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Kerberos.framework; path = ../../../../../System/Library/Frameworks/Kerberos.framework; sourceTree = "<group>"; };
+               278C58E7136B64B000836530 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = ../../../../../System/Library/Frameworks/Security.framework; sourceTree = "<group>"; };
+               278C58E8136B64B000836530 /* SystemConfiguration.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SystemConfiguration.framework; path = ../../../../../System/Library/Frameworks/SystemConfiguration.framework; sourceTree = "<group>"; };
+               278C58ED136B64C300836530 /* libresolv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libresolv.dylib; path = ../../../../../usr/lib/libresolv.dylib; sourceTree = "<group>"; };
+               278C58EE136B64C400836530 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = ../../../../../usr/lib/libz.dylib; sourceTree = "<group>"; };
+               278C58F1136B64FD00836530 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = ../../../../../usr/lib/libiconv.dylib; sourceTree = "<group>"; };
+               278C58F3136B652300836530 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libiconv.dylib; sourceTree = DEVELOPER_DIR; };
+               278C58F4136B652300836530 /* Security.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Security.framework; path = SDKs/MacOSX10.6.sdk/System/Library/Frameworks/Security.framework; sourceTree = DEVELOPER_DIR; };
+               278C58F7136B653800836530 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = SDKs/MacOSX10.6.sdk/usr/lib/libz.dylib; sourceTree = DEVELOPER_DIR; };
                27D3037C134148CB00F022B1 /* libcups_s.exp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.exports; name = libcups_s.exp; path = ../cups/libcups_s.exp; sourceTree = "<group>"; };
                27D3037D134148CB00F022B1 /* libcups2.def */ = {isa = PBXFileReference; lastKnownFileType = text; name = libcups2.def; path = ../cups/libcups2.def; sourceTree = "<group>"; };
                720DD6C21358FD5F0064AA82 /* snmp */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.executable"; includeInIndex = 0; path = snmp; sourceTree = BUILT_PRODUCTS_DIR; };
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               278C58E9136B64B000836530 /* CoreFoundation.framework in Frameworks */,
+                               278C58EA136B64B000836530 /* Kerberos.framework in Frameworks */,
+                               278C58EB136B64B000836530 /* Security.framework in Frameworks */,
+                               278C58EC136B64B000836530 /* SystemConfiguration.framework in Frameworks */,
                                270CCDB9135E3D0900007BE2 /* libcups_static.a in Frameworks */,
                                270CCDBA135E3D0900007BE2 /* libcupsmime.dylib in Frameworks */,
+                               278C58F2136B64FE00836530 /* libiconv.dylib in Frameworks */,
+                               278C58EF136B64C400836530 /* libresolv.dylib in Frameworks */,
+                               278C58F0136B64C400836530 /* libz.dylib in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                        files = (
+                               278C58E4136B649200836530 /* libcups_static.a in Frameworks */,
                                273BF6CE1333B5950022CAAB /* CoreFoundation.framework in Frameworks */,
                                273BF6D31333B5C30022CAAB /* Kerberos.framework in Frameworks */,
                                273BF6D41333B5C30022CAAB /* Security.framework in Frameworks */,
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               278C58C8136B640300836530 /* Frameworks */ = {
+                       isa = PBXFrameworksBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               278C58DE136B645C00836530 /* CoreFoundation.framework in Frameworks */,
+                               278C58DF136B645C00836530 /* Kerberos.framework in Frameworks */,
+                               278C58F6136B652300836530 /* Security.framework in Frameworks */,
+                               278C58E1136B645C00836530 /* SystemConfiguration.framework in Frameworks */,
+                               278C58D9136B645C00836530 /* libcups_static.a in Frameworks */,
+                               278C58F5136B652300836530 /* libiconv.dylib in Frameworks */,
+                               278C58E0136B645C00836530 /* libresolv.dylib in Frameworks */,
+                               278C58F8136B653800836530 /* libz.dylib in Frameworks */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                720DD6BF1358FD5F0064AA82 /* Frameworks */ = {
                        isa = PBXFrameworksBuildPhase;
                        buildActionMask = 2147483647;
                273BF6B81333B4A90022CAAB /* tests */ = {
                        isa = PBXGroup;
                        children = (
-                               270CCDBB135E3D3E00007BE2 /* testmime.c */,
                                273BF6C61333B5370022CAAB /* testcups.c */,
+                               278C58E2136B647200836530 /* testhttp.c */,
+                               270CCDBB135E3D3E00007BE2 /* testmime.c */,
                        );
                        name = tests;
                        sourceTree = "<group>";
                                720DD6C21358FD5F0064AA82 /* snmp */,
                                270CCDA7135E3C9E00007BE2 /* testmime */,
                                726AD6F7135E88F0002C930D /* ippserver */,
+                               278C58CB136B640300836530 /* testhttp */,
                        );
                        name = Products;
                        sourceTree = "<group>";
                72220FB113330B4A00FCA411 /* Frameworks */ = {
                        isa = PBXGroup;
                        children = (
-                               72F75A4C1336F31B004BB496 /* libcups_static.a */,
                                72220FAC13330B2200FCA411 /* libcupsmime.dylib */,
                                72220EAE1333047D00FCA411 /* libcups.dylib */,
                                72F75A611336F9A3004BB496 /* libcupsimage.dylib */,
                72BF96351333042100B1EAD7 = {
                        isa = PBXGroup;
                        children = (
+                               278C58F7136B653800836530 /* libz.dylib */,
+                               278C58F3136B652300836530 /* libiconv.dylib */,
+                               278C58F4136B652300836530 /* Security.framework */,
+                               278C58F1136B64FD00836530 /* libiconv.dylib */,
+                               278C58ED136B64C300836530 /* libresolv.dylib */,
+                               278C58EE136B64C400836530 /* libz.dylib */,
+                               278C58E5136B64AF00836530 /* CoreFoundation.framework */,
+                               278C58E6136B64B000836530 /* Kerberos.framework */,
+                               278C58E7136B64B000836530 /* Security.framework */,
+                               278C58E8136B64B000836530 /* SystemConfiguration.framework */,
+                               72F75A4C1336F31B004BB496 /* libcups_static.a */,
+                               278C58DA136B645C00836530 /* CoreFoundation.framework */,
+                               278C58DB136B645C00836530 /* Kerberos.framework */,
+                               278C58DC136B645C00836530 /* libresolv.dylib */,
+                               278C58DD136B645C00836530 /* SystemConfiguration.framework */,
                                72220FB113330B4A00FCA411 /* Frameworks */,
                                72220F45133305D000FCA411 /* Public Headers */,
                                72220F461333060C00FCA411 /* Private Headers */,
                        productReference = 276684041337FA1D000D33D0 /* cupsaddsmb */;
                        productType = "com.apple.product-type.tool";
                };
+               278C58CA136B640300836530 /* testhttp */ = {
+                       isa = PBXNativeTarget;
+                       buildConfigurationList = 278C58D3136B640300836530 /* Build configuration list for PBXNativeTarget "testhttp" */;
+                       buildPhases = (
+                               278C58C7136B640300836530 /* Sources */,
+                               278C58C8136B640300836530 /* Frameworks */,
+                               278C58C9136B640300836530 /* CopyFiles */,
+                       );
+                       buildRules = (
+                       );
+                       dependencies = (
+                               278C58D8136B642F00836530 /* PBXTargetDependency */,
+                       );
+                       name = testhttp;
+                       productName = testhttp;
+                       productReference = 278C58CB136B640300836530 /* testhttp */;
+                       productType = "com.apple.product-type.tool";
+               };
                720DD6C11358FD5F0064AA82 /* snmp */ = {
                        isa = PBXNativeTarget;
                        buildConfigurationList = 720DD6CB1358FD600064AA82 /* Build configuration list for PBXNativeTarget "snmp" */;
                        };
                        buildConfigurationList = 72BF963A1333042100B1EAD7 /* Build configuration list for PBXProject "CUPS" */;
                        compatibilityVersion = "Xcode 3.2";
+                       developmentRegion = English;
                        hasScannedForEncodings = 0;
                        knownRegions = (
                                en,
                                720DD6C11358FD5F0064AA82 /* snmp */,
                                7243792F1333FB85009631B9 /* socket */,
                                273BF6BC1333B5000022CAAB /* testcups */,
+                               278C58CA136B640300836530 /* testhttp */,
                                270CCDA6135E3C9E00007BE2 /* testmime */,
                                7243795A1333FF1D009631B9 /* usb */,
                        );
                        );
                        runOnlyForDeploymentPostprocessing = 0;
                };
+               278C58C7136B640300836530 /* Sources */ = {
+                       isa = PBXSourcesBuildPhase;
+                       buildActionMask = 2147483647;
+                       files = (
+                               278C58E3136B647200836530 /* testhttp.c in Sources */,
+                       );
+                       runOnlyForDeploymentPostprocessing = 0;
+               };
                720DD6BE1358FD5F0064AA82 /* Sources */ = {
                        isa = PBXSourcesBuildPhase;
                        buildActionMask = 2147483647;
                        target = 276684031337FA1D000D33D0 /* cupsaddsmb */;
                        targetProxy = 276684121337FA8D000D33D0 /* PBXContainerItemProxy */;
                };
+               278C58D6136B641D00836530 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 278C58CA136B640300836530 /* testhttp */;
+                       targetProxy = 278C58D5136B641D00836530 /* PBXContainerItemProxy */;
+               };
+               278C58D8136B642F00836530 /* PBXTargetDependency */ = {
+                       isa = PBXTargetDependency;
+                       target = 274FF6891333B1C400317ECB /* libcups_static */;
+                       targetProxy = 278C58D7136B642F00836530 /* PBXContainerItemProxy */;
+               };
                720DD6CF1358FD790064AA82 /* PBXTargetDependency */ = {
                        isa = PBXTargetDependency;
                        target = 72220EAD1333047D00FCA411 /* libcups */;
                        };
                        name = Release;
                };
+               278C58D1136B640300836530 /* Debug */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               ARCHS = "$(ARCHS_STANDARD_32_64_BIT)";
+                               COPY_PHASE_STRIP = NO;
+                               GCC_C_LANGUAGE_STANDARD = gnu99;
+                               GCC_DYNAMIC_NO_PIC = NO;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_OPTIMIZATION_LEVEL = 0;
+                               GCC_PREPROCESSOR_DEFINITIONS = DEBUG;
+                               GCC_SYMBOLS_PRIVATE_EXTERN = NO;
+                               GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_ABOUT_RETURN_TYPE = YES;
+                               GCC_WARN_UNUSED_VARIABLE = YES;
+                               MACOSX_DEPLOYMENT_TARGET = 10.6;
+                               ONLY_ACTIVE_ARCH = YES;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                               SDKROOT = macosx;
+                       };
+                       name = Debug;
+               };
+               278C58D2136B640300836530 /* Release */ = {
+                       isa = XCBuildConfiguration;
+                       buildSettings = {
+                               ALWAYS_SEARCH_USER_PATHS = NO;
+                               COPY_PHASE_STRIP = YES;
+                               DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+                               GCC_C_LANGUAGE_STANDARD = gnu99;
+                               GCC_ENABLE_OBJC_EXCEPTIONS = YES;
+                               GCC_VERSION = com.apple.compilers.llvm.clang.1_0;
+                               GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+                               GCC_WARN_ABOUT_RETURN_TYPE = YES;
+                               GCC_WARN_UNUSED_VARIABLE = YES;
+                               MACOSX_DEPLOYMENT_TARGET = 10.6;
+                               PRODUCT_NAME = "$(TARGET_NAME)";
+                       };
+                       name = Release;
+               };
                720DD6C91358FD5F0064AA82 /* Debug */ = {
                        isa = XCBuildConfiguration;
                        buildSettings = {
                        defaultConfigurationIsVisible = 0;
                        defaultConfigurationName = Release;
                };
+               278C58D3136B640300836530 /* Build configuration list for PBXNativeTarget "testhttp" */ = {
+                       isa = XCConfigurationList;
+                       buildConfigurations = (
+                               278C58D1136B640300836530 /* Debug */,
+                               278C58D2136B640300836530 /* Release */,
+                       );
+                       defaultConfigurationIsVisible = 0;
+               };
                720DD6CB1358FD600064AA82 /* Build configuration list for PBXNativeTarget "snmp" */ = {
                        isa = XCConfigurationList;
                        buildConfigurations = (