From: msweet Date: Mon, 18 May 2009 22:09:10 +0000 (+0000) Subject: Merge changes from CUPS 1.4svn-r8659 X-Git-Tag: release-1.6.3~101 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=68b10830fa5eca364644a90bb564821698611ff7;p=thirdparty%2Fcups.git Merge changes from CUPS 1.4svn-r8659 git-svn-id: svn+ssh://src.apple.com/svn/cups/easysw/current@1516 a1ca3aef-8c08-0410-bb20-df032aa958be --- diff --git a/CHANGES-1.3.txt b/CHANGES-1.3.txt index 709f815dec..1601f924ad 100644 --- a/CHANGES-1.3.txt +++ b/CHANGES-1.3.txt @@ -3,7 +3,9 @@ CHANGES-1.3.txt CHANGES IN CUPS V1.3.11 - - The web interface could hang on OpenBSD (STR #3176) + - The scheduler did not handle partial header lines properly from CGI + programs (STR #3194) + - The web interface could hang on OpenBSD (STR #3176, STR #3196) - The scheduler and cupsfilter utility did not handle rules starting with a negation operator properly (STR #3160) - The scheduler and cupsfilter utility would crash with certain MIME diff --git a/CHANGES.txt b/CHANGES.txt index 5bb0976304..70caf48003 100644 --- a/CHANGES.txt +++ b/CHANGES.txt @@ -1,13 +1,17 @@ -CHANGES.txt - 2009-05-14 +CHANGES.txt - 2009-05-16 ------------------------ CHANGES IN CUPS V1.4b3 - - Documentation fixes (STR #3044, STR #3057, STR #3153) + - Documentation fixes (STR #3044, STR #3057, STR #3153, STR #3158, + STR #3173) - Added complete localizations for German, Japanese, Polish, and Russian and partial localizations for Chinese, Danish, Finnish, French, Italian, Korean, Norwegian, Portuguese, and Swedish (STR #3096, STR #3098, STR #3109, STR #3111, STR #3141) + - Updated the configure check for -fstack-protector (STR #3198) + - The network backends now correctly convert SNMP supply descriptions to + UTF-8 encoding as needed. - The scheduler could crash when deleting an attribute (STR #3197) - The cups-driverd program did not detect symlink loops (STR #3185) - The EPSON 24-pin series driver should now feed the correct amount diff --git a/backend/backend-private.h b/backend/backend-private.h index b44270c1a6..612a9b6802 100644 --- a/backend/backend-private.h +++ b/backend/backend-private.h @@ -3,7 +3,7 @@ * * Backend support definitions for the Common UNIX Printing System (CUPS). * - * Copyright 2007-2008 by Apple Inc. + * Copyright 2007-2009 by Apple Inc. * Copyright 1997-2007 by Easy Software Products, all rights reserved. * * These coded instructions, statements, and computer programs are the @@ -78,6 +78,7 @@ extern "C" { #define CUPS_OID_prtGeneral CUPS_OID_printmib,5 #define CUPS_OID_prtGeneralTable CUPS_OID_prtGeneral,1 #define CUPS_OID_prtGeneralEntry CUPS_OID_prtGeneralTable,1 +#define CUPS_OID_prtGeneralCurrentLocalization CUPS_OID_prtGeneralEntry,2 #define CUPS_OID_prtGeneralPrinterName CUPS_OID_prtGeneralEntry,16 #define CUPS_OID_prtGeneralSerialNumber CUPS_OID_prtGeneralEntry,17 @@ -87,6 +88,11 @@ extern "C" { #define CUPS_OID_prtCoverDescription CUPS_OID_prtCoverEntry,2 #define CUPS_OID_prtCoverStatus CUPS_OID_prtCoverEntry,3 +#define CUPS_OID_prtLocalization CUPS_OID_printmib,7 +#define CUPS_OID_prtLocalizationTable CUPS_OID_prtLocalization,1 +#define CUPS_OID_prtLocalizationEntry CUPS_OID_prtLocalizationTable,1 +#define CUPS_OID_prtLocalizationCharacterSet CUPS_OID_prtLocalizationEntry,4 + #define CUPS_OID_prtMarker CUPS_OID_printmib,10 #define CUPS_OID_prtMarkerTable CUPS_OID_prtMarker,2 #define CUPS_OID_prtMarkerEntry CUPS_OID_prtMarkerTable,1 @@ -238,6 +244,22 @@ extern "C" { #define CUPS_TC_inserts 33 #define CUPS_TC_covers 34 +/* These come from RFC 3808 to define character sets we support */ +/* Also see http://www.iana.org/assignments/character-sets */ +#define CUPS_TC_csASCII 3 +#define CUPS_TC_csISOLatin1 4 +#define CUPS_TC_csShiftJIS 17 +#define CUPS_TC_csUTF8 106 +#define CUPS_TC_csUnicode 1000 /* UCS2 BE */ +#define CUPS_TC_csUCS4 1001 /* UCS4 BE */ +#define CUPS_TC_csUnicodeASCII 1002 +#define CUPS_TC_csUnicodeLatin1 1003 +#define CUPS_TC_csUTF16BE 1013 +#define CUPS_TC_csUTF16LE 1014 +#define CUPS_TC_csUTF32 1017 +#define CUPS_TC_csUTF32BE 1018 +#define CUPS_TC_csUTF32LE 1019 + /* * Prototypes... diff --git a/backend/ipp.c b/backend/ipp.c index aa7878c64d..6e41925514 100644 --- a/backend/ipp.c +++ b/backend/ipp.c @@ -622,7 +622,7 @@ main(int argc, /* I - Number of command-line args */ } while (http == NULL); - if (job_cancelled) + if (job_cancelled || !http) { if (tmpfilename[0]) unlink(tmpfilename); @@ -1056,8 +1056,26 @@ main(int argc, /* I - Number of command-line args */ httpReconnect(http); } else + { + /* + * Update auth-info-required as needed... + */ + _cupsLangPrintf(stderr, _("ERROR: Print file was not accepted (%s)!\n"), cupsLastErrorString()); + + if (ipp_status == IPP_NOT_AUTHORIZED) + { + fprintf(stderr, "DEBUG: WWW-Authenticate=\"%s\"\n", + httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE)); + + if (!strncmp(httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE), + "Negotiate", 9)) + fputs("ATTR: auth-info-required=negotiate\n", stderr); + else + fputs("ATTR: auth-info-required=username,password\n", stderr); + } + } } else if ((job_id_attr = ippFindAttribute(response, "job-id", IPP_TAG_INTEGER)) == NULL) @@ -1277,19 +1295,6 @@ main(int argc, /* I - Number of command-line args */ page_count > start_count) fprintf(stderr, "PAGE: total %d\n", page_count - start_count); - /* - * Update auth-info-required as needed... - */ - - if (ipp_status == IPP_NOT_AUTHORIZED) - { - if (!strncmp(httpGetField(http, HTTP_FIELD_WWW_AUTHENTICATE), - "Negotiate", 9)) - fputs("ATTR: auth-info-required=negotiate\n", stderr); - else - fputs("ATTR: auth-info-required=username,password\n", stderr); - } - /* * Free memory... */ diff --git a/backend/snmp-supplies.c b/backend/snmp-supplies.c index 8a0d09f5a3..684ff54b58 100644 --- a/backend/snmp-supplies.c +++ b/backend/snmp-supplies.c @@ -17,7 +17,8 @@ * * backendSNMPSupplies() - Get the current supplies for a device. * backend_init_supplies() - Initialize the supplies list. - * backend_walk_cb() - Interpret the supply value responses... + * backend_walk_cb() - Interpret the supply value responses. + * utf16_to_utf8() - Convert UTF-16 text to UTF-8. */ /* @@ -33,6 +34,7 @@ */ #define CUPS_MAX_SUPPLIES 32 /* Maximum number of supplies for a printer */ +#define CUPS_SUPPLY_TIMEOUT 2.0 /* Timeout for SNMP lookups */ /* @@ -63,6 +65,7 @@ typedef struct /**** Printer state table ****/ static http_addr_t current_addr; /* Current address */ static int current_state = -1; /* Current device state bits */ +static int charset = -1; /* Character set for supply names */ static int num_supplies = 0; /* Number of supplies found */ static backend_supplies_t supplies[CUPS_MAX_SUPPLIES]; @@ -77,6 +80,13 @@ static const int hrPrinterStatus[] = static const int hrPrinterDetectedErrorState[] = { CUPS_OID_hrPrinterDetectedErrorState, 1, -1 }; /* Current printer state bits OID */ +static const int prtGeneralCurrentLocalization[] = + { CUPS_OID_prtGeneralCurrentLocalization, 1, -1 }; +static const int prtLocalizationCharacterSet[] = + { CUPS_OID_prtLocalizationCharacterSet, 1, 1, -1 }, + prtLocalizationCharacterSetOffset = + (sizeof(prtLocalizationCharacterSet) / + sizeof(prtLocalizationCharacterSet[0])); static const int prtMarkerColorantValue[] = { CUPS_OID_prtMarkerColorantValue, -1 }, /* Colorant OID */ @@ -150,6 +160,8 @@ static const backend_state_t const printer_states[] = static void backend_init_supplies(int snmp_fd, http_addr_t *addr); static void backend_walk_cb(cups_snmp_t *packet, void *data); +static void utf16_to_utf8(cups_utf8_t *dst, const unsigned char *src, + size_t srcsize, size_t dstsize, int le); /* @@ -167,8 +179,8 @@ backendSNMPSupplies( backend_init_supplies(snmp_fd, addr); else if (num_supplies > 0) _cupsSNMPWalk(snmp_fd, ¤t_addr, CUPS_SNMP_VERSION_1, - _cupsSNMPDefaultCommunity(), prtMarkerSuppliesLevel, 0.5, - backend_walk_cb, NULL); + _cupsSNMPDefaultCommunity(), prtMarkerSuppliesLevel, + CUPS_SUPPLY_TIMEOUT, backend_walk_cb, NULL); if (page_count) *page_count = -1; @@ -213,7 +225,7 @@ backendSNMPSupplies( hrPrinterDetectedErrorState)) return (-1); - if (!_cupsSNMPRead(snmp_fd, &packet, 0.5) || + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || packet.object_type != CUPS_ASN1_OCTET_STRING) return (-1); @@ -246,7 +258,7 @@ backendSNMPSupplies( hrPrinterStatus)) return (-1); - if (!_cupsSNMPRead(snmp_fd, &packet, 0.5) || + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || packet.object_type != CUPS_ASN1_INTEGER) return (-1); @@ -264,7 +276,7 @@ backendSNMPSupplies( prtMarkerLifeCount)) return (-1); - if (!_cupsSNMPRead(snmp_fd, &packet, 0.5) || + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || packet.object_type != CUPS_ASN1_COUNTER) return (-1); @@ -348,6 +360,7 @@ backend_init_supplies( current_addr = *addr; current_state = -1; num_supplies = -1; + charset = -1; memset(supplies, 0, sizeof(supplies)); @@ -374,7 +387,7 @@ backend_init_supplies( hrDeviceDescr)) return; - if (!_cupsSNMPRead(snmp_fd, &packet, 0.5) || + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || packet.object_type != CUPS_ASN1_OCTET_STRING) { strlcpy(description, "Unknown", sizeof(description)); @@ -384,6 +397,8 @@ backend_init_supplies( strlcpy(description, (char *)packet.object_value.string.bytes, sizeof(description)); + fprintf(stderr, "DEBUG2: hrDeviceDesc=\"%s\"\n", description); + /* * See if we have already queried this device... */ @@ -401,28 +416,31 @@ backend_init_supplies( /* * Yes, read the cache file: * - * 1 num_supplies + * 2 num_supplies charset * device description * supply structures... */ if (cupsFileGets(cachefile, value, sizeof(value))) { - if (sscanf(value, "1 %d", &num_supplies) == 1 && + if (sscanf(value, "2 %d%d", &num_supplies, &charset) == 2 && num_supplies <= CUPS_MAX_SUPPLIES && cupsFileGets(cachefile, value, sizeof(value))) { - if ((ptr = value + strlen(value) - 1) >= value && *ptr == '\n') - *ptr = '\n'; - if (!strcmp(description, value)) cupsFileRead(cachefile, (char *)supplies, num_supplies * sizeof(backend_supplies_t)); else + { num_supplies = -1; + charset = -1; + } } else + { num_supplies = -1; + charset = -1; + } } cupsFileClose(cachefile); @@ -432,6 +450,55 @@ backend_init_supplies( * If the cache information isn't correct, scan for supplies... */ + if (charset < 0) + { + /* + * Get the configured character set... + */ + + int oid[CUPS_SNMP_MAX_OID]; /* OID for character set */ + + + if (!_cupsSNMPWrite(snmp_fd, ¤t_addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), CUPS_ASN1_GET_REQUEST, 1, + prtGeneralCurrentLocalization)) + return; + + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || + packet.object_type != CUPS_ASN1_INTEGER) + { + fprintf(stderr, + "DEBUG: prtGeneralCurrentLocalization type is %x, expected %x!\n", + packet.object_type, CUPS_ASN1_INTEGER); + return; + } + + fprintf(stderr, "DEBUG2: prtGeneralCurrentLocalization=%d\n", + packet.object_value.integer); + + _cupsSNMPCopyOID(oid, prtLocalizationCharacterSet, CUPS_SNMP_MAX_OID); + oid[prtLocalizationCharacterSetOffset - 2] = packet.object_value.integer; + + + if (!_cupsSNMPWrite(snmp_fd, ¤t_addr, CUPS_SNMP_VERSION_1, + _cupsSNMPDefaultCommunity(), CUPS_ASN1_GET_REQUEST, 1, + oid)) + return; + + if (!_cupsSNMPRead(snmp_fd, &packet, CUPS_SUPPLY_TIMEOUT) || + packet.object_type != CUPS_ASN1_INTEGER) + { + fprintf(stderr, + "DEBUG: prtLocalizationCharacterSet type is %x, expected %x!\n", + packet.object_type, CUPS_ASN1_INTEGER); + return; + } + + fprintf(stderr, "DEBUG2: prtLocalizationCharacterSet=%d\n", + packet.object_value.integer); + charset = packet.object_value.integer; + } + if (num_supplies < 0) { /* @@ -439,8 +506,8 @@ backend_init_supplies( */ _cupsSNMPWalk(snmp_fd, ¤t_addr, CUPS_SNMP_VERSION_1, - _cupsSNMPDefaultCommunity(), prtMarkerSuppliesEntry, 0.5, - backend_walk_cb, NULL); + _cupsSNMPDefaultCommunity(), prtMarkerSuppliesEntry, + CUPS_SUPPLY_TIMEOUT, backend_walk_cb, NULL); } /* @@ -452,7 +519,7 @@ backend_init_supplies( if ((cachefile = cupsFileOpen(cachefilename, "w")) != NULL) { - cupsFilePrintf(cachefile, "1 %d\n", num_supplies); + cupsFilePrintf(cachefile, "2 %d %d\n", num_supplies, charset); cupsFilePrintf(cachefile, "%s\n", description); if (num_supplies > 0) @@ -473,8 +540,8 @@ backend_init_supplies( strcpy(supplies[i].color, "none"); _cupsSNMPWalk(snmp_fd, ¤t_addr, CUPS_SNMP_VERSION_1, - _cupsSNMPDefaultCommunity(), prtMarkerColorantValue, 0.5, - backend_walk_cb, NULL); + _cupsSNMPDefaultCommunity(), prtMarkerColorantValue, + CUPS_SUPPLY_TIMEOUT, backend_walk_cb, NULL); /* * Output the marker-colors attribute... @@ -536,7 +603,7 @@ backend_init_supplies( /* - * 'backend_walk_cb()' - Interpret the supply value responses... + * 'backend_walk_cb()' - Interpret the supply value responses. */ static void @@ -612,14 +679,84 @@ backend_walk_cb(cups_snmp_t *packet, /* I - SNMP packet */ packet->object_type != CUPS_ASN1_OCTET_STRING) return; - fprintf(stderr, "DEBUG2: prtMarkerSuppliesDescription.1.%d = \"%s\"\n", i, - (char *)packet->object_value.string.bytes); - if (i > num_supplies) num_supplies = i; - strlcpy(supplies[i - 1].name, (char *)packet->object_value.string.bytes, - sizeof(supplies[0].name)); + switch (charset) + { + case CUPS_TC_csASCII : + case CUPS_TC_csUTF8 : + case CUPS_TC_csUnicodeASCII : + strlcpy(supplies[i - 1].name, + (char *)packet->object_value.string.bytes, + sizeof(supplies[0].name)); + break; + + case CUPS_TC_csISOLatin1 : + case CUPS_TC_csUnicodeLatin1 : + cupsCharsetToUTF8((cups_utf8_t *)supplies[i - 1].name, + (char *)packet->object_value.string.bytes, + sizeof(supplies[0].name), CUPS_ISO8859_1); + break; + + case CUPS_TC_csShiftJIS : + cupsCharsetToUTF8((cups_utf8_t *)supplies[i - 1].name, + (char *)packet->object_value.string.bytes, + sizeof(supplies[0].name), CUPS_JIS_X0213); + break; + + case CUPS_TC_csUCS4 : + case CUPS_TC_csUTF32 : + case CUPS_TC_csUTF32BE : + case CUPS_TC_csUTF32LE : + cupsUTF32ToUTF8((cups_utf8_t *)supplies[i - 1].name, + (cups_utf32_t *)packet->object_value.string.bytes, + sizeof(supplies[0].name)); + break; + + case CUPS_TC_csUnicode : + case CUPS_TC_csUTF16BE : + case CUPS_TC_csUTF16LE : + utf16_to_utf8((cups_utf8_t *)supplies[i - 1].name, + packet->object_value.string.bytes, + packet->object_value.string.num_bytes, + sizeof(supplies[0].name), charset == CUPS_TC_csUTF16LE); + break; + + default : + /* + * If we get here, the printer is using an unknown character set and + * we just want to copy characters that look like ASCII... + */ + + { + char *src, *dst; /* Pointers into strings */ + + + /* + * Loop safe because both the object_value and supplies char arrays + * are CUPS_SNMP_MAX_STRING elements long. + */ + + for (src = (char *)packet->object_value.string.bytes, + dst = supplies[i - 1].name; + *src; + src ++) + { + if ((*src & 0x80) || *src < ' ' || *src == 0x7f) + *dst++ = '?'; + else + *dst++ = *src; + } + + *dst = '\0'; + } + break; + } + + fprintf(stderr, "DEBUG2: prtMarkerSuppliesDescription.1.%d = \"%s\"\n", i, + supplies[i - 1].name); + } else if (_cupsSNMPIsOIDPrefixed(packet, prtMarkerSuppliesLevel)) { @@ -681,6 +818,67 @@ backend_walk_cb(cups_snmp_t *packet, /* I - SNMP packet */ } +/* + * 'utf16_to_utf8()' - Convert UTF-16 text to UTF-8. + */ + +static void +utf16_to_utf8( + cups_utf8_t *dst, /* I - Destination buffer */ + const unsigned char *src, /* I - Source string */ + size_t srcsize, /* I - Size of source string */ + size_t dstsize, /* I - Size of destination buffer */ + int le) /* I - Source is little-endian? */ +{ + cups_utf32_t ch, /* Current character */ + temp[CUPS_SNMP_MAX_STRING], + /* UTF-32 string */ + *ptr; /* Pointer into UTF-32 string */ + + + for (ptr = temp; srcsize >= 2;) + { + if (le) + ch = src[0] | (src[1] << 8); + else + ch = (src[0] << 8) | src[1]; + + src += 2; + srcsize -= 2; + + if (ch >= 0xd800 && ch <= 0xdbff && srcsize >= 2) + { + /* + * Multi-word UTF-16 char... + */ + + int lch; /* Lower word */ + + + if (le) + lch = src[0] | (src[1] << 8); + else + lch = (src[0] << 8) | src[1]; + + if (lch >= 0xdc00 && lch <= 0xdfff) + { + src += 2; + srcsize -= 2; + + ch = (((ch & 0x3ff) << 10) | (lch & 0x3ff)) + 0x10000; + } + } + + if (ptr < (temp + CUPS_SNMP_MAX_STRING - 1)) + *ptr++ = ch; + } + + *ptr = '\0'; + + cupsUTF32ToUTF8(dst, temp, dstsize); +} + + /* * End of "$Id$". */ diff --git a/conf/mime.types b/conf/mime.types index 21089d60b4..ba97930d54 100644 --- a/conf/mime.types +++ b/conf/mime.types @@ -7,7 +7,7 @@ # VERSIONS OF CUPS. Instead, create a "local.types" file that # reflects your local configuration changes. # -# Copyright 2007-2008 by Apple Inc. +# Copyright 2007-2009 by Apple Inc. # Copyright 1997-2007 by Easy Software Products. # # These coded instructions, statements, and computer programs are the @@ -50,10 +50,12 @@ # # MIME type names are case-insensitive. Internally they are converted # to lowercase. Multiple occurrences of a type will cause the provided -# rules to be appended to the existing definition. Type names are sorted -# in ascending order, so if two types use the same rules to resolve a type -# (e.g. doc extension for two types), the returned type will be the first -# type in the sorted list. +# rules to be appended to the existing definition. If two types use the same +# rules to resolve a type and have the same priority, e.g. "doc" extension for +# "text/bar" and "text/foo", the returned type will be the first type as +# sorted in alphanumerically ascending order without regard to case. Thus, +# the "text/bar" type will match the "doc" extension first unless the +# "text/foo" type has specified a higher priority. # # The "printable" rule differs from the "ascii" rule in that it also # accepts 8-bit characters in the range 128-255. diff --git a/config-scripts/cups-compiler.m4 b/config-scripts/cups-compiler.m4 index e0c4629633..f3aa1b2401 100644 --- a/config-scripts/cups-compiler.m4 +++ b/config-scripts/cups-compiler.m4 @@ -140,7 +140,7 @@ if test -n "$GCC"; then AC_MSG_CHECKING(if GCC supports -fstack-protector) OLDCFLAGS="$CFLAGS" CFLAGS="$CFLAGS -fstack-protector" - AC_TRY_COMPILE(,, + AC_TRY_LINK(,, OPTIM="$OPTIM -fstack-protector" AC_MSG_RESULT(yes), AC_MSG_RESULT(no)) diff --git a/config-scripts/cups-gssapi.m4 b/config-scripts/cups-gssapi.m4 index daa8db6685..7c61735b80 100644 --- a/config-scripts/cups-gssapi.m4 +++ b/config-scripts/cups-gssapi.m4 @@ -109,7 +109,7 @@ AC_ARG_WITH(gssservicename, [ --with-gssservicename set default gss service n if test x$default_gssservicename != xno; then if test "x$default_gssservicename" = "xdefault"; then - CUPS_DEFAULT_GSSSERVICENAME="ipp" + CUPS_DEFAULT_GSSSERVICENAME="host" else CUPS_DEFAULT_GSSSERVICENAME="$default_gssservicename" fi diff --git a/cups/auth.c b/cups/auth.c index ca877a398f..d37b685f96 100644 --- a/cups/auth.c +++ b/cups/auth.c @@ -487,7 +487,7 @@ cups_gss_printf(OM_uint32 major_status,/* I - Major status code */ gss_display_status(&err_minor_status, minor_status, GSS_C_MECH_CODE, GSS_C_NULL_OID, &msg_ctx, &minor_status_string); - DEBUG_printf(("8%s: %s, %s", message, (char *)major_status_string.value, + DEBUG_printf(("1%s: %s, %s", message, (char *)major_status_string.value, (char *)minor_status_string.value)); gss_release_buffer(&err_minor_status, &major_status_string); @@ -622,7 +622,12 @@ cups_local_auth(http_t *http) /* I - HTTP connection to server */ * information... */ - if (http->hostaddr->addr.sa_family == AF_LOCAL && +# ifdef HAVE_GSSAPI + if (strncmp(http->fields[HTTP_FIELD_WWW_AUTHENTICATE], "Negotiate", 9) && +# else + if ( +# endif /* HAVE_GSSAPI */ + http->hostaddr->addr.sa_family == AF_LOCAL && !getenv("GATEWAY_INTERFACE")) /* Not via CGI programs... */ { /* diff --git a/doc/help/api-array.html b/doc/help/api-array.html index 3ee3a12b41..fec426de9b 100644 --- a/doc/help/api-array.html +++ b/doc/help/api-array.html @@ -338,7 +338,7 @@ div.contents ul.subcontents li {