]> git.ipfire.org Git - thirdparty/cups.git/commitdiff
Dates in non-UTF-8 locales did not display correctly (STR #4388)
authormsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Thu, 22 May 2014 13:54:15 +0000 (13:54 +0000)
committermsweet <msweet@a1ca3aef-8c08-0410-bb20-df032aa958be>
Thu, 22 May 2014 13:54:15 +0000 (13:54 +0000)
git-svn-id: svn+ssh://src.apple.com/svn/cups/cups.org/trunk@11889 a1ca3aef-8c08-0410-bb20-df032aa958be

CHANGES-1.7.txt
cgi-bin/ipp-var.c
cups/libcups2.def
cups/string-private.h
cups/string.c
cups/testipp.c
scheduler/testsub.c
systemv/lpstat.c
xcode/CUPS.xcodeproj/project.pbxproj

index 9a1fef02bc7e9c0a3bd1fb6018a9b400665fa049..15c810f550b713be55a002a2cdfc36d9074176ca 100644 (file)
@@ -26,6 +26,7 @@ CHANGES IN CUPS V1.7.3
        - Auto-typing of PWG Raster files did not work (STR #4417)
        - IPP queues using hardcoded credentials would ask for credentials
          (STR #4371)
+       - Dates in non-UTF-8 locales did not display correctly (STR #4388)
 
 
 CHANGES IN CUPS V1.7.2
index 764cf8a4da17d27e6d4bdda5d10bf28950a35165..9682d791ea48f561a891813eee20d452c41a13e6 100644 (file)
@@ -939,7 +939,6 @@ cgiSetIPPObjectVars(
                        *nameptr,       /* Pointer into name */
                        value[16384],   /* Value(s) */
                        *valptr;        /* Pointer into value */
-  struct tm            *date;          /* Date information */
 
 
   fprintf(stderr, "DEBUG2: cgiSetIPPObjectVars(obj=%p, prefix=\"%s\", "
@@ -1167,17 +1166,9 @@ cgiSetIPPObjectVars(
        case IPP_TAG_INTEGER :
        case IPP_TAG_ENUM :
            if (strncmp(name, "time_at_", 8) == 0)
-           {
-             time_t    t;              /* Temporary time value */
-
-              t    = (time_t)attr->values[i].integer;
-             date = localtime(&t);
-
-             strftime(valptr, sizeof(value) - (size_t)(valptr - value), "%c", date);
-           }
+             _cupsStrDate(valptr, sizeof(value) - (size_t)(valptr - value), (time_t)ippGetInteger(attr, i));
            else
-             snprintf(valptr, sizeof(value) - (size_t)(valptr - value),
-                      "%d", attr->values[i].integer);
+             snprintf(valptr, sizeof(value) - (size_t)(valptr - value), "%d", ippGetInteger(attr, i));
            break;
 
        case IPP_TAG_BOOLEAN :
index 5b7f9fc1671476f4f19bd666502199c5938d0021..d74e8d933e5231cd4aebf0a988730bd0d2594996 100644 (file)
@@ -23,6 +23,7 @@ _cupsNextDelay
 _cupsSetError\r
 _cupsSetLocale\r
 _cupsStrAlloc\r
+_cupsStrDate\r
 _cupsStrFlush\r
 _cupsStrFormatd\r
 _cupsStrFree\r
index 8255bfdfb1a62b1dd5277963cecaf2c7990cde7e..1a02be1cf64511262c6e93c326686cd25d9e48fa 100644 (file)
@@ -1,18 +1,18 @@
 /*
  * "$Id$"
  *
- *   Private string definitions for CUPS.
+ * Private string definitions for CUPS.
  *
- *   Copyright 2007-2013 by Apple Inc.
- *   Copyright 1997-2006 by Easy Software Products.
+ * Copyright 2007-2014 by Apple Inc.
+ * Copyright 1997-2006 by Easy Software Products.
  *
- *   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/".
+ * 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/".
  *
- *   This file is subject to the Apple OS-Developed Software exception.
+ * This file is subject to the Apple OS-Developed Software exception.
  */
 
 #ifndef _CUPS_STRING_PRIVATE_H_
@@ -28,6 +28,7 @@
 #  include <ctype.h>
 #  include <errno.h>
 #  include <locale.h>
+#  include <time.h>
 
 #  include "config.h"
 
@@ -199,6 +200,13 @@ extern double      _cupsStrScand(const char *buf, char **bufptr,
                              struct lconv *loc);
 
 
+/*
+ * Date function...
+ */
+
+extern char    *_cupsStrDate(char *buf, size_t bufsize, time_t timeval);
+
+
 /*
  * C++ magic...
  */
index ce5d9e987c633b3f7a394e88f00e4ff3cba0d3cc..19d1224f4aa0ca1402cdb3633e66ba33d9b2570c 100644 (file)
  */
 
 #define _CUPS_STRING_C_
-#include "string-private.h"
-#include "debug-private.h"
-#include "thread-private.h"
-#include "array.h"
+#include "cups-private.h"
 #include <stddef.h>
 #include <limits.h>
 
@@ -144,6 +141,39 @@ _cupsStrAlloc(const char *s)               /* I - String */
 }
 
 
+/*
+ * '_cupsStrDate()' - Return a localized date for a given time value.
+ *
+ * This function works around the locale encoding issues of strftime...
+ */
+
+char *                                 /* O - Buffer */
+_cupsStrDate(char   *buf,              /* I - Buffer */
+             size_t bufsize,           /* I - Size of buffer */
+            time_t timeval)            /* I - Time value */
+{
+  struct tm    *dateval;               /* Local date/time */
+  char         temp[1024];             /* Temporary buffer */
+  _cups_globals_t *cg = _cupsGlobals();        /* Per-thread globals */
+
+
+  if (!cg->lang_default)
+    cg->lang_default = cupsLangDefault();
+
+  dateval = localtime(&timeval);
+
+  if (cg->lang_default->encoding != CUPS_UTF8)
+  {
+    strftime(temp, sizeof(temp), "%c", dateval);
+    cupsCharsetToUTF8((cups_utf8_t *)buf, temp, (int)bufsize, cg->lang_default->encoding);
+  }
+  else
+    strftime(buf, bufsize, "%c", dateval);
+
+  return (buf);
+}
+
+
 /*
  * '_cupsStrFlush()' - Flush the string pool.
  */
index 6303738b749b20f61e3246e82c4689f762efc47e..2540ff4829fd1a0d34c49f0c532fcbecf16613d8 100644 (file)
@@ -940,17 +940,10 @@ print_attributes(ipp_t *ipp,              /* I - IPP request */
 
       case IPP_TAG_DATE :
           {
-           time_t      vtime;          /* Date/Time value */
-           struct tm   *vdate;         /* Date info */
            char        vstring[256];   /* Formatted time */
 
            for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++)
-           {
-             vtime = ippDateToTime(val->date);
-             vdate = localtime(&vtime);
-             strftime(vstring, sizeof(vstring), "%c", vdate);
-             printf(" (%s)", vstring);
-           }
+             printf(" (%s)", _cupsStrDate(vstring, sizeof(vstring), ippDateToTime(val->date)));
           }
           putchar('\n');
           break;
index f8fec4973aec56d9c7f4278afb497e822d87a812..56bc3a42c2a6e0149149cc299fa0e44300d13e12 100644 (file)
@@ -428,17 +428,10 @@ print_attributes(ipp_t *ipp,              /* I - IPP request */
 
       case IPP_TAG_DATE :
           {
-           time_t      vtime;          /* Date/Time value */
-           struct tm   *vdate;         /* Date info */
            char        vstring[256];   /* Formatted time */
 
            for (i = 0, val = attr->values; i < attr->num_values; i ++, val ++)
-           {
-             vtime = ippDateToTime(val->date);
-             vdate = localtime(&vtime);
-             strftime(vstring, sizeof(vstring), "%c", vdate);
-             printf(" (%s)", vstring);
-           }
+             printf(" (%s)", _cupsStrDate(vstring, sizeof(vstring), ippDateToTime(val->date)));
           }
           putchar('\n');
           break;
index 084fc55c0ee30e9f1d5feb5c887decdffbf25e5f..985db37b7c1e5db0d80fe5f1b1af2875859bf779 100644 (file)
@@ -649,7 +649,6 @@ show_accepting(const char  *printers,       /* I - Destinations */
                *message;               /* Printer device URI */
   int          accepting;              /* Accepting requests? */
   time_t       ptime;                  /* Printer state time */
-  struct tm    *pdate;                 /* Printer state date & time */
   char         printer_state_time[255];/* Printer state time */
   static const char *pattrs[] =                /* Attributes we need for printers... */
                {
@@ -772,8 +771,7 @@ show_accepting(const char  *printers,       /* I - Destinations */
 
       if (match_list(printers, printer))
       {
-        pdate = localtime(&ptime);
-        strftime(printer_state_time, sizeof(printer_state_time), "%c", pdate);
+        _cupsStrDate(printer_state_time, sizeof(printer_state_time), ptime);
 
         if (accepting)
          _cupsLangPrintf(stdout, _("%s accepting requests since %s"),
@@ -1278,7 +1276,6 @@ show_jobs(const char *dests,              /* I - Destinations */
                jobid,                  /* job-id */
                size;                   /* job-k-octets */
   time_t       jobtime;                /* time-at-creation */
-  struct tm    *jobdate;               /* Date & time */
   char         temp[255],              /* Temporary buffer */
                date[255];              /* Date buffer */
   static const char *jattrs[] =                /* Attributes we need for jobs... */
@@ -1436,60 +1433,42 @@ show_jobs(const char *dests,            /* I - Destinations */
 
       if (match_list(dests, dest) && match_list(users, username))
       {
-        jobdate = localtime(&jobtime);
         snprintf(temp, sizeof(temp), "%s-%d", dest, jobid);
 
-        if (long_status == 3)
-       {
-        /*
-         * Show the consolidated output format for the SGI tools...
-         */
+       _cupsStrDate(date, sizeof(date), jobtime);
 
-         if (!strftime(date, sizeof(date), "%b %d %H:%M", jobdate))
-           strlcpy(date, "Unknown", sizeof(date));
-
-         _cupsLangPrintf(stdout, "%s;%s;%d;%s;%s",
-                         temp, username ? username : "unknown",
-                         size, title ? title : "unknown", date);
-       }
+       if (ranking)
+         _cupsLangPrintf(stdout, "%3d %-21s %-13s %8.0f %s",
+                         rank, temp, username ? username : "unknown",
+                         1024.0 * size, date);
        else
+         _cupsLangPrintf(stdout, "%-23s %-13s %8.0f   %s",
+                         temp, username ? username : "unknown",
+                         1024.0 * size, date);
+       if (long_status)
        {
-         if (!strftime(date, sizeof(date), "%c", jobdate))
-           strlcpy(date, "Unknown", sizeof(date));
-
-          if (ranking)
-           _cupsLangPrintf(stdout, "%3d %-21s %-13s %8.0f %s",
-                           rank, temp, username ? username : "unknown",
-                           1024.0 * size, date);
-          else
-           _cupsLangPrintf(stdout, "%-23s %-13s %8.0f   %s",
-                           temp, username ? username : "unknown",
-                           1024.0 * size, date);
-          if (long_status)
-          {
-           if (message)
-             _cupsLangPrintf(stdout, _("\tStatus: %s"), message);
-
-           if (reasons)
-           {
-             char      alerts[1024],   /* Alerts string */
-                       *aptr;          /* Pointer into alerts string */
+         if (message)
+           _cupsLangPrintf(stdout, _("\tStatus: %s"), message);
 
-             for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
-             {
-               if (i)
-                 snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
-                else
-                 strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
+         if (reasons)
+         {
+           char        alerts[1024],   /* Alerts string */
+                     *aptr;            /* Pointer into alerts string */
 
-               aptr += strlen(aptr);
-             }
+           for (i = 0, aptr = alerts; i < reasons->num_values; i ++)
+           {
+             if (i)
+               snprintf(aptr, sizeof(alerts) - (size_t)(aptr - alerts), " %s", reasons->values[i].string.text);
+             else
+               strlcpy(alerts, reasons->values[i].string.text, sizeof(alerts));
 
-             _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts);
+             aptr += strlen(aptr);
            }
 
-           _cupsLangPrintf(stdout, _("\tqueued for %s"), dest);
+           _cupsLangPrintf(stdout, _("\tAlerts: %s"), alerts);
          }
+
+         _cupsLangPrintf(stdout, _("\tqueued for %s"), dest);
        }
       }
 
@@ -1532,7 +1511,6 @@ show_printers(const char  *printers,      /* I - Destinations */
   ipp_pstate_t pstate;                 /* Printer state */
   cups_ptype_t ptype;                  /* Printer type */
   time_t       ptime;                  /* Printer state time */
-  struct tm    *pdate;                 /* Printer state date & time */
   int          jobid;                  /* Job ID of current job */
   char         printer_uri[HTTP_MAX_URI],
                                        /* Printer URI */
@@ -1776,8 +1754,7 @@ show_printers(const char  *printers,      /* I - Destinations */
         * Display it...
        */
 
-        pdate = localtime(&ptime);
-        strftime(printer_state_time, sizeof(printer_state_time), "%c", pdate);
+        _cupsStrDate(printer_state_time, sizeof(printer_state_time), ptime);
 
         switch (pstate)
        {
index 046288d4ca36f9cd44c080a65874418ee7d246ad..9ad83ae1ef0af4b02d9fd88850958c25f99e1f5e 100644 (file)
                7271882313746EA8001A2036 /* rastertolabel.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = rastertolabel.c; path = ../filter/rastertolabel.c; sourceTree = "<group>"; };
                7271883C1374AB14001A2036 /* mime-private.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = "mime-private.h"; path = "../scheduler/mime-private.h"; sourceTree = "<group>"; };
                727AD5B619100A58009F6862 /* tls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = tls.c; path = ../cups/tls.c; sourceTree = "<group>"; };
+               727EF02F192E3498001EF690 /* admin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = admin.c; path = "../cgi-bin/admin.c"; sourceTree = "<group>"; };
+               727EF030192E3498001EF690 /* cgi-private.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "cgi-private.h"; path = "../cgi-bin/cgi-private.h"; sourceTree = "<group>"; };
+               727EF031192E3498001EF690 /* cgi.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = cgi.h; path = "../cgi-bin/cgi.h"; sourceTree = "<group>"; };
+               727EF032192E3498001EF690 /* classes.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = classes.c; path = "../cgi-bin/classes.c"; sourceTree = "<group>"; };
+               727EF033192E3498001EF690 /* help-index.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "help-index.c"; path = "../cgi-bin/help-index.c"; sourceTree = "<group>"; };
+               727EF034192E3498001EF690 /* help-index.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; name = "help-index.h"; path = "../cgi-bin/help-index.h"; sourceTree = "<group>"; };
+               727EF035192E3498001EF690 /* help.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = help.c; path = "../cgi-bin/help.c"; sourceTree = "<group>"; };
+               727EF036192E3498001EF690 /* html.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = html.c; path = "../cgi-bin/html.c"; sourceTree = "<group>"; };
+               727EF037192E3498001EF690 /* ipp-var.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = "ipp-var.c"; path = "../cgi-bin/ipp-var.c"; sourceTree = "<group>"; };
+               727EF038192E3498001EF690 /* jobs.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = jobs.c; path = "../cgi-bin/jobs.c"; sourceTree = "<group>"; };
+               727EF039192E3498001EF690 /* makedocset.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = makedocset.c; path = "../cgi-bin/makedocset.c"; sourceTree = "<group>"; };
+               727EF03A192E3498001EF690 /* printers.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = printers.c; path = "../cgi-bin/printers.c"; sourceTree = "<group>"; };
+               727EF03B192E3498001EF690 /* search.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = search.c; path = "../cgi-bin/search.c"; sourceTree = "<group>"; };
+               727EF03C192E3498001EF690 /* template.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = template.c; path = "../cgi-bin/template.c"; sourceTree = "<group>"; };
+               727EF03D192E3498001EF690 /* testcgi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testcgi.c; path = "../cgi-bin/testcgi.c"; sourceTree = "<group>"; };
+               727EF03E192E3498001EF690 /* testhi.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testhi.c; path = "../cgi-bin/testhi.c"; sourceTree = "<group>"; };
+               727EF03F192E3498001EF690 /* testtemplate.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testtemplate.c; path = "../cgi-bin/testtemplate.c"; sourceTree = "<group>"; };
+               727EF040192E3498001EF690 /* var.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = var.c; path = "../cgi-bin/var.c"; sourceTree = "<group>"; };
+               727EF041192E3544001EF690 /* testadmin.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testadmin.c; path = ../cups/testadmin.c; sourceTree = "<group>"; };
+               727EF042192E3544001EF690 /* testarray.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testarray.c; path = ../cups/testarray.c; sourceTree = "<group>"; };
+               727EF043192E3544001EF690 /* testcache.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testcache.c; path = ../cups/testcache.c; sourceTree = "<group>"; };
+               727EF044192E3544001EF690 /* testconflicts.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testconflicts.c; path = ../cups/testconflicts.c; sourceTree = "<group>"; };
+               727EF045192E3544001EF690 /* testfile.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testfile.c; path = ../cups/testfile.c; sourceTree = "<group>"; };
+               727EF046192E3544001EF690 /* testi18n.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testi18n.c; path = ../cups/testi18n.c; sourceTree = "<group>"; };
+               727EF047192E3544001EF690 /* testipp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testipp.c; path = ../cups/testipp.c; sourceTree = "<group>"; };
+               727EF048192E3544001EF690 /* testlang.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testlang.c; path = ../cups/testlang.c; sourceTree = "<group>"; };
+               727EF049192E3544001EF690 /* testoptions.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testoptions.c; path = ../cups/testoptions.c; sourceTree = "<group>"; };
+               727EF04A192E3544001EF690 /* testppd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testppd.c; path = ../cups/testppd.c; sourceTree = "<group>"; };
+               727EF04B192E3544001EF690 /* testpwg.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testpwg.c; path = ../cups/testpwg.c; sourceTree = "<group>"; };
+               727EF04C192E3544001EF690 /* testsnmp.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testsnmp.c; path = ../cups/testsnmp.c; sourceTree = "<group>"; };
+               727EF04D192E3602001EF690 /* testlpd.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testlpd.c; path = ../scheduler/testlpd.c; sourceTree = "<group>"; };
+               727EF04E192E3602001EF690 /* testspeed.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testspeed.c; path = ../scheduler/testspeed.c; sourceTree = "<group>"; };
+               727EF04F192E3602001EF690 /* testsub.c */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.c; name = testsub.c; path = ../scheduler/testsub.c; sourceTree = "<group>"; };
                728FB7E0153600FA005426E1 /* tls-darwin.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tls-darwin.c"; path = "../scheduler/tls-darwin.c"; sourceTree = "<group>"; };
                728FB7E1153600FA005426E1 /* tls-gnutls.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; name = "tls-gnutls.c"; path = "../scheduler/tls-gnutls.c"; sourceTree = "<group>"; };
                728FB7EC1536161C005426E1 /* libz.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libz.dylib; path = /usr/lib/libz.dylib; sourceTree = "<absolute>"; };
                273BF6B81333B4A90022CAAB /* tests */ = {
                        isa = PBXGroup;
                        children = (
-                               2767FC5119266A36000F61D3 /* testdest.c */,
+                               727EF041192E3544001EF690 /* testadmin.c */,
+                               727EF042192E3544001EF690 /* testarray.c */,
+                               727EF043192E3544001EF690 /* testcache.c */,
+                               727EF044192E3544001EF690 /* testconflicts.c */,
                                273BF6C61333B5370022CAAB /* testcups.c */,
+                               2767FC5119266A36000F61D3 /* testdest.c */,
+                               727EF045192E3544001EF690 /* testfile.c */,
                                278C58E2136B647200836530 /* testhttp.c */,
+                               727EF046192E3544001EF690 /* testi18n.c */,
+                               727EF047192E3544001EF690 /* testipp.c */,
+                               727EF048192E3544001EF690 /* testlang.c */,
+                               727EF04D192E3602001EF690 /* testlpd.c */,
                                270CCDBB135E3D3E00007BE2 /* testmime.c */,
+                               727EF049192E3544001EF690 /* testoptions.c */,
+                               727EF04A192E3544001EF690 /* testppd.c */,
+                               727EF04B192E3544001EF690 /* testpwg.c */,
+                               727EF04C192E3544001EF690 /* testsnmp.c */,
+                               727EF04E192E3602001EF690 /* testspeed.c */,
+                               727EF04F192E3602001EF690 /* testsub.c */,
                        );
                        name = tests;
                        sourceTree = "<group>";
                        sourceTree = "<group>";
                        wrapsLines = 1;
                };
+               727EF02E192E3461001EF690 /* cgi-bin */ = {
+                       isa = PBXGroup;
+                       children = (
+                               727EF02F192E3498001EF690 /* admin.c */,
+                               727EF030192E3498001EF690 /* cgi-private.h */,
+                               727EF031192E3498001EF690 /* cgi.h */,
+                               727EF032192E3498001EF690 /* classes.c */,
+                               727EF033192E3498001EF690 /* help-index.c */,
+                               727EF034192E3498001EF690 /* help-index.h */,
+                               727EF035192E3498001EF690 /* help.c */,
+                               727EF036192E3498001EF690 /* html.c */,
+                               727EF037192E3498001EF690 /* ipp-var.c */,
+                               727EF038192E3498001EF690 /* jobs.c */,
+                               727EF039192E3498001EF690 /* makedocset.c */,
+                               727EF03A192E3498001EF690 /* printers.c */,
+                               727EF03B192E3498001EF690 /* search.c */,
+                               727EF03C192E3498001EF690 /* template.c */,
+                               727EF03D192E3498001EF690 /* testcgi.c */,
+                               727EF03E192E3498001EF690 /* testhi.c */,
+                               727EF03F192E3498001EF690 /* testtemplate.c */,
+                               727EF040192E3498001EF690 /* var.c */,
+                       );
+                       name = "cgi-bin";
+                       sourceTree = "<group>";
+               };
                72BF96351333042100B1EAD7 = {
                        isa = PBXGroup;
                        children = (
                                72220FB013330B3400FCA411 /* libcupsmime */,
                                274FF5F41333310400317ECB /* libcupsppdc */,
                                724378F71333E3CE009631B9 /* backends */,
+                               727EF02E192E3461001EF690 /* cgi-bin */,
                                274FF67313333B0A00317ECB /* commands */,
                                72220F5D13330A5A00FCA411 /* cupsd */,
                                274FF5D513332C2C00317ECB /* daemon */,