/*
- * "$Id: ipp.c 10102 2011-11-02 23:52:39Z mike $"
- *
- * Internet Printing Protocol functions for CUPS.
- *
- * Copyright 2007-2012 by Apple Inc.
- * Copyright 1997-2007 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/".
- *
- * This file is subject to the Apple OS-Developed Software exception.
- *
- * Contents:
- *
- * _cupsBufferGet() - Get a read/write buffer.
- * _cupsBufferRelease() - Release a read/write buffer.
- * ippAddBoolean() - Add a boolean attribute to an IPP message.
- * ippAddBooleans() - Add an array of boolean values.
- * ippAddCollection() - Add a collection value.
- * ippAddCollections() - Add an array of collection values.
- * ippAddDate() - Add a date attribute to an IPP message.
- * ippAddInteger() - Add a integer attribute to an IPP message.
- * ippAddIntegers() - Add an array of integer values.
- * ippAddOctetString() - Add an octetString value to an IPP message.
- * ippAddOutOfBand() - Add an out-of-band value to an IPP message.
- * ippAddRange() - Add a range of values to an IPP message.
- * ippAddRanges() - Add ranges of values to an IPP message.
- * ippAddResolution() - Add a resolution value to an IPP message.
- * ippAddResolutions() - Add resolution values to an IPP message.
- * ippAddSeparator() - Add a group separator to an IPP message.
- * ippAddString() - Add a language-encoded string to an IPP message.
- * ippAddStringf() - Add a formatted string to an IPP message.
- * ippAddStringfv() - Add a formatted string to an IPP message.
- * ippAddStrings() - Add language-encoded strings to an IPP message.
- * ippContainsInteger() - Determine whether an attribute contains the
- * specified value or is within the list of ranges.
- * ippContainsString() - Determine whether an attribute contains the
- * specified string value.
- * ippCopyAttribute() - Copy an attribute.
- * ippCopyAttributes() - Copy attributes from one IPP message to another.
- * ippDateToTime() - Convert from RFC 1903 Date/Time format to UNIX
- * time in seconds.
- * ippDelete() - Delete an IPP message.
- * ippDeleteAttribute() - Delete a single attribute in an IPP message.
- * ippDeleteValues() - Delete values in an attribute.
- * ippFindAttribute() - Find a named attribute in a request.
- * ippFindNextAttribute() - Find the next named attribute in a request.
- * ippFirstAttribute() - Return the first attribute in the message.
- * ippGetBoolean() - Get a boolean value for an attribute.
- * ippGetCollection() - Get a collection value for an attribute.
- * ippGetCount() - Get the number of values in an attribute.
- * ippGetDate() - Get a date value for an attribute.
- * ippGetGroupTag() - Get the group associated with an attribute.
- * ippGetInteger() - Get the integer/enum value for an attribute.
- * ippGetName() - Get the attribute name.
- * ippGetOperation() - Get the operation ID in an IPP message.
- * ippGetRange() - Get a rangeOfInteger value from an attribute.
- * ippGetRequestId() - Get the request ID from an IPP message.
- * ippGetResolution() - Get a resolution value for an attribute.
- * ippGetState() - Get the IPP message state.
- * ippGetStatusCode() - Get the status code from an IPP response or
- * event message.
- * ippGetString() - Get the string and optionally the language code
- * for an attribute.
- * ippGetValueTag() - Get the value tag for an attribute.
- * ippGetVersion() - Get the major and minor version number from an
- * IPP message.
- * ippLength() - Compute the length of an IPP message.
- * ippNextAttribute() - Return the next attribute in the message.
- * ippNew() - Allocate a new IPP message.
- * ippNewRequest() - Allocate a new IPP request message.
- * ippNewResponse() - Allocate a new IPP response message.
- * ippRead() - Read data for an IPP message from a HTTP
- * connection.
- * ippReadFile() - Read data for an IPP message from a file.
- * ippReadIO() - Read data for an IPP message.
- * ippSetBoolean() - Set a boolean value in an attribute.
- * ippSetCollection() - Set a collection value in an attribute.
- * ippSetDate() - Set a date value in an attribute.
- * ippSetGroupTag() - Set the group tag of an attribute.
- * ippSetInteger() - Set an integer or enum value in an attribute.
- * ippSetName() - Set the name of an attribute.
- * ippSetOperation() - Set the operation ID in an IPP request message.
- * ippSetRange() - Set a rangeOfInteger value in an attribute.
- * ippSetRequestId() - Set the request ID in an IPP message.
- * ippSetResolution() - Set a resolution value in an attribute.
- * ippSetState() - Set the current state of the IPP message.
- * ippSetStatusCode() - Set the status code in an IPP response or event
- * message.
- * ippSetString() - Set a string value in an attribute.
- * ippSetStringf() - Set a formatted string value of an attribute.
- * ippSetStringf() - Set a formatted string value of an attribute.
- * ippSetValueTag() - Set the value tag of an attribute.
- * ippSetVersion() - Set the version number in an IPP message.
- * ippTimeToDate() - Convert from UNIX time to RFC 1903 format.
- * ippValidateAttribute() - Validate the contents of an attribute.
- * ippValidateAttributes() - Validate all attributes in an IPP message.
- * ippWrite() - Write data for an IPP message to a HTTP
- * connection.
- * ippWriteFile() - Write data for an IPP message to a file.
- * ippWriteIO() - Write data for an IPP message.
- * ipp_add_attr() - Add a new attribute to the message.
- * ipp_free_values() - Free attribute values.
- * ipp_get_code() - Convert a C locale/charset name into an IPP
- * language/charset code.
- * ipp_lang_code() - Convert a C locale name into an IPP language
- * code.
- * ipp_length() - Compute the length of an IPP message or
- * collection value.
- * ipp_read_http() - Semi-blocking read on a HTTP connection...
- * ipp_read_file() - Read IPP data from a file.
- * ipp_set_error() - Set a formatted, localized error string.
- * ipp_set_value() - Get the value element from an attribute,
- * expanding it as needed.
- * ipp_write_file() - Write IPP data to a file.
+ * Internet Printing Protocol functions for CUPS.
+ *
+ * Copyright © 2007-2018 by Apple Inc.
+ * Copyright © 1997-2007 by Easy Software Products, all rights reserved.
+ *
+ * Licensed under Apache License v2.0. See the file "LICENSE" for more
+ * information.
*/
/*
*/
#include "cups-private.h"
+#include "debug-internal.h"
#include <regex.h>
-#ifdef WIN32
+#ifdef _WIN32
# include <io.h>
-#endif /* WIN32 */
+#endif /* _WIN32 */
/*
int num_values);
static void ipp_free_values(ipp_attribute_t *attr, int element,
int count);
-static char *ipp_get_code(const char *locale, char *buffer,
- size_t bufsize)
- __attribute__((nonnull(1,2)));
-static char *ipp_lang_code(const char *locale, char *buffer,
- size_t bufsize)
- __attribute__((nonnull(1,2)));
+static char *ipp_get_code(const char *locale, char *buffer, size_t bufsize) _CUPS_NONNULL(1,2);
+static char *ipp_lang_code(const char *locale, char *buffer, size_t bufsize) _CUPS_NONNULL(1,2);
static size_t ipp_length(ipp_t *ipp, int collection);
static ssize_t ipp_read_http(http_t *http, ipp_uchar_t *buffer,
size_t length);
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddBoolean(ipp=%p, group=%02x(%s), name=\"%s\", value=%d)",
- ipp, group, ippTagString(group), name, value));
+ DEBUG_printf(("ippAddBoolean(ipp=%p, group=%02x(%s), name=\"%s\", value=%d)", (void *)ipp, group, ippTagString(group), name, value));
/*
* Range check input...
_ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippAddBooleans(ipp=%p, group=%02x(%s), name=\"%s\", "
- "num_values=%d, values=%p)", ipp, group, ippTagString(group),
- name, num_values, values));
+ DEBUG_printf(("ippAddBooleans(ipp=%p, group=%02x(%s), name=\"%s\", num_values=%d, values=%p)", (void *)ipp, group, ippTagString(group), name, num_values, (void *)values));
/*
* Range check input...
* (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription
* (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@).
*
- * @since CUPS 1.1.19/OS X 10.3@
+ * @since CUPS 1.1.19/macOS 10.3@
*/
ipp_attribute_t * /* O - New attribute */
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddCollection(ipp=%p, group=%02x(%s), name=\"%s\", "
- "value=%p)", ipp, group, ippTagString(group), name, value));
+ DEBUG_printf(("ippAddCollection(ipp=%p, group=%02x(%s), name=\"%s\", value=%p)", (void *)ipp, group, ippTagString(group), name, (void *)value));
/*
* Range check input...
* (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription
* (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@).
*
- * @since CUPS 1.1.19/OS X 10.3@
+ * @since CUPS 1.1.19/macOS 10.3@
*/
ipp_attribute_t * /* O - New attribute */
_ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippAddCollections(ipp=%p, group=%02x(%s), name=\"%s\", "
- "num_values=%d, values=%p)", ipp, group, ippTagString(group),
- name, num_values, values));
+ DEBUG_printf(("ippAddCollections(ipp=%p, group=%02x(%s), name=\"%s\", num_values=%d, values=%p)", (void *)ipp, group, ippTagString(group), name, num_values, (void *)values));
/*
* Range check input...
/*
- * 'ippAddDate()' - Add a date attribute to an IPP message.
+ * 'ippAddDate()' - Add a dateTime attribute to an IPP message.
*
* The @code ipp@ parameter refers to an IPP message previously created using
* the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddDate(ipp=%p, group=%02x(%s), name=\"%s\", value=%p)",
- ipp, group, ippTagString(group), name, value));
+ DEBUG_printf(("ippAddDate(ipp=%p, group=%02x(%s), name=\"%s\", value=%p)", (void *)ipp, group, ippTagString(group), name, (void *)value));
/*
* Range check input...
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddInteger(ipp=%p, group=%02x(%s), type=%02x(%s), "
- "name=\"%s\", value=%d)", ipp, group, ippTagString(group),
- value_tag, ippTagString(value_tag), name, value));
+ DEBUG_printf(("ippAddInteger(ipp=%p, group=%02x(%s), type=%02x(%s), name=\"%s\", value=%d)", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, value));
- value_tag &= IPP_TAG_MASK;
+ value_tag &= IPP_TAG_CUPS_MASK;
/*
* Special-case for legacy usage: map out-of-band attributes to new ippAddOutOfBand
_ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippAddIntegers(ipp=%p, group=%02x(%s), type=%02x(%s), "
- "name=\"%s\", num_values=%d, values=%p)", ipp,
- group, ippTagString(group), value_tag, ippTagString(value_tag), name,
- num_values, values));
+ DEBUG_printf(("ippAddIntegers(ipp=%p, group=%02x(%s), type=%02x(%s), name=\"%s\", num_values=%d, values=%p)", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, num_values, (void *)values));
- value_tag &= IPP_TAG_MASK;
+ value_tag &= IPP_TAG_CUPS_MASK;
/*
* Range check input...
* (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription
* (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@).
*
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
*/
ipp_attribute_t * /* O - New attribute */
if (data)
{
- if ((attr->values[0].unknown.data = malloc(datalen)) == NULL)
+ if ((attr->values[0].unknown.data = malloc((size_t)datalen)) == NULL)
{
ippDeleteAttribute(ipp, attr);
return (NULL);
}
- memcpy(attr->values[0].unknown.data, data, datalen);
+ memcpy(attr->values[0].unknown.data, data, (size_t)datalen);
}
/*
* (@code IPP_TAG_NOTSETTABLE@), delete-attribute (@code IPP_TAG_DELETEATTR@), and
* admin-define (@code IPP_TAG_ADMINDEFINE@).
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
ipp_attribute_t * /* O - New attribute */
ipp_tag_t value_tag, /* I - Type of attribute */
const char *name) /* I - Name of attribute */
{
- DEBUG_printf(("ippAddOutOfBand(ipp=%p, group=%02x(%s), value_tag=%02x(%s), "
- "name=\"%s\")", ipp, group, ippTagString(group), value_tag,
- ippTagString(value_tag), name));
+ DEBUG_printf(("ippAddOutOfBand(ipp=%p, group=%02x(%s), value_tag=%02x(%s), name=\"%s\")", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name));
- value_tag &= IPP_TAG_MASK;
+ value_tag &= IPP_TAG_CUPS_MASK;
/*
* Range check input...
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddRange(ipp=%p, group=%02x(%s), name=\"%s\", lower=%d, "
- "upper=%d)", ipp, group, ippTagString(group), name, lower,
- upper));
+ DEBUG_printf(("ippAddRange(ipp=%p, group=%02x(%s), name=\"%s\", lower=%d, upper=%d)", (void *)ipp, group, ippTagString(group), name, lower, upper));
/*
* Range check input...
_ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippAddRanges(ipp=%p, group=%02x(%s), name=\"%s\", "
- "num_values=%d, lower=%p, upper=%p)", ipp, group,
- ippTagString(group), name, num_values, lower, upper));
+ DEBUG_printf(("ippAddRanges(ipp=%p, group=%02x(%s), name=\"%s\", num_values=%d, lower=%p, upper=%p)", (void *)ipp, group, ippTagString(group), name, num_values, (void *)lower, (void *)upper));
/*
* Range check input...
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddResolution(ipp=%p, group=%02x(%s), name=\"%s\", "
- "units=%d, xres=%d, yres=%d)", ipp, group,
+ DEBUG_printf(("ippAddResolution(ipp=%p, group=%02x(%s), name=\"%s\", units=%d, xres=%d, yres=%d)", (void *)ipp, group,
ippTagString(group), name, units, xres, yres));
/*
_ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippAddResolutions(ipp=%p, group=%02x(%s), name=\"%s\", "
- "num_value=%d, units=%d, xres=%p, yres=%p)", ipp, group,
- ippTagString(group), name, num_values, units, xres, yres));
+ DEBUG_printf(("ippAddResolutions(ipp=%p, group=%02x(%s), name=\"%s\", num_value=%d, units=%d, xres=%p, yres=%p)", (void *)ipp, group, ippTagString(group), name, num_values, units, (void *)xres, (void *)yres));
/*
* Range check input...
ipp_attribute_t * /* O - New attribute */
ippAddSeparator(ipp_t *ipp) /* I - IPP message */
{
- DEBUG_printf(("ippAddSeparator(ipp=%p)", ipp));
+ DEBUG_printf(("ippAddSeparator(ipp=%p)", (void *)ipp));
/*
* Range check input...
/* Charset/language code buffer */
- DEBUG_printf(("ippAddString(ipp=%p, group=%02x(%s), value_tag=%02x(%s), "
- "name=\"%s\", language=\"%s\", value=\"%s\")", ipp,
- group, ippTagString(group), value_tag, ippTagString(value_tag), name,
- language, value));
+ DEBUG_printf(("ippAddString(ipp=%p, group=%02x(%s), value_tag=%02x(%s), name=\"%s\", language=\"%s\", value=\"%s\")", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, language, value));
/*
* Range check input...
*/
- temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_MASK);
+ temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK);
#if 0
if (!ipp || !name || group < IPP_TAG_ZERO ||
* See if we need to map charset, language, or locale values...
*/
- if (language && ((int)value_tag & IPP_TAG_COPY) &&
+ if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) &&
strcmp(language, ipp_lang_code(language, code, sizeof(code))))
value_tag = temp_tag; /* Don't do a fast copy */
- else if (value && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_COPY) &&
+ else if (value && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_CUPS_CONST) &&
strcmp(value, ipp_get_code(value, code, sizeof(code))))
value_tag = temp_tag; /* Don't do a fast copy */
- else if (value && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_COPY) &&
+ else if (value && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_CUPS_CONST) &&
strcmp(value, ipp_lang_code(value, code, sizeof(code))))
value_tag = temp_tag; /* Don't do a fast copy */
* Initialize the attribute data...
*/
- if ((int)value_tag & IPP_TAG_COPY)
+ if ((int)value_tag & IPP_TAG_CUPS_CONST)
{
attr->values[0].string.language = (char *)language;
attr->values[0].string.text = (char *)value;
* needed. The formatted string is truncated as needed to the maximum length of
* the corresponding value type.
*
- * @since CUPS 1.7@
+ * @since CUPS 1.7/macOS 10.9@
*/
ipp_attribute_t * /* O - New attribute */
* stdarg pointer @code ap@. The formatted string is truncated as needed to the
* maximum length of the corresponding value type.
*
- * @since CUPS 1.7@
+ * @since CUPS 1.7/macOS 10.9@
*/
ipp_attribute_t * /* O - New attribute */
group == IPP_TAG_END || group >= IPP_TAG_UNSUPPORTED_VALUE ||
(value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG &&
value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE ||
- !format || !ap)
+ !format)
return (NULL);
if ((value_tag == IPP_TAG_TEXTLANG || value_tag == IPP_TAG_NAMELANG)
if (!s)
s = "(null)";
- bytes = strlen(s);
+ bytes = (ssize_t)strlen(s);
strlcpy(buffer, s, sizeof(buffer));
}
else
char code[32]; /* Language/charset value buffer */
- DEBUG_printf(("ippAddStrings(ipp=%p, group=%02x(%s), value_tag=%02x(%s), "
- "name=\"%s\", num_values=%d, language=\"%s\", values=%p)", ipp,
- group, ippTagString(group), value_tag, ippTagString(value_tag), name,
- num_values, language, values));
+ DEBUG_printf(("ippAddStrings(ipp=%p, group=%02x(%s), value_tag=%02x(%s), name=\"%s\", num_values=%d, language=\"%s\", values=%p)", (void *)ipp, group, ippTagString(group), value_tag, ippTagString(value_tag), name, num_values, language, (void *)values));
/*
* Range check input...
*/
- temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_MASK);
+ temp_tag = (ipp_tag_t)((int)value_tag & IPP_TAG_CUPS_MASK);
#if 0
if (!ipp || !name || group < IPP_TAG_ZERO ||
* See if we need to map charset, language, or locale values...
*/
- if (language && ((int)value_tag & IPP_TAG_COPY) &&
+ if (language && ((int)value_tag & IPP_TAG_CUPS_CONST) &&
strcmp(language, ipp_lang_code(language, code, sizeof(code))))
value_tag = temp_tag; /* Don't do a fast copy */
- else if (values && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_COPY))
+ else if (values && value_tag == (ipp_tag_t)(IPP_TAG_CHARSET | IPP_TAG_CUPS_CONST))
{
for (i = 0; i < num_values; i ++)
if (strcmp(values[i], ipp_get_code(values[i], code, sizeof(code))))
break;
}
}
- else if (values && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_COPY))
+ else if (values && value_tag == (ipp_tag_t)(IPP_TAG_LANGUAGE | IPP_TAG_CUPS_CONST))
{
for (i = 0; i < num_values; i ++)
if (strcmp(values[i], ipp_lang_code(values[i], code, sizeof(code))))
{
if (value == attr->values)
{
- if ((int)value_tag & IPP_TAG_COPY)
+ if ((int)value_tag & IPP_TAG_CUPS_CONST)
value->string.language = (char *)language;
else
value->string.language = _cupsStrAlloc(ipp_lang_code(language, code,
if (values)
{
- if ((int)value_tag & IPP_TAG_COPY)
+ if ((int)value_tag & IPP_TAG_CUPS_CONST)
value->string.text = (char *)*values++;
else if (value_tag == IPP_TAG_CHARSET)
value->string.text = _cupsStrAlloc(ipp_get_code(*values++, code, sizeof(code)));
* enum value, or the value falls within one of the rangeOfInteger values for
* the attribute.
*
- * @since CUPS 1.7@
+ * @since CUPS 1.7/macOS 10.9@
*/
int /* O - 1 on a match, 0 on no match */
* specified string value.
*
* Returns non-zero when the attribute contains a matching charset, keyword,
- * language, mimeMediaType, name, text, URI, or URI scheme value.
+ * naturalLanguage, mimeMediaType, name, text, uri, or uriScheme value.
*
- * @since CUPS 1.7@
+ * @since CUPS 1.7/macOS 10.9@
*/
int /* O - 1 on a match, 0 on no match */
_ipp_value_t *avalue; /* Current attribute value */
- DEBUG_printf(("ippContainsString(attr=%p, value=\"%s\")", attr, value));
+ DEBUG_printf(("ippContainsString(attr=%p, value=\"%s\")", (void *)attr, value));
/*
* Range check input...
case IPP_TAG_CHARSET :
case IPP_TAG_KEYWORD :
case IPP_TAG_LANGUAGE :
+ case IPP_TAG_URI :
+ case IPP_TAG_URISCHEME :
+ for (i = attr->num_values, avalue = attr->values;
+ i > 0;
+ i --, avalue ++)
+ {
+ DEBUG_printf(("1ippContainsString: value[%d]=\"%s\"",
+ attr->num_values - i, avalue->string.text));
+
+ if (!strcmp(value, avalue->string.text))
+ {
+ DEBUG_puts("1ippContainsString: Returning 1 (match)");
+ return (1);
+ }
+ }
+
case IPP_TAG_MIMETYPE :
case IPP_TAG_NAME :
case IPP_TAG_NAMELANG :
case IPP_TAG_TEXT :
case IPP_TAG_TEXTLANG :
- case IPP_TAG_URI :
- case IPP_TAG_URISCHEME :
for (i = attr->num_values, avalue = attr->values;
i > 0;
i --, avalue ++)
DEBUG_printf(("1ippContainsString: value[%d]=\"%s\"",
attr->num_values - i, avalue->string.text));
- if (!strcmp(value, avalue->string.text))
+ if (!_cups_strcasecmp(value, avalue->string.text))
{
DEBUG_puts("1ippContainsString: Returning 1 (match)");
return (1);
* created - this should only be done as long as the original source IPP message will
* not be freed for the life of the destination.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int quickcopy) /* I - 1 for a referenced copy, 0 for normal */
{
int i; /* Looping var */
+ ipp_tag_t srctag; /* Source value tag */
ipp_attribute_t *dstattr; /* Destination attribute */
_ipp_value_t *srcval, /* Source value */
*dstval; /* Destination value */
- DEBUG_printf(("ippCopyAttribute(dst=%p, srcattr=%p, quickcopy=%d)", dst, srcattr,
- quickcopy));
+ DEBUG_printf(("ippCopyAttribute(dst=%p, srcattr=%p, quickcopy=%d)", (void *)dst, (void *)srcattr, quickcopy));
/*
* Range check input...
* Copy it...
*/
- quickcopy = quickcopy ? IPP_TAG_COPY : 0;
+ quickcopy = (quickcopy && (srcattr->value_tag & IPP_TAG_CUPS_CONST)) ? IPP_TAG_CUPS_CONST : 0;
+ srctag = srcattr->value_tag & IPP_TAG_CUPS_MASK;
- switch (srcattr->value_tag & ~IPP_TAG_COPY)
+ switch (srctag)
{
case IPP_TAG_ZERO :
dstattr = ippAddSeparator(dst);
break;
- case IPP_TAG_INTEGER :
- case IPP_TAG_ENUM :
- dstattr = ippAddIntegers(dst, srcattr->group_tag, srcattr->value_tag,
- srcattr->name, srcattr->num_values, NULL);
- if (!dstattr)
- break;
-
- for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
- dstval->integer = srcval->integer;
+ case IPP_TAG_UNSUPPORTED_VALUE :
+ case IPP_TAG_DEFAULT :
+ case IPP_TAG_UNKNOWN :
+ case IPP_TAG_NOVALUE :
+ case IPP_TAG_NOTSETTABLE :
+ case IPP_TAG_DELETEATTR :
+ case IPP_TAG_ADMINDEFINE :
+ dstattr = ippAddOutOfBand(dst, srcattr->group_tag, srctag, srcattr->name);
break;
+ case IPP_TAG_INTEGER :
+ case IPP_TAG_ENUM :
case IPP_TAG_BOOLEAN :
- dstattr = ippAddBooleans(dst, srcattr->group_tag, srcattr->name,
- srcattr->num_values, NULL);
- if (!dstattr)
- break;
-
- for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
- dstval->boolean = srcval->boolean;
+ case IPP_TAG_DATE :
+ case IPP_TAG_RESOLUTION :
+ case IPP_TAG_RANGE :
+ if ((dstattr = ipp_add_attr(dst, srcattr->name, srcattr->group_tag, srctag, srcattr->num_values)) != NULL)
+ memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t));
break;
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
+ case IPP_TAG_RESERVED_STRING :
case IPP_TAG_KEYWORD :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
case IPP_TAG_CHARSET :
case IPP_TAG_LANGUAGE :
case IPP_TAG_MIMETYPE :
- dstattr = ippAddStrings(dst, srcattr->group_tag,
- (ipp_tag_t)(srcattr->value_tag | quickcopy),
- srcattr->name, srcattr->num_values, NULL, NULL);
- if (!dstattr)
+ if ((dstattr = ippAddStrings(dst, srcattr->group_tag, (ipp_tag_t)(srctag | quickcopy), srcattr->name, srcattr->num_values, NULL, NULL)) == NULL)
break;
if (quickcopy)
{
- for (i = srcattr->num_values, srcval = srcattr->values,
- dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
- dstval->string.text = srcval->string.text;
+ /*
+ * Can safely quick-copy these string values...
+ */
+
+ memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t));
}
- else if (srcattr->value_tag & IPP_TAG_COPY)
- {
- for (i = srcattr->num_values, srcval = srcattr->values,
- dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
- dstval->string.text = _cupsStrAlloc(srcval->string.text);
- }
else
{
- for (i = srcattr->num_values, srcval = srcattr->values,
- dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
- dstval->string.text = _cupsStrRetain(srcval->string.text);
- }
- break;
-
- case IPP_TAG_DATE :
- if (srcattr->num_values != 1)
- return (NULL);
-
- dstattr = ippAddDate(dst, srcattr->group_tag, srcattr->name,
- srcattr->values[0].date);
- break;
-
- case IPP_TAG_RESOLUTION :
- dstattr = ippAddResolutions(dst, srcattr->group_tag, srcattr->name,
- srcattr->num_values, IPP_RES_PER_INCH,
- NULL, NULL);
- if (!dstattr)
- break;
-
- for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
- {
- dstval->resolution.xres = srcval->resolution.xres;
- dstval->resolution.yres = srcval->resolution.yres;
- dstval->resolution.units = srcval->resolution.units;
- }
- break;
-
- case IPP_TAG_RANGE :
- dstattr = ippAddRanges(dst, srcattr->group_tag, srcattr->name,
- srcattr->num_values, NULL, NULL);
- if (!dstattr)
- break;
+ /*
+ * Otherwise do a normal reference counted copy...
+ */
- for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
- {
- dstval->range.lower = srcval->range.lower;
- dstval->range.upper = srcval->range.upper;
+ for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++)
+ dstval->string.text = _cupsStrAlloc(srcval->string.text);
}
break;
case IPP_TAG_TEXTLANG :
case IPP_TAG_NAMELANG :
- dstattr = ippAddStrings(dst, srcattr->group_tag,
- (ipp_tag_t)(srcattr->value_tag | quickcopy),
- srcattr->name, srcattr->num_values, NULL, NULL);
- if (!dstattr)
+ if ((dstattr = ippAddStrings(dst, srcattr->group_tag, (ipp_tag_t)(srctag | quickcopy), srcattr->name, srcattr->num_values, NULL, NULL)) == NULL)
break;
if (quickcopy)
{
- for (i = srcattr->num_values, srcval = srcattr->values,
- dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
- {
- dstval->string.language = srcval->string.language;
- dstval->string.text = srcval->string.text;
- }
+ /*
+ * Can safely quick-copy these string values...
+ */
+
+ memcpy(dstattr->values, srcattr->values, (size_t)srcattr->num_values * sizeof(_ipp_value_t));
}
- else if (srcattr->value_tag & IPP_TAG_COPY)
+ else if (srcattr->value_tag & IPP_TAG_CUPS_CONST)
{
- for (i = srcattr->num_values, srcval = srcattr->values,
- dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
+ /*
+ * Otherwise do a normal reference counted copy...
+ */
+
+ for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++)
{
if (srcval == srcattr->values)
dstval->string.language = _cupsStrAlloc(srcval->string.language);
dstval->string.text = _cupsStrAlloc(srcval->string.text);
}
}
- else
- {
- for (i = srcattr->num_values, srcval = srcattr->values,
- dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
- {
- if (srcval == srcattr->values)
- dstval->string.language = _cupsStrRetain(srcval->string.language);
- else
- dstval->string.language = dstattr->values[0].string.language;
-
- dstval->string.text = _cupsStrRetain(srcval->string.text);
- }
- }
break;
case IPP_TAG_BEGIN_COLLECTION :
- dstattr = ippAddCollections(dst, srcattr->group_tag, srcattr->name,
- srcattr->num_values, NULL);
- if (!dstattr)
+ if ((dstattr = ippAddCollections(dst, srcattr->group_tag, srcattr->name, srcattr->num_values, NULL)) == NULL)
break;
- for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
+ for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++)
{
dstval->collection = srcval->collection;
srcval->collection->use ++;
case IPP_TAG_STRING :
default :
- /* TODO: Implement quick copy for unknown/octetString values */
- dstattr = ippAddIntegers(dst, srcattr->group_tag, srcattr->value_tag,
- srcattr->name, srcattr->num_values, NULL);
- if (!dstattr)
+ if ((dstattr = ipp_add_attr(dst, srcattr->name, srcattr->group_tag, srctag, srcattr->num_values)) == NULL)
break;
- for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values;
- i > 0;
- i --, srcval ++, dstval ++)
+ for (i = srcattr->num_values, srcval = srcattr->values, dstval = dstattr->values; i > 0; i --, srcval ++, dstval ++)
{
dstval->unknown.length = srcval->unknown.length;
if (dstval->unknown.length > 0)
{
- if ((dstval->unknown.data = malloc(dstval->unknown.length)) == NULL)
+ if ((dstval->unknown.data = malloc((size_t)dstval->unknown.length)) == NULL)
dstval->unknown.length = 0;
else
- memcpy(dstval->unknown.data, srcval->unknown.data, dstval->unknown.length);
+ memcpy(dstval->unknown.data, srcval->unknown.data, (size_t)dstval->unknown.length);
}
}
break; /* anti-compiler-warning-code */
/*
* 'ippCopyAttributes()' - Copy attributes from one IPP message to another.
*
- * Zero or more attributes are copied from the source IPP message, @code@ src, to the
+ * Zero or more attributes are copied from the source IPP message, @code src@, to the
* destination IPP message, @code dst@. When @code quickcopy@ is non-zero, a "shallow"
* reference copy of the attribute is created - this should only be done as long as the
* original source IPP message will not be freed for the life of the destination.
* 0 to skip it. The function may also choose to do a partial copy of the source attribute
* itself.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on error */
ipp_attribute_t *srcattr; /* Source attribute */
- DEBUG_printf(("ippCopyAttributes(dst=%p, src=%p, quickcopy=%d, cb=%p, context=%p)",
- dst, src, quickcopy, cb, context));
+ DEBUG_printf(("ippCopyAttributes(dst=%p, src=%p, quickcopy=%d, cb=%p, context=%p)", (void *)dst, (void *)src, quickcopy, (void *)cb, context));
/*
* Range check input...
/*
- * 'ippDateToTime()' - Convert from RFC 1903 Date/Time format to UNIX time
- * in seconds.
+ * 'ippDateToTime()' - Convert from RFC 2579 Date/Time format to time in
+ * seconds.
*/
time_t /* O - UNIX time value */
-ippDateToTime(const ipp_uchar_t *date) /* I - RFC 1903 date info */
+ippDateToTime(const ipp_uchar_t *date) /* I - RFC 2579 date info */
{
struct tm unixdate; /* UNIX date/time info */
time_t t; /* Computed time */
memset(&unixdate, 0, sizeof(unixdate));
/*
- * RFC-1903 date/time format is:
+ * RFC-2579 date/time format is:
*
* Byte(s) Description
* ------- -----------
*next; /* Next attribute */
- DEBUG_printf(("ippDelete(ipp=%p)", ipp));
+ DEBUG_printf(("ippDelete(ipp=%p)", (void *)ipp));
if (!ipp)
return;
ipp->use --;
if (ipp->use > 0)
+ {
+ DEBUG_printf(("4debug_retain: %p IPP message (use=%d)", (void *)ipp, ipp->use));
return;
+ }
+
+ DEBUG_printf(("4debug_free: %p IPP message", (void *)ipp));
for (attr = ipp->attrs; attr != NULL; attr = next)
{
next = attr->next;
+ DEBUG_printf(("4debug_free: %p %s %s%s (%d values)", (void *)attr, attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), attr->num_values));
+
ipp_free_values(attr, 0, attr->num_values);
if (attr->name)
/*
* 'ippDeleteAttribute()' - Delete a single attribute in an IPP message.
*
- * @since CUPS 1.1.19/OS X 10.3@
+ * @since CUPS 1.1.19/macOS 10.3@
*/
void
*prev; /* Previous attribute */
- DEBUG_printf(("ippDeleteAttribute(ipp=%p, attr=%p(%s))", ipp, attr,
- attr ? attr->name : "(null)"));
+ DEBUG_printf(("ippDeleteAttribute(ipp=%p, attr=%p(%s))", (void *)ipp, (void *)attr, attr ? attr->name : "(null)"));
/*
* Range check input...
if (!attr)
return;
+ DEBUG_printf(("4debug_free: %p %s %s%s (%d values)", (void *)attr, attr->name, attr->num_values > 1 ? "1setOf " : "", ippTagString(attr->value_tag), attr->num_values));
+
/*
* Find the attribute in the list...
*/
*
* Deleting all values in an attribute deletes the attribute.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
/*
* 'ippFindAttribute()' - Find a named attribute in a request.
+ *
+ * Starting with CUPS 2.0, the attribute name can contain a hierarchical list
+ * of attribute and member names separated by slashes, for example
+ * "media-col/media-size".
*/
ipp_attribute_t * /* O - Matching attribute */
const char *name, /* I - Name of attribute */
ipp_tag_t type) /* I - Type of attribute */
{
- DEBUG_printf(("2ippFindAttribute(ipp=%p, name=\"%s\", type=%02x(%s))", ipp,
- name, type, ippTagString(type)));
+ DEBUG_printf(("2ippFindAttribute(ipp=%p, name=\"%s\", type=%02x(%s))", (void *)ipp, name, type, ippTagString(type)));
if (!ipp || !name)
return (NULL);
*/
ipp->current = NULL;
+ ipp->atend = 0;
/*
* Search for the attribute...
/*
* 'ippFindNextAttribute()' - Find the next named attribute in a request.
+ *
+ * Starting with CUPS 2.0, the attribute name can contain a hierarchical list
+ * of attribute and member names separated by slashes, for example
+ * "media-col/media-size".
*/
ipp_attribute_t * /* O - Matching attribute */
const char *name, /* I - Name of attribute */
ipp_tag_t type) /* I - Type of attribute */
{
- ipp_attribute_t *attr; /* Current atttribute */
+ ipp_attribute_t *attr, /* Current atttribute */
+ *childattr; /* Child attribute */
ipp_tag_t value_tag; /* Value tag */
+ char parent[1024], /* Parent attribute name */
+ *child = NULL; /* Child attribute name */
- DEBUG_printf(("2ippFindNextAttribute(ipp=%p, name=\"%s\", type=%02x(%s))",
- ipp, name, type, ippTagString(type)));
+ DEBUG_printf(("2ippFindNextAttribute(ipp=%p, name=\"%s\", type=%02x(%s))", (void *)ipp, name, type, ippTagString(type)));
if (!ipp || !name)
return (NULL);
- if (ipp->current)
+ DEBUG_printf(("3ippFindNextAttribute: atend=%d", ipp->atend));
+
+ if (ipp->atend)
+ return (NULL);
+
+ if (strchr(name, '/'))
+ {
+ /*
+ * Search for child attribute...
+ */
+
+ strlcpy(parent, name, sizeof(parent));
+ if ((child = strchr(parent, '/')) == NULL)
+ {
+ DEBUG_puts("3ippFindNextAttribute: Attribute name too long.");
+ return (NULL);
+ }
+
+ *child++ = '\0';
+
+ if (ipp->current && ipp->current->name && ipp->current->value_tag == IPP_TAG_BEGIN_COLLECTION && !strcmp(parent, ipp->current->name))
+ {
+ while (ipp->curindex < ipp->current->num_values)
+ {
+ if ((childattr = ippFindNextAttribute(ipp->current->values[ipp->curindex].collection, child, type)) != NULL)
+ return (childattr);
+
+ ipp->curindex ++;
+ if (ipp->curindex < ipp->current->num_values && ipp->current->values[ipp->curindex].collection)
+ ipp->current->values[ipp->curindex].collection->current = NULL;
+ }
+
+ ipp->prev = ipp->current;
+ ipp->current = ipp->current->next;
+ ipp->curindex = 0;
+
+ if (!ipp->current)
+ {
+ ipp->atend = 1;
+ return (NULL);
+ }
+ }
+
+ if (!ipp->current)
+ {
+ ipp->prev = NULL;
+ ipp->current = ipp->attrs;
+ ipp->curindex = 0;
+ }
+
+ name = parent;
+ attr = ipp->current;
+ }
+ else if (ipp->current)
{
ipp->prev = ipp->current;
attr = ipp->current->next;
for (; attr != NULL; ipp->prev = attr, attr = attr->next)
{
- DEBUG_printf(("4ippFindAttribute: attr=%p, name=\"%s\"", attr,
- attr->name));
+ DEBUG_printf(("4ippFindAttribute: attr=%p, name=\"%s\"", (void *)attr, attr->name));
- value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_MASK);
+ value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_CUPS_MASK);
if (attr->name != NULL && _cups_strcasecmp(attr->name, name) == 0 &&
- (value_tag == type || type == IPP_TAG_ZERO ||
+ (value_tag == type || type == IPP_TAG_ZERO || name == parent ||
(value_tag == IPP_TAG_TEXTLANG && type == IPP_TAG_TEXT) ||
(value_tag == IPP_TAG_NAMELANG && type == IPP_TAG_NAME)))
{
ipp->current = attr;
- return (attr);
+ if (name == parent && attr->value_tag == IPP_TAG_BEGIN_COLLECTION)
+ {
+ int i; /* Looping var */
+
+ for (i = 0; i < attr->num_values; i ++)
+ {
+ if ((childattr = ippFindAttribute(attr->values[i].collection, child, type)) != NULL)
+ {
+ attr->values[0].collection->curindex = i;
+ return (childattr);
+ }
+ }
+ }
+ else
+ return (attr);
}
}
ipp->current = NULL;
ipp->prev = NULL;
+ ipp->atend = 1;
return (NULL);
}
/*
* 'ippFirstAttribute()' - Return the first attribute in the message.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
ipp_attribute_t * /* O - First attribute or @code NULL@ if none */
* 'ippGetBoolean()' - Get a boolean value for an attribute.
*
* The @code element@ parameter specifies which value to get from 0 to
- * @link ippGetCount(attr)@ - 1.
+ * @code ippGetCount(attr)@ - 1.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
-int /* O - Boolean value or -1 on error */
+int /* O - Boolean value or 0 on error */
ippGetBoolean(ipp_attribute_t *attr, /* I - IPP attribute */
int element) /* I - Value number (0-based) */
{
if (!attr || attr->value_tag != IPP_TAG_BOOLEAN ||
element < 0 || element >= attr->num_values)
- return (-1);
+ return (0);
/*
* Return the value...
* 'ippGetCollection()' - Get a collection value for an attribute.
*
* The @code element@ parameter specifies which value to get from 0 to
- * @link ippGetCount(attr)@ - 1.
+ * @code ippGetCount(attr)@ - 1.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
ipp_t * /* O - Collection value or @code NULL@ on error */
/*
* 'ippGetCount()' - Get the number of values in an attribute.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
-int /* O - Number of values or -1 on error */
+int /* O - Number of values or 0 on error */
ippGetCount(ipp_attribute_t *attr) /* I - IPP attribute */
{
/*
*/
if (!attr)
- return (-1);
+ return (0);
/*
* Return the number of values...
/*
- * 'ippGetDate()' - Get a date value for an attribute.
+ * 'ippGetDate()' - Get a dateTime value for an attribute.
*
* The @code element@ parameter specifies which value to get from 0 to
- * @link ippGetCount(attr)@ - 1.
+ * @code ippGetCount(attr)@ - 1.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
-const ipp_uchar_t * /* O - Date value or @code NULL@ */
+const ipp_uchar_t * /* O - dateTime value or @code NULL@ */
ippGetDate(ipp_attribute_t *attr, /* I - IPP attribute */
int element) /* I - Value number (0-based) */
{
/*
* 'ippGetGroupTag()' - Get the group associated with an attribute.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
ipp_tag_t /* O - Group tag or @code IPP_TAG_ZERO@ on error */
* 'ippGetInteger()' - Get the integer/enum value for an attribute.
*
* The @code element@ parameter specifies which value to get from 0 to
- * @link ippGetCount(attr)@ - 1.
+ * @code ippGetCount(attr)@ - 1.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
-int /* O - Value or -1 on error */
+int /* O - Value or 0 on error */
ippGetInteger(ipp_attribute_t *attr, /* I - IPP attribute */
int element) /* I - Value number (0-based) */
{
if (!attr || (attr->value_tag != IPP_TAG_INTEGER && attr->value_tag != IPP_TAG_ENUM) ||
element < 0 || element >= attr->num_values)
- return (-1);
+ return (0);
/*
* Return the value...
/*
* 'ippGetName()' - Get the attribute name.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
const char * /* O - Attribute name or @code NULL@ for separators */
}
+/*
+ * 'ippGetOctetString()' - Get an octetString value from an IPP attribute.
+ *
+ * The @code element@ parameter specifies which value to get from 0 to
+ * @code ippGetCount(attr)@ - 1.
+ *
+ * @since CUPS 1.7/macOS 10.9@
+ */
+
+void * /* O - Pointer to octetString data */
+ippGetOctetString(
+ ipp_attribute_t *attr, /* I - IPP attribute */
+ int element, /* I - Value number (0-based) */
+ int *datalen) /* O - Length of octetString data */
+{
+ /*
+ * Range check input...
+ */
+
+ if (!attr || attr->value_tag != IPP_TAG_STRING ||
+ element < 0 || element >= attr->num_values)
+ {
+ if (datalen)
+ *datalen = 0;
+
+ return (NULL);
+ }
+
+ /*
+ * Return the values...
+ */
+
+ if (datalen)
+ *datalen = attr->values[element].unknown.length;
+
+ return (attr->values[element].unknown.data);
+}
+
+
/*
* 'ippGetOperation()' - Get the operation ID in an IPP message.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
-ipp_op_t /* O - Operation ID or -1 on error */
+ipp_op_t /* O - Operation ID or 0 on error */
ippGetOperation(ipp_t *ipp) /* I - IPP request message */
{
/*
*/
if (!ipp)
- return ((ipp_op_t)-1);
+ return ((ipp_op_t)0);
/*
* Return the value...
* 'ippGetRange()' - Get a rangeOfInteger value from an attribute.
*
* The @code element@ parameter specifies which value to get from 0 to
- * @link ippGetCount(attr)@ - 1.
+ * @code ippGetCount(attr)@ - 1.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
-int /* O - Lower value of range or -1 */
+int /* O - Lower value of range or 0 */
ippGetRange(ipp_attribute_t *attr, /* I - IPP attribute */
int element, /* I - Value number (0-based) */
int *uppervalue)/* O - Upper value of range */
element < 0 || element >= attr->num_values)
{
if (uppervalue)
- *uppervalue = -1;
+ *uppervalue = 0;
- return (-1);
+ return (0);
}
/*
/*
* 'ippGetRequestId()' - Get the request ID from an IPP message.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
-int /* O - Request ID or -1 on error */
+int /* O - Request ID or 0 on error */
ippGetRequestId(ipp_t *ipp) /* I - IPP message */
{
/*
*/
if (!ipp)
- return (-1);
+ return (0);
/*
* Return the request ID...
* 'ippGetResolution()' - Get a resolution value for an attribute.
*
* The @code element@ parameter specifies which value to get from 0 to
- * @link ippGetCount(attr)@ - 1.
+ * @code ippGetCount(attr)@ - 1.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
-int /* O - Horizontal/cross feed resolution or -1 */
+int /* O - Horizontal/cross feed resolution or 0 */
ippGetResolution(
ipp_attribute_t *attr, /* I - IPP attribute */
int element, /* I - Value number (0-based) */
if (!attr || attr->value_tag != IPP_TAG_RESOLUTION ||
element < 0 || element >= attr->num_values)
- return (-1);
+ {
+ if (yres)
+ *yres = 0;
+
+ if (units)
+ *units = (ipp_res_t)0;
+
+ return (0);
+ }
/*
* Return the value...
/*
* 'ippGetState()' - Get the IPP message state.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
ipp_state_t /* O - IPP message state value */
*/
if (!ipp)
- return (IPP_IDLE);
+ return (IPP_STATE_IDLE);
/*
* Return the value...
/*
* 'ippGetStatusCode()' - Get the status code from an IPP response or event message.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
ipp_status_t /* O - Status code in IPP message */
*/
if (!ipp)
- return (IPP_INTERNAL_ERROR);
+ return (IPP_STATUS_ERROR_INTERNAL);
/*
* Return the value...
* 'ippGetString()' - Get the string and optionally the language code for an attribute.
*
* The @code element@ parameter specifies which value to get from 0 to
- * @link ippGetCount(attr)@ - 1.
+ * @code ippGetCount(attr)@ - 1.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
const char *
int element, /* I - Value number (0-based) */
const char **language)/* O - Language code (@code NULL@ for don't care) */
{
+ ipp_tag_t tag; /* Value tag */
+
+
/*
* Range check input...
*/
- if (!attr || element < 0 || element >= attr->num_values ||
- (attr->value_tag != IPP_TAG_TEXTLANG && attr->value_tag != IPP_TAG_NAMELANG &&
- (attr->value_tag < IPP_TAG_TEXT || attr->value_tag > IPP_TAG_MIMETYPE)))
+ tag = ippGetValueTag(attr);
+
+ if (!attr || element < 0 || element >= attr->num_values || (tag != IPP_TAG_TEXTLANG && tag != IPP_TAG_NAMELANG && (tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE)))
return (NULL);
/*
/*
* 'ippGetValueTag()' - Get the value tag for an attribute.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
ipp_tag_t /* O - Value tag or @code IPP_TAG_ZERO@ on error */
* Return the value...
*/
- return (attr->value_tag & IPP_TAG_MASK);
+ return (attr->value_tag & IPP_TAG_CUPS_MASK);
}
/*
* 'ippGetVersion()' - Get the major and minor version number from an IPP message.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
-int /* O - Major version number or -1 on error */
+int /* O - Major version number or 0 on error */
ippGetVersion(ipp_t *ipp, /* I - IPP message */
- int *minor) /* O - Minor version number or @code NULL@ */
+ int *minor) /* O - Minor version number or @code NULL@ for don't care */
{
/*
* Range check input...
if (!ipp)
{
if (minor)
- *minor = -1;
+ *minor = 0;
- return (-1);
+ return (0);
}
/*
/*
* 'ippNextAttribute()' - Return the next attribute in the message.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
ipp_attribute_t * /* O - Next attribute or @code NULL@ if none */
ipp_t * /* O - New IPP message */
ippNew(void)
{
- ipp_t *temp; /* New IPP message */
+ ipp_t *temp; /* New IPP message */
+ _cups_globals_t *cg = _cupsGlobals();
+ /* Global data */
DEBUG_puts("ippNew()");
if ((temp = (ipp_t *)calloc(1, sizeof(ipp_t))) != NULL)
{
/*
- * Default to IPP 2.0...
+ * Set default version - usually 2.0...
*/
- temp->request.any.version[0] = 2;
- temp->request.any.version[1] = 0;
+ DEBUG_printf(("4debug_alloc: %p IPP message", (void *)temp));
+
+ if (cg->server_version == 0)
+ _cupsSetDefaults();
+
+ temp->request.any.version[0] = (ipp_uchar_t)(cg->server_version / 10);
+ temp->request.any.version[1] = (ipp_uchar_t)(cg->server_version % 10);
temp->use = 1;
}
- DEBUG_printf(("1ippNew: Returning %p", temp));
+ DEBUG_printf(("1ippNew: Returning %p", (void *)temp));
return (temp);
}
/*
* 'ippNewRequest()' - Allocate a new IPP request message.
*
- * The new request message is initialized with the attributes-charset and
- * attributes-natural-language attributes added. The
- * attributes-natural-language value is derived from the current locale.
+ * The new request message is initialized with the "attributes-charset" and
+ * "attributes-natural-language" attributes added. The
+ * "attributes-natural-language" value is derived from the current locale.
*
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
*/
ipp_t * /* O - IPP request message */
/*
* 'ippNewResponse()' - Allocate a new IPP response message.
*
- * The new response message is initialized with the same version-number,
- * request-id, attributes-charset, and attributes-natural-language as the
- * provided request message. If the attributes-charset or
- * attributes-natural-language attributes are missing from the request,
- * "utf-8" and a value derived from the current locale are substituted,
+ * The new response message is initialized with the same "version-number",
+ * "request-id", "attributes-charset", and "attributes-natural-language" as the
+ * provided request message. If the "attributes-charset" or
+ * "attributes-natural-language" attributes are missing from the request,
+ * 'utf-8' and a value derived from the current locale are substituted,
* respectively.
*
- * @since CUPS 1.7@
+ * @since CUPS 1.7/macOS 10.9@
*/
ipp_t * /* O - IPP response message */
ippRead(http_t *http, /* I - HTTP connection */
ipp_t *ipp) /* I - IPP data */
{
- DEBUG_printf(("ippRead(http=%p, ipp=%p), data_remaining=" CUPS_LLFMT,
- http, ipp, CUPS_LLCAST (http ? http->data_remaining : -1)));
+ DEBUG_printf(("ippRead(http=%p, ipp=%p), data_remaining=" CUPS_LLFMT, (void *)http, (void *)ipp, CUPS_LLCAST (http ? http->data_remaining : -1)));
if (!http)
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
- DEBUG_printf(("2ippRead: http->state=%d, http->used=%d", http->state,
- http->used));
+ DEBUG_printf(("2ippRead: http->state=%d, http->used=%d", http->state, http->used));
return (ippReadIO(http, (ipp_iocb_t)ipp_read_http, http->blocking, NULL,
ipp));
/*
* 'ippReadFile()' - Read data for an IPP message from a file.
*
- * @since CUPS 1.1.19/OS X 10.3@
+ * @since CUPS 1.1.19/macOS 10.3@
*/
ipp_state_t /* O - Current state */
ippReadFile(int fd, /* I - HTTP data */
ipp_t *ipp) /* I - IPP data */
{
- DEBUG_printf(("ippReadFile(fd=%d, ipp=%p)", fd, ipp));
+ DEBUG_printf(("ippReadFile(fd=%d, ipp=%p)", fd, (void *)ipp));
return (ippReadIO(&fd, (ipp_iocb_t)ipp_read_file, 1, NULL, ipp));
}
/*
* 'ippReadIO()' - Read data for an IPP message.
*
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
*/
ipp_state_t /* O - Current state */
_ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippReadIO(src=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)",
- src, cb, blocking, parent, ipp));
- DEBUG_printf(("2ippReadIO: ipp->state=%d", ipp ? ipp->state : IPP_ERROR));
+ DEBUG_printf(("ippReadIO(src=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)", (void *)src, (void *)cb, blocking, (void *)parent, (void *)ipp));
+ DEBUG_printf(("2ippReadIO: ipp->state=%d", ipp ? ipp->state : IPP_STATE_ERROR));
if (!src || !ipp)
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
if ((buffer = (unsigned char *)_cupsBufferGet(IPP_BUF_SIZE)) == NULL)
{
DEBUG_puts("1ippReadIO: Unable to get read buffer.");
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
switch (ipp->state)
{
- case IPP_IDLE :
+ case IPP_STATE_IDLE :
ipp->state ++; /* Avoid common problem... */
- case IPP_HEADER :
+ case IPP_STATE_HEADER :
if (parent == NULL)
{
/*
{
DEBUG_puts("1ippReadIO: Unable to read header.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
/*
ipp->request.any.request_id));
}
- ipp->state = IPP_ATTRIBUTE;
+ ipp->state = IPP_STATE_ATTRIBUTE;
ipp->current = NULL;
ipp->curtag = IPP_TAG_ZERO;
ipp->prev = ipp->last;
if (!blocking)
break;
- case IPP_ATTRIBUTE :
+ case IPP_STATE_ATTRIBUTE :
for (;;)
{
if ((*cb)(src, buffer, 1) < 1)
{
DEBUG_puts("1ippReadIO: Callback returned EOF/error");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- DEBUG_printf(("2ippReadIO: ipp->current=%p, ipp->prev=%p",
- ipp->current, ipp->prev));
+ DEBUG_printf(("2ippReadIO: ipp->current=%p, ipp->prev=%p", (void *)ipp->current, (void *)ipp->prev));
/*
* Read this attribute...
{
DEBUG_puts("1ippReadIO: Callback returned EOF/error");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
tag = (ipp_tag_t)((((((buffer[0] << 8) | buffer[1]) << 8) |
buffer[2]) << 8) | buffer[3]);
- if (tag & IPP_TAG_COPY)
+ if (tag & IPP_TAG_CUPS_CONST)
{
/*
* Fail if the high bit is set in the tag...
*/
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP extension tag larger than 0x7FFFFFFF."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP extension tag larger than 0x7FFFFFFF."), 1);
DEBUG_printf(("1ippReadIO: bad tag 0x%x.", tag));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
DEBUG_puts("2ippReadIO: IPP_TAG_END.");
- ipp->state = IPP_DATA;
+ ipp->state = IPP_STATE_DATA;
break;
}
+ else if (tag == IPP_TAG_ZERO || (tag == IPP_TAG_OPERATION && ipp->curtag != IPP_TAG_ZERO))
+ {
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("Invalid group tag."), 1);
+ DEBUG_printf(("1ippReadIO: bad tag 0x%02x.", tag));
+ _cupsBufferRelease((char *)buffer);
+ return (IPP_STATE_ERROR);
+ }
else if (tag < IPP_TAG_UNSUPPORTED_VALUE)
{
/*
ipp->curtag = tag;
ipp->current = NULL;
- DEBUG_printf(("2ippReadIO: group tag=%x(%s), ipp->prev=%p", tag,
- ippTagString(tag), ipp->prev));
+ DEBUG_printf(("2ippReadIO: group tag=%x(%s), ipp->prev=%p", tag, ippTagString(tag), (void *)ipp->prev));
continue;
}
{
DEBUG_puts("1ippReadIO: unable to read name length.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
n = (buffer[0] << 8) | buffer[1];
if (n >= IPP_BUF_SIZE)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP name larger than 32767 bytes."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP name larger than 32767 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad name length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_printf(("2ippReadIO: name length=%d", n));
if (ipp->current == NULL)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP attribute has no name."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP attribute has no name."), 1);
DEBUG_puts("1ippReadIO: Attribute without name and no current.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
attr = ipp->current;
- value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_MASK);
+ value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_CUPS_MASK);
/*
* Make sure we aren't adding a new value of a different
(tag < IPP_TAG_TEXT || tag > IPP_TAG_MIMETYPE) &&
tag != IPP_TAG_NOVALUE)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP 1setOf attribute with incompatible value "
"tags."), 1);
DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if (value_tag != tag)
if (tag != IPP_TAG_INTEGER && tag != IPP_TAG_RANGE)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP 1setOf attribute with incompatible value "
"tags."), 1);
DEBUG_printf(("1ippReadIO: 1setOf value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if (value_tag == IPP_TAG_INTEGER && tag == IPP_TAG_RANGE)
}
else if (value_tag != tag)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP 1setOf attribute with incompatible value "
"tags."), 1);
DEBUG_printf(("1ippReadIO: value tag %x(%s) != %x(%s)",
value_tag, ippTagString(value_tag), tag,
ippTagString(tag)));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
/*
if ((value = ipp_set_value(ipp, &attr, attr->num_values)) == NULL)
{
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
else if (tag == IPP_TAG_MEMBERNAME)
if (n)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP member name is not empty."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP member name is not empty."), 1);
DEBUG_puts("1ippReadIO: member name not empty.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if (ipp->current)
attr = ipp->current = ipp_add_attr(ipp, NULL, ipp->curtag, IPP_TAG_ZERO, 1);
if (!attr)
{
- _cupsSetHTTPError(HTTP_ERROR);
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("1ippReadIO: unable to allocate attribute.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- DEBUG_printf(("2ippReadIO: membername, ipp->current=%p, ipp->prev=%p",
- ipp->current, ipp->prev));
+ DEBUG_printf(("2ippReadIO: membername, ipp->current=%p, ipp->prev=%p", (void *)ipp->current, (void *)ipp->prev));
value = attr->values;
}
* New attribute; read the name and add it...
*/
- if ((*cb)(src, buffer, n) < n)
+ if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: unable to read name.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
buffer[n] = '\0';
if ((attr = ipp->current = ipp_add_attr(ipp, (char *)buffer, ipp->curtag, tag,
1)) == NULL)
{
- _cupsSetHTTPError(HTTP_ERROR);
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("1ippReadIO: unable to allocate attribute.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- DEBUG_printf(("2ippReadIO: name=\"%s\", ipp->current=%p, "
- "ipp->prev=%p", buffer, ipp->current, ipp->prev));
+ DEBUG_printf(("2ippReadIO: name=\"%s\", ipp->current=%p, ipp->prev=%p", buffer, (void *)ipp->current, (void *)ipp->prev));
value = attr->values;
}
{
DEBUG_puts("1ippReadIO: unable to read value length.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
n = (buffer[0] << 8) | buffer[1];
if (n >= IPP_BUF_SIZE)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP value larger than 32767 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
switch (tag)
if (n != 4)
{
if (tag == IPP_TAG_INTEGER)
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP integer value not 4 bytes."), 1);
else
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP enum value not 4 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad integer value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((*cb)(src, buffer, 4) < 4)
{
DEBUG_puts("1ippReadIO: Unable to read integer value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
n = (((((buffer[0] << 8) | buffer[1]) << 8) | buffer[2]) << 8) |
case IPP_TAG_BOOLEAN :
if (n != 1)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP boolean value not 1 byte."),
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP boolean value not 1 byte."),
1);
DEBUG_printf(("1ippReadIO: bad boolean value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((*cb)(src, buffer, 1) < 1)
{
DEBUG_puts("1ippReadIO: Unable to read boolean value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- value->boolean = buffer[0];
+ value->boolean = (char)buffer[0];
break;
- case IPP_TAG_NOVALUE :
+ case IPP_TAG_UNSUPPORTED_VALUE :
+ case IPP_TAG_DEFAULT :
+ case IPP_TAG_UNKNOWN :
+ case IPP_TAG_NOVALUE :
case IPP_TAG_NOTSETTABLE :
case IPP_TAG_DELETEATTR :
case IPP_TAG_ADMINDEFINE :
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
+ case IPP_TAG_RESERVED_STRING :
case IPP_TAG_KEYWORD :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
case IPP_TAG_MIMETYPE :
if (n > 0)
{
- if ((*cb)(src, buffer, n) < n)
+ if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: unable to read string value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
case IPP_TAG_DATE :
if (n != 11)
{
- _cupsSetError(IPP_INTERNAL_ERROR, _("IPP date value not 11 bytes."), 1);
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL, _("IPP date value not 11 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad date value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((*cb)(src, value->date, 11) < 11)
{
DEBUG_puts("1ippReadIO: Unable to read date value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
break;
case IPP_TAG_RESOLUTION :
if (n != 9)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP resolution value not 9 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad resolution value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((*cb)(src, buffer, 9) < 9)
{
DEBUG_puts("1ippReadIO: Unable to read resolution value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
value->resolution.xres =
case IPP_TAG_RANGE :
if (n != 8)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP rangeOfInteger value not 8 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad rangeOfInteger value length "
"%d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((*cb)(src, buffer, 8) < 8)
{
DEBUG_puts("1ippReadIO: Unable to read range value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
value->range.lower =
if (n < 4)
{
if (tag == IPP_TAG_TEXTLANG)
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP textWithLanguage value less than "
"minimum 4 bytes."), 1);
else
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP nameWithLanguage value less than "
"minimum 4 bytes."), 1);
DEBUG_printf(("1ippReadIO: bad stringWithLanguage value "
"length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- if ((*cb)(src, buffer, n) < n)
+ if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read string w/language "
"value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
n = (bufptr[0] << 8) | bufptr[1];
- if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE) ||
- n >= sizeof(string))
+ if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE) || n >= (int)sizeof(string))
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP language length overflows value."), 1);
DEBUG_printf(("1ippReadIO: bad language value length %d.",
n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
else if (n >= IPP_MAX_LANGUAGE)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP language length too large."), 1);
DEBUG_printf(("1ippReadIO: bad language value length %d.",
n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- memcpy(string, bufptr + 2, n);
+ memcpy(string, bufptr + 2, (size_t)n);
string[n] = '\0';
value->string.language = _cupsStrAlloc((char *)string);
if ((bufptr + 2 + n) >= (buffer + IPP_BUF_SIZE))
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP string length overflows value."), 1);
DEBUG_printf(("1ippReadIO: bad string value length %d.", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr[2 + n] = '\0';
if (n > 0)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP begCollection value not 0 bytes."), 1);
DEBUG_puts("1ippReadIO: begCollection tag with value length "
"> 0.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- if (ippReadIO(src, cb, 1, ipp, value->collection) == IPP_ERROR)
+ if (ippReadIO(src, cb, 1, ipp, value->collection) == IPP_STATE_ERROR)
{
DEBUG_puts("1ippReadIO: Unable to read collection value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
break;
if (n > 0)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP endCollection value not 0 bytes."), 1);
DEBUG_puts("1ippReadIO: endCollection tag with value length "
"> 0.");
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_puts("1ippReadIO: endCollection tag...");
- return (ipp->state = IPP_DATA);
+ return (ipp->state = IPP_STATE_DATA);
case IPP_TAG_MEMBERNAME :
/*
if (!attr)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP memberName with no attribute."), 1);
DEBUG_puts("1ippReadIO: Member name without attribute.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
else if (n == 0)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP memberName value is empty."), 1);
DEBUG_puts("1ippReadIO: Empty member name value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- else if ((*cb)(src, buffer, n) < n)
+ else if ((*cb)(src, buffer, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read member name value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
buffer[n] = '\0';
DEBUG_printf(("2ippReadIO: member name=\"%s\"", attr->name));
break;
+ case IPP_TAG_STRING :
default : /* Other unsupported values */
if (tag == IPP_TAG_STRING && n > IPP_MAX_LENGTH)
{
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP octetString length too large."), 1);
DEBUG_printf(("1ippReadIO: bad octetString value length %d.",
n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
value->unknown.length = n;
if (n > 0)
{
- if ((value->unknown.data = malloc(n)) == NULL)
+ if ((value->unknown.data = malloc((size_t)n)) == NULL)
{
- _cupsSetHTTPError(HTTP_ERROR);
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("1ippReadIO: Unable to allocate value");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- if ((*cb)(src, value->unknown.data, n) < n)
+ if ((*cb)(src, value->unknown.data, (size_t)n) < n)
{
DEBUG_puts("1ippReadIO: Unable to read unsupported value.");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
else
}
break;
- case IPP_DATA :
+ case IPP_STATE_DATA :
break;
default :
* The @code attr@ parameter may be modified as a result of setting the value.
*
* The @code element@ parameter specifies which value to set from 0 to
- * @link ippGetCount(attr)@.
+ * @code ippGetCount(attr)@.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
-ippSetBoolean(ipp_t *ipp, /* IO - IPP message */
+ippSetBoolean(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
int boolvalue)/* I - Boolean value */
*/
if ((value = ipp_set_value(ipp, attr, element)) != NULL)
- value->boolean = boolvalue;
+ value->boolean = (char)boolvalue;
return (value != NULL);
}
* The @code attr@ parameter may be modified as a result of setting the value.
*
* The @code element@ parameter specifies which value to set from 0 to
- * @link ippGetCount(attr)@.
+ * @code ippGetCount(attr)@.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
ippSetCollection(
- ipp_t *ipp, /* IO - IPP message */
+ ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
ipp_t *colvalue) /* I - Collection value */
/*
- * 'ippSetDate()' - Set a date value in an attribute.
+ * 'ippSetDate()' - Set a dateTime value in an attribute.
*
* The @code ipp@ parameter refers to an IPP message previously created using
* the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
* The @code attr@ parameter may be modified as a result of setting the value.
*
* The @code element@ parameter specifies which value to set from 0 to
- * @link ippGetCount(attr)@.
+ * @code ippGetCount(attr)@.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
-ippSetDate(ipp_t *ipp, /* IO - IPP message */
+ippSetDate(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
- const ipp_uchar_t *datevalue)/* I - Date value */
+ const ipp_uchar_t *datevalue)/* I - dateTime value */
{
_ipp_value_t *value; /* Current value */
* (@code IPP_TAG_OPERATION@), printer (@code IPP_TAG_PRINTER@), subscription
* (@code IPP_TAG_SUBSCRIPTION@), or unsupported (@code IPP_TAG_UNSUPPORTED_GROUP@).
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
ippSetGroupTag(
- ipp_t *ipp, /* IO - IPP message */
+ ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - Attribute */
ipp_tag_t group_tag) /* I - Group tag */
{
/*
- * Range check input - group tag must be 0x01 to 0x0F, per RFC 2911...
+ * Range check input - group tag must be 0x01 to 0x0F, per RFC 8011...
*/
if (!ipp || !attr || !*attr ||
* The @code attr@ parameter may be modified as a result of setting the value.
*
* The @code element@ parameter specifies which value to set from 0 to
- * @link ippGetCount(attr)@.
+ * @code ippGetCount(attr)@.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
-ippSetInteger(ipp_t *ipp, /* IO - IPP message */
+ippSetInteger(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
int intvalue) /* I - Integer/enum value */
*
* The @code attr@ parameter may be modified as a result of setting the value.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
-ippSetName(ipp_t *ipp, /* IO - IPP message */
+ippSetName(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
const char *name) /* I - Attribute name */
{
}
+/*
+ * 'ippSetOctetString()' - Set an octetString value in an IPP attribute.
+ *
+ * The @code ipp@ parameter refers to an IPP message previously created using
+ * the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
+ *
+ * The @code attr@ parameter may be modified as a result of setting the value.
+ *
+ * The @code element@ parameter specifies which value to set from 0 to
+ * @code ippGetCount(attr)@.
+ *
+ * @since CUPS 1.7/macOS 10.9@
+ */
+
+int /* O - 1 on success, 0 on failure */
+ippSetOctetString(
+ ipp_t *ipp, /* I - IPP message */
+ ipp_attribute_t **attr, /* IO - IPP attribute */
+ int element, /* I - Value number (0-based) */
+ const void *data, /* I - Pointer to octetString data */
+ int datalen) /* I - Length of octetString data */
+{
+ _ipp_value_t *value; /* Current value */
+
+
+ /*
+ * Range check input...
+ */
+
+ if (!ipp || !attr || !*attr || (*attr)->value_tag != IPP_TAG_STRING ||
+ element < 0 || element > (*attr)->num_values ||
+ datalen < 0 || datalen > IPP_MAX_LENGTH)
+ return (0);
+
+ /*
+ * Set the value and return...
+ */
+
+ if ((value = ipp_set_value(ipp, attr, element)) != NULL)
+ {
+ if ((int)((*attr)->value_tag) & IPP_TAG_CUPS_CONST)
+ {
+ /*
+ * Just copy the pointer...
+ */
+
+ value->unknown.data = (void *)data;
+ value->unknown.length = datalen;
+ }
+ else
+ {
+ /*
+ * Copy the data...
+ */
+
+ if (value->unknown.data)
+ {
+ /*
+ * Free previous data...
+ */
+
+ free(value->unknown.data);
+
+ value->unknown.data = NULL;
+ value->unknown.length = 0;
+ }
+
+ if (datalen > 0)
+ {
+ void *temp; /* Temporary data pointer */
+
+ if ((temp = malloc((size_t)datalen)) != NULL)
+ {
+ memcpy(temp, data, (size_t)datalen);
+
+ value->unknown.data = temp;
+ value->unknown.length = datalen;
+ }
+ else
+ return (0);
+ }
+ }
+ }
+
+ return (value != NULL);
+}
+
+
/*
* 'ippSetOperation()' - Set the operation ID in an IPP request message.
*
* The @code ipp@ parameter refers to an IPP message previously created using
* the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
* The @code attr@ parameter may be modified as a result of setting the value.
*
* The @code element@ parameter specifies which value to set from 0 to
- * @link ippGetCount(attr)@.
+ * @code ippGetCount(attr)@.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
-ippSetRange(ipp_t *ipp, /* IO - IPP message */
+ippSetRange(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
int lowervalue, /* I - Lower bound for range */
*
* The @code request_id@ parameter must be greater than 0.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
* The @code attr@ parameter may be modified as a result of setting the value.
*
* The @code element@ parameter specifies which value to set from 0 to
- * @link ippGetCount(attr)@.
+ * @code ippGetCount(attr)@.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
ippSetResolution(
- ipp_t *ipp, /* IO - IPP message */
+ ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
ipp_res_t unitsvalue, /* I - Resolution units */
/*
* 'ippSetState()' - Set the current state of the IPP message.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
* The @code ipp@ parameter refers to an IPP message previously created using
* the @link ippNew@, @link ippNewRequest@, or @link ippNewResponse@ functions.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
* The @code attr@ parameter may be modified as a result of setting the value.
*
* The @code element@ parameter specifies which value to set from 0 to
- * @link ippGetCount(attr)@.
+ * @code ippGetCount(attr)@.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
-ippSetString(ipp_t *ipp, /* IO - IPP message */
+ippSetString(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
const char *strvalue) /* I - String value */
{
char *temp; /* Temporary string */
_ipp_value_t *value; /* Current value */
+ ipp_tag_t value_tag; /* Value tag */
/*
* Range check input...
*/
+ if (attr && *attr)
+ value_tag = (*attr)->value_tag & IPP_TAG_CUPS_MASK;
+ else
+ value_tag = IPP_TAG_ZERO;
+
if (!ipp || !attr || !*attr ||
- ((*attr)->value_tag != IPP_TAG_TEXTLANG &&
- (*attr)->value_tag != IPP_TAG_NAMELANG &&
- ((*attr)->value_tag < IPP_TAG_TEXT ||
- (*attr)->value_tag > IPP_TAG_MIMETYPE)) ||
+ (value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG &&
+ value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE ||
element < 0 || element > (*attr)->num_values || !strvalue)
return (0);
if (element > 0)
value->string.language = (*attr)->values[0].string.language;
- if ((int)((*attr)->value_tag) & IPP_TAG_COPY)
+ if ((int)((*attr)->value_tag) & IPP_TAG_CUPS_CONST)
value->string.text = (char *)strvalue;
else if ((temp = _cupsStrAlloc(strvalue)) != NULL)
{
* The @code attr@ parameter may be modified as a result of setting the value.
*
* The @code element@ parameter specifies which value to set from 0 to
- * @link ippGetCount(attr)@.
+ * @code ippGetCount(attr)@.
*
* The @code format@ parameter uses formatting characters compatible with the
* printf family of standard functions. Additional arguments follow it as
* needed. The formatted string is truncated as needed to the maximum length of
* the corresponding value type.
*
- * @since CUPS 1.7@
+ * @since CUPS 1.7/macOS 10.9@
*/
int /* O - 1 on success, 0 on failure */
-ippSetStringf(ipp_t *ipp, /* IO - IPP message */
+ippSetStringf(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
const char *format, /* I - Printf-style format string */
* The @code attr@ parameter may be modified as a result of setting the value.
*
* The @code element@ parameter specifies which value to set from 0 to
- * @link ippGetCount(attr)@.
+ * @code ippGetCount(attr)@.
*
* The @code format@ parameter uses formatting characters compatible with the
* printf family of standard functions. Additional arguments follow it as
* needed. The formatted string is truncated as needed to the maximum length of
* the corresponding value type.
*
- * @since CUPS 1.7@
+ * @since CUPS 1.7/macOS 10.9@
*/
int /* O - 1 on success, 0 on failure */
-ippSetStringfv(ipp_t *ipp, /* IO - IPP message */
+ippSetStringfv(ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
int element, /* I - Value number (0-based) */
const char *format, /* I - Printf-style format string */
if (!ipp || !attr || !*attr ||
(value_tag < IPP_TAG_TEXT && value_tag != IPP_TAG_TEXTLANG &&
value_tag != IPP_TAG_NAMELANG) || value_tag > IPP_TAG_MIMETYPE ||
- !format || !ap)
+ !format)
return (0);
/*
if (!s)
s = "(null)";
- bytes = strlen(s);
+ bytes = (ssize_t)strlen(s);
strlcpy(buffer, s, sizeof(buffer));
}
else
* code in the "attributes-natural-language" attribute or, if not present, the language
* code for the current locale.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
ippSetValueTag(
- ipp_t *ipp, /* IO - IPP message */
+ ipp_t *ipp, /* I - IPP message */
ipp_attribute_t **attr, /* IO - IPP attribute */
ipp_tag_t value_tag) /* I - Value tag */
{
* Otherwise implement changes as needed...
*/
- temp_tag = (ipp_tag_t)((int)((*attr)->value_tag) & IPP_TAG_MASK);
+ temp_tag = (ipp_tag_t)((int)((*attr)->value_tag) & IPP_TAG_CUPS_MASK);
switch (value_tag)
{
temp_tag != IPP_TAG_MIMETYPE)
return (0);
- (*attr)->value_tag = (ipp_tag_t)(IPP_TAG_NAME | ((*attr)->value_tag & IPP_TAG_COPY));
+ (*attr)->value_tag = (ipp_tag_t)(IPP_TAG_NAME | ((*attr)->value_tag & IPP_TAG_CUPS_CONST));
break;
case IPP_TAG_NAMELANG :
i --, value ++)
value->string.language = (*attr)->values[0].string.language;
- if ((int)(*attr)->value_tag & IPP_TAG_COPY)
+ if ((int)(*attr)->value_tag & IPP_TAG_CUPS_CONST)
{
/*
* Make copies of all values...
*
* The valid version numbers are currently 1.0, 1.1, 2.0, 2.1, and 2.2.
*
- * @since CUPS 1.6/OS X 10.8@
+ * @since CUPS 1.6/macOS 10.8@
*/
int /* O - 1 on success, 0 on failure */
* Set the version number...
*/
- ipp->request.any.version[0] = major;
- ipp->request.any.version[1] = minor;
+ ipp->request.any.version[0] = (ipp_uchar_t)major;
+ ipp->request.any.version[1] = (ipp_uchar_t)minor;
return (1);
}
/*
- * 'ippTimeToDate()' - Convert from UNIX time to RFC 1903 format.
+ * 'ippTimeToDate()' - Convert from time in seconds to RFC 2579 format.
*/
-const ipp_uchar_t * /* O - RFC-1903 date/time data */
-ippTimeToDate(time_t t) /* I - UNIX time value */
+const ipp_uchar_t * /* O - RFC-2579 date/time data */
+ippTimeToDate(time_t t) /* I - Time in seconds */
{
struct tm *unixdate; /* UNIX unixdate/time info */
ipp_uchar_t *date = _cupsGlobals()->ipp_date;
- /* RFC-1903 date/time data */
+ /* RFC-2579 date/time data */
/*
- * RFC-1903 date/time format is:
+ * RFC-2579 date/time format is:
*
* Byte(s) Description
* ------- -----------
unixdate = gmtime(&t);
unixdate->tm_year += 1900;
- date[0] = unixdate->tm_year >> 8;
- date[1] = unixdate->tm_year;
- date[2] = unixdate->tm_mon + 1;
- date[3] = unixdate->tm_mday;
- date[4] = unixdate->tm_hour;
- date[5] = unixdate->tm_min;
- date[6] = unixdate->tm_sec;
+ date[0] = (ipp_uchar_t)(unixdate->tm_year >> 8);
+ date[1] = (ipp_uchar_t)(unixdate->tm_year);
+ date[2] = (ipp_uchar_t)(unixdate->tm_mon + 1);
+ date[3] = (ipp_uchar_t)unixdate->tm_mday;
+ date[4] = (ipp_uchar_t)unixdate->tm_hour;
+ date[5] = (ipp_uchar_t)unixdate->tm_min;
+ date[6] = (ipp_uchar_t)unixdate->tm_sec;
date[7] = 0;
date[8] = '+';
date[9] = 0;
*
* This function validates the contents of an attribute based on the name and
* value tag. 1 is returned if the attribute is valid, 0 otherwise. On
- * failure, cupsLastErrorString() is set to a human-readable message.
+ * failure, @link cupsLastErrorString@ is set to a human-readable message.
*
- * @since CUPS 1.7@
+ * @since CUPS 1.7/macOS 10.9@
*/
int /* O - 1 if valid, 0 otherwise */
ipp_attribute_t *colattr; /* Collection attribute */
regex_t re; /* Regular expression */
ipp_uchar_t *date; /* Current date value */
- static const char * const uri_status_strings[] =
- { /* URI status strings */
- "URI too large",
- "Bad arguments to function",
- "Bad resource in URI",
- "Bad port number in URI",
- "Bad hostname/address in URI",
- "Bad username in URI",
- "Bad scheme in URI",
- "Bad/empty URI",
- "OK",
- "Missing scheme in URI",
- "Unknown scheme in URI",
- "Missing resource in URI"
- };
/*
if (*ptr || ptr == attr->name)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad attribute name - invalid character "
- "(RFC 2911 section 4.1.3)."), attr->name);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad attribute name - invalid character (RFC 8011 section 5.1.4)."), attr->name);
return (0);
}
if ((ptr - attr->name) > 255)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad attribute name - bad length %d "
- "(RFC 2911 section 4.1.3)."), attr->name,
- (int)(ptr - attr->name));
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad attribute name - bad length %d (RFC 8011 section 5.1.4)."), attr->name, (int)(ptr - attr->name));
return (0);
}
if (attr->values[i].boolean != 0 &&
attr->values[i].boolean != 1)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad boolen value %d "
- "(RFC 2911 section 4.1.11)."), attr->name,
- attr->values[i].boolean);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad boolean value %d (RFC 8011 section 5.1.21)."), attr->name, attr->values[i].boolean);
return (0);
}
}
{
if (attr->values[i].integer < 1)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad enum value %d - out of range "
- "(RFC 2911 section 4.1.4)."), attr->name,
- attr->values[i].integer);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad enum value %d - out of range (RFC 8011 section 5.1.5)."), attr->name, attr->values[i].integer);
return (0);
}
}
{
if (attr->values[i].unknown.length > IPP_MAX_OCTETSTRING)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad octetString value - bad length %d "
- "(RFC 2911 section 4.1.10)."), attr->name,
- attr->values[i].unknown.length);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad octetString value - bad length %d (RFC 8011 section 5.1.20)."), attr->name, attr->values[i].unknown.length);
return (0);
}
}
if (date[2] < 1 || date[2] > 12)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad dateTime month %u "
- "(RFC 2911 section 4.1.14)."), attr->name, date[2]);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime month %u (RFC 8011 section 5.1.15)."), attr->name, date[2]);
return (0);
}
if (date[3] < 1 || date[3] > 31)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad dateTime day %u "
- "(RFC 2911 section 4.1.14)."), attr->name, date[3]);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime day %u (RFC 8011 section 5.1.15)."), attr->name, date[3]);
return (0);
}
if (date[4] > 23)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad dateTime hours %u "
- "(RFC 2911 section 4.1.14)."), attr->name, date[4]);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime hours %u (RFC 8011 section 5.1.15)."), attr->name, date[4]);
return (0);
}
if (date[5] > 59)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad dateTime minutes %u "
- "(RFC 2911 section 4.1.14)."), attr->name, date[5]);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime minutes %u (RFC 8011 section 5.1.15)."), attr->name, date[5]);
return (0);
}
if (date[6] > 60)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad dateTime seconds %u "
- "(RFC 2911 section 4.1.14)."), attr->name, date[6]);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime seconds %u (RFC 8011 section 5.1.15)."), attr->name, date[6]);
return (0);
}
if (date[7] > 9)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad dateTime deciseconds %u "
- "(RFC 2911 section 4.1.14)."), attr->name, date[7]);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime deciseconds %u (RFC 8011 section 5.1.15)."), attr->name, date[7]);
return (0);
}
if (date[8] != '-' && date[8] != '+')
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad dateTime UTC sign '%c' "
- "(RFC 2911 section 4.1.14)."), attr->name, date[8]);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime UTC sign '%c' (RFC 8011 section 5.1.15)."), attr->name, date[8]);
return (0);
}
if (date[9] > 11)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad dateTime UTC hours %u "
- "(RFC 2911 section 4.1.14)."), attr->name, date[9]);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime UTC hours %u (RFC 8011 section 5.1.15)."), attr->name, date[9]);
return (0);
}
if (date[10] > 59)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad dateTime UTC minutes %u "
- "(RFC 2911 section 4.1.14)."), attr->name, date[10]);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad dateTime UTC minutes %u (RFC 8011 section 5.1.15)."), attr->name, date[10]);
return (0);
}
}
{
if (attr->values[i].resolution.xres <= 0)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad resolution value %dx%d%s - cross "
- "feed resolution must be positive "
- "(RFC 2911 section 4.1.15)."), attr->name,
- attr->values[i].resolution.xres,
- attr->values[i].resolution.yres,
- attr->values[i].resolution.units ==
- IPP_RES_PER_INCH ? "dpi" :
- attr->values[i].resolution.units ==
- IPP_RES_PER_CM ? "dpcm" : "unknown");
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad resolution value %dx%d%s - cross feed resolution must be positive (RFC 8011 section 5.1.16)."), attr->name, attr->values[i].resolution.xres, attr->values[i].resolution.yres, attr->values[i].resolution.units == IPP_RES_PER_INCH ? "dpi" : attr->values[i].resolution.units == IPP_RES_PER_CM ? "dpcm" : "unknown");
return (0);
}
if (attr->values[i].resolution.yres <= 0)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad resolution value %dx%d%s - feed "
- "resolution must be positive "
- "(RFC 2911 section 4.1.15)."), attr->name,
- attr->values[i].resolution.xres,
- attr->values[i].resolution.yres,
- attr->values[i].resolution.units ==
- IPP_RES_PER_INCH ? "dpi" :
- attr->values[i].resolution.units ==
- IPP_RES_PER_CM ? "dpcm" : "unknown");
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad resolution value %dx%d%s - feed resolution must be positive (RFC 8011 section 5.1.16)."), attr->name, attr->values[i].resolution.xres, attr->values[i].resolution.yres, attr->values[i].resolution.units == IPP_RES_PER_INCH ? "dpi" : attr->values[i].resolution.units == IPP_RES_PER_CM ? "dpcm" : "unknown");
return (0);
}
- if (attr->values[i].resolution.units != IPP_RES_PER_INCH &&
- attr->values[i].resolution.units != IPP_RES_PER_CM)
+ if (attr->values[i].resolution.units != IPP_RES_PER_INCH && attr->values[i].resolution.units != IPP_RES_PER_CM)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad resolution value %dx%d%s - bad "
- "units value (RFC 2911 section 4.1.15)."),
- attr->name, attr->values[i].resolution.xres,
- attr->values[i].resolution.yres,
- attr->values[i].resolution.units ==
- IPP_RES_PER_INCH ? "dpi" :
- attr->values[i].resolution.units ==
- IPP_RES_PER_CM ? "dpcm" : "unknown");
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad resolution value %dx%d%s - bad units value (RFC 8011 section 5.1.16)."), attr->name, attr->values[i].resolution.xres, attr->values[i].resolution.yres, attr->values[i].resolution.units == IPP_RES_PER_INCH ? "dpi" : attr->values[i].resolution.units == IPP_RES_PER_CM ? "dpcm" : "unknown");
return (0);
}
}
{
if (attr->values[i].range.lower > attr->values[i].range.upper)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad rangeOfInteger value %d-%d - lower "
- "greater than upper (RFC 2911 section 4.1.13)."),
- attr->name, attr->values[i].range.lower,
- attr->values[i].range.upper);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad rangeOfInteger value %d-%d - lower greater than upper (RFC 8011 section 5.1.14)."), attr->name, attr->values[i].range.lower, attr->values[i].range.upper);
return (0);
}
}
}
else if (*ptr & 0x80)
break;
+ else if ((*ptr < ' ' && *ptr != '\n' && *ptr != '\r' && *ptr != '\t') || *ptr == 0x7f)
+ break;
}
- if (*ptr)
- {
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad text value \"%s\" - bad UTF-8 "
- "sequence (RFC 2911 section 4.1.1)."), attr->name,
- attr->values[i].string.text);
- return (0);
- }
+ if (*ptr)
+ {
+ if (*ptr < ' ' || *ptr == 0x7f)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad control character (PWG 5100.14 section 8.3)."), attr->name, attr->values[i].string.text);
+ return (0);
+ }
+ else
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.2)."), attr->name, attr->values[i].string.text);
+ return (0);
+ }
+ }
if ((ptr - attr->values[i].string.text) > (IPP_MAX_TEXT - 1))
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad text value \"%s\" - bad length %d "
- "(RFC 2911 section 4.1.1)."), attr->name,
- attr->values[i].string.text,
- (int)(ptr - attr->values[i].string.text));
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad text value \"%s\" - bad length %d (RFC 8011 section 5.1.2)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text));
return (0);
}
}
}
else if (*ptr & 0x80)
break;
+ else if (*ptr < ' ' || *ptr == 0x7f)
+ break;
}
if (*ptr)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad name value \"%s\" - bad UTF-8 "
- "sequence (RFC 2911 section 4.1.2)."), attr->name,
- attr->values[i].string.text);
- return (0);
- }
+ if (*ptr < ' ' || *ptr == 0x7f)
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad control character (PWG 5100.14 section 8.1)."), attr->name, attr->values[i].string.text);
+ return (0);
+ }
+ else
+ {
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad UTF-8 sequence (RFC 8011 section 5.1.3)."), attr->name, attr->values[i].string.text);
+ return (0);
+ }
+ }
if ((ptr - attr->values[i].string.text) > (IPP_MAX_NAME - 1))
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad name value \"%s\" - bad length %d "
- "(RFC 2911 section 4.1.2)."), attr->name,
- attr->values[i].string.text,
- (int)(ptr - attr->values[i].string.text));
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad name value \"%s\" - bad length %d (RFC 8011 section 5.1.3)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text));
return (0);
}
}
for (i = 0; i < attr->num_values; i ++)
{
for (ptr = attr->values[i].string.text; *ptr; ptr ++)
+ {
if (!isalnum(*ptr & 255) && *ptr != '-' && *ptr != '.' &&
*ptr != '_')
break;
+ }
if (*ptr || ptr == attr->values[i].string.text)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad keyword value \"%s\" - invalid "
- "character (RFC 2911 section 4.1.3)."),
- attr->name, attr->values[i].string.text);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad keyword value \"%s\" - invalid character (RFC 8011 section 5.1.4)."), attr->name, attr->values[i].string.text);
return (0);
}
if ((ptr - attr->values[i].string.text) > (IPP_MAX_KEYWORD - 1))
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad keyword value \"%s\" - bad "
- "length %d (RFC 2911 section 4.1.3)."),
- attr->name, attr->values[i].string.text,
- (int)(ptr - attr->values[i].string.text));
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad keyword value \"%s\" - bad length %d (RFC 8011 section 5.1.4)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text));
return (0);
}
}
case IPP_TAG_URI :
for (i = 0; i < attr->num_values; i ++)
{
- uri_status = httpSeparateURI(HTTP_URI_CODING_ALL,
- attr->values[i].string.text,
- scheme, sizeof(scheme),
- userpass, sizeof(userpass),
- hostname, sizeof(hostname),
- &port, resource, sizeof(resource));
-
- if (uri_status < HTTP_URI_OK)
+ uri_status = httpSeparateURI(HTTP_URI_CODING_ALL, attr->values[i].string.text, scheme, sizeof(scheme), userpass, sizeof(userpass), hostname, sizeof(hostname), &port, resource, sizeof(resource));
+
+ if (uri_status < HTTP_URI_STATUS_OK)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad URI value \"%s\" - %s "
- "(RFC 2911 section 4.1.5)."), attr->name,
- attr->values[i].string.text,
- uri_status_strings[uri_status -
- HTTP_URI_OVERFLOW]);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad URI value \"%s\" - %s (RFC 8011 section 5.1.6)."), attr->name, attr->values[i].string.text, httpURIStatusString(uri_status));
return (0);
}
if (strlen(attr->values[i].string.text) > (IPP_MAX_URI - 1))
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad URI value \"%s\" - bad length %d "
- "(RFC 2911 section 4.1.5)."), attr->name,
- attr->values[i].string.text,
- (int)strlen(attr->values[i].string.text));
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad URI value \"%s\" - bad length %d (RFC 8011 section 5.1.6)."), attr->name, attr->values[i].string.text, (int)strlen(attr->values[i].string.text));
}
}
break;
if (islower(*ptr & 255))
{
for (ptr ++; *ptr; ptr ++)
+ {
if (!islower(*ptr & 255) && !isdigit(*ptr & 255) &&
*ptr != '+' && *ptr != '-' && *ptr != '.')
break;
+ }
}
if (*ptr || ptr == attr->values[i].string.text)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad uriScheme value \"%s\" - bad "
- "characters (RFC 2911 section 4.1.6)."),
- attr->name, attr->values[i].string.text);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad uriScheme value \"%s\" - bad characters (RFC 8011 section 5.1.7)."), attr->name, attr->values[i].string.text);
return (0);
}
if ((ptr - attr->values[i].string.text) > (IPP_MAX_URISCHEME - 1))
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad uriScheme value \"%s\" - bad "
- "length %d (RFC 2911 section 4.1.6)."),
- attr->name, attr->values[i].string.text,
- (int)(ptr - attr->values[i].string.text));
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad uriScheme value \"%s\" - bad length %d (RFC 8011 section 5.1.7)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text));
return (0);
}
}
for (i = 0; i < attr->num_values; i ++)
{
for (ptr = attr->values[i].string.text; *ptr; ptr ++)
+ {
if (!isprint(*ptr & 255) || isupper(*ptr & 255) ||
isspace(*ptr & 255))
break;
+ }
if (*ptr || ptr == attr->values[i].string.text)
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad charset value \"%s\" - bad "
- "characters (RFC 2911 section 4.1.7)."),
- attr->name, attr->values[i].string.text);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad charset value \"%s\" - bad characters (RFC 8011 section 5.1.8)."), attr->name, attr->values[i].string.text);
return (0);
}
if ((ptr - attr->values[i].string.text) > (IPP_MAX_CHARSET - 1))
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad charset value \"%s\" - bad "
- "length %d (RFC 2911 section 4.1.7)."),
- attr->name, attr->values[i].string.text,
- (int)(ptr - attr->values[i].string.text));
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad charset value \"%s\" - bad length %d (RFC 8011 section 5.1.8)."), attr->name, attr->values[i].string.text, (int)(ptr - attr->values[i].string.text));
return (0);
}
}
char temp[256]; /* Temporary error string */
regerror(i, &re, temp, sizeof(temp));
- ipp_set_error(IPP_STATUS_ERROR_INTERNAL,
- _("Unable to compile naturalLanguage regular "
- "expression: %s."), temp);
+ ipp_set_error(IPP_STATUS_ERROR_INTERNAL, _("Unable to compile naturalLanguage regular expression: %s."), temp);
return (0);
}
{
if (regexec(&re, attr->values[i].string.text, 0, NULL, 0))
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad naturalLanguage value \"%s\" - bad "
- "characters (RFC 2911 section 4.1.8)."),
- attr->name, attr->values[i].string.text);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad naturalLanguage value \"%s\" - bad characters (RFC 8011 section 5.1.9)."), attr->name, attr->values[i].string.text);
regfree(&re);
return (0);
}
if (strlen(attr->values[i].string.text) > (IPP_MAX_LANGUAGE - 1))
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad naturalLanguage value \"%s\" - bad "
- "length %d (RFC 2911 section 4.1.8)."),
- attr->name, attr->values[i].string.text,
- (int)strlen(attr->values[i].string.text));
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad naturalLanguage value \"%s\" - bad length %d (RFC 8011 section 5.1.9)."), attr->name, attr->values[i].string.text, (int)strlen(attr->values[i].string.text));
regfree(&re);
return (0);
}
char temp[256]; /* Temporary error string */
regerror(i, &re, temp, sizeof(temp));
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("Unable to compile mimeMediaType regular "
- "expression: %s."), temp);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("Unable to compile mimeMediaType regular expression: %s."), temp);
return (0);
}
{
if (regexec(&re, attr->values[i].string.text, 0, NULL, 0))
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad mimeMediaType value \"%s\" - bad "
- "characters (RFC 2911 section 4.1.9)."),
- attr->name, attr->values[i].string.text);
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad mimeMediaType value \"%s\" - bad characters (RFC 8011 section 5.1.10)."), attr->name, attr->values[i].string.text);
regfree(&re);
return (0);
}
if (strlen(attr->values[i].string.text) > (IPP_MAX_MIMETYPE - 1))
{
- ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST,
- _("\"%s\": Bad mimeMediaType value \"%s\" - bad "
- "length %d (RFC 2911 section 4.1.9)."),
- attr->name, attr->values[i].string.text,
- (int)strlen(attr->values[i].string.text));
+ ipp_set_error(IPP_STATUS_ERROR_BAD_REQUEST, _("\"%s\": Bad mimeMediaType value \"%s\" - bad length %d (RFC 8011 section 5.1.10)."), attr->name, attr->values[i].string.text, (int)strlen(attr->values[i].string.text));
regfree(&re);
return (0);
}
* 'ippValidateAttributes()' - Validate all attributes in an IPP message.
*
* This function validates the contents of the IPP message, including each
- * attribute. Like @link ippValidateAttribute@, cupsLastErrorString() is set
- * to a human-readable message on failure.
+ * attribute. Like @link ippValidateAttribute@, @link cupsLastErrorString@ is
+ * set to a human-readable message on failure.
*
- * @since CUPS 1.7@
+ * @since CUPS 1.7/macOS 10.9@
*/
int /* O - 1 if valid, 0 otherwise */
ippWrite(http_t *http, /* I - HTTP connection */
ipp_t *ipp) /* I - IPP data */
{
- DEBUG_printf(("ippWrite(http=%p, ipp=%p)", http, ipp));
+ DEBUG_printf(("ippWrite(http=%p, ipp=%p)", (void *)http, (void *)ipp));
if (!http)
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
return (ippWriteIO(http, (ipp_iocb_t)httpWrite2, http->blocking, NULL, ipp));
}
/*
* 'ippWriteFile()' - Write data for an IPP message to a file.
*
- * @since CUPS 1.1.19/OS X 10.3@
+ * @since CUPS 1.1.19/macOS 10.3@
*/
ipp_state_t /* O - Current state */
ippWriteFile(int fd, /* I - HTTP data */
ipp_t *ipp) /* I - IPP data */
{
- DEBUG_printf(("ippWriteFile(fd=%d, ipp=%p)", fd, ipp));
+ DEBUG_printf(("ippWriteFile(fd=%d, ipp=%p)", fd, (void *)ipp));
- ipp->state = IPP_IDLE;
+ ipp->state = IPP_STATE_IDLE;
return (ippWriteIO(&fd, (ipp_iocb_t)ipp_write_file, 1, NULL, ipp));
}
/*
* 'ippWriteIO()' - Write data for an IPP message.
*
- * @since CUPS 1.2/OS X 10.5@
+ * @since CUPS 1.2/macOS 10.5@
*/
ipp_state_t /* O - Current state */
_ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippWriteIO(dst=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)",
- dst, cb, blocking, parent, ipp));
+ DEBUG_printf(("ippWriteIO(dst=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)", (void *)dst, (void *)cb, blocking, (void *)parent, (void *)ipp));
if (!dst || !ipp)
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
if ((buffer = (unsigned char *)_cupsBufferGet(IPP_BUF_SIZE)) == NULL)
{
DEBUG_puts("1ippWriteIO: Unable to get write buffer");
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
switch (ipp->state)
{
- case IPP_IDLE :
+ case IPP_STATE_IDLE :
ipp->state ++; /* Avoid common problem... */
- case IPP_HEADER :
+ case IPP_STATE_HEADER :
if (parent == NULL)
{
/*
*bufptr++ = ipp->request.any.version[0];
*bufptr++ = ipp->request.any.version[1];
- *bufptr++ = ipp->request.any.op_status >> 8;
- *bufptr++ = ipp->request.any.op_status;
- *bufptr++ = ipp->request.any.request_id >> 24;
- *bufptr++ = ipp->request.any.request_id >> 16;
- *bufptr++ = ipp->request.any.request_id >> 8;
- *bufptr++ = ipp->request.any.request_id;
+ *bufptr++ = (ipp_uchar_t)(ipp->request.any.op_status >> 8);
+ *bufptr++ = (ipp_uchar_t)ipp->request.any.op_status;
+ *bufptr++ = (ipp_uchar_t)(ipp->request.any.request_id >> 24);
+ *bufptr++ = (ipp_uchar_t)(ipp->request.any.request_id >> 16);
+ *bufptr++ = (ipp_uchar_t)(ipp->request.any.request_id >> 8);
+ *bufptr++ = (ipp_uchar_t)ipp->request.any.request_id;
DEBUG_printf(("2ippWriteIO: version=%d.%d", buffer[0], buffer[1]));
DEBUG_printf(("2ippWriteIO: op_status=%04x",
DEBUG_printf(("2ippWriteIO: request_id=%d",
ipp->request.any.request_id));
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP header...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
* in the request/response, with no current group.
*/
- ipp->state = IPP_ATTRIBUTE;
+ ipp->state = IPP_STATE_ATTRIBUTE;
ipp->current = ipp->attrs;
ipp->curtag = IPP_TAG_ZERO;
- DEBUG_printf(("1ippWriteIO: ipp->current=%p", ipp->current));
+ DEBUG_printf(("1ippWriteIO: ipp->current=%p", (void *)ipp->current));
/*
* If blocking is disabled, stop here...
if (!blocking)
break;
- case IPP_ATTRIBUTE :
+ case IPP_STATE_ATTRIBUTE :
while (ipp->current != NULL)
{
/*
DEBUG_printf(("2ippWriteIO: wrote group tag=%x(%s)",
attr->group_tag, ippTagString(attr->group_tag)));
- *bufptr++ = attr->group_tag;
+ *bufptr++ = (ipp_uchar_t)attr->group_tag;
}
else if (attr->group_tag == IPP_TAG_ZERO)
continue;
{
DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
/*
if (attr->value_tag > 0xff)
{
*bufptr++ = IPP_TAG_EXTENSION;
- *bufptr++ = attr->value_tag >> 24;
- *bufptr++ = attr->value_tag >> 16;
- *bufptr++ = attr->value_tag >> 8;
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 24);
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 16);
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 8);
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
}
else
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
- *bufptr++ = n >> 8;
- *bufptr++ = n;
- memcpy(bufptr, attr->name, n);
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
+ memcpy(bufptr, attr->name, (size_t)n);
bufptr += n;
}
else
{
DEBUG_printf(("1ippWriteIO: Attribute name too long (%d)", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
/*
*bufptr++ = IPP_TAG_MEMBERNAME;
*bufptr++ = 0;
*bufptr++ = 0;
- *bufptr++ = n >> 8;
- *bufptr++ = n;
- memcpy(bufptr, attr->name, n);
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
+ memcpy(bufptr, attr->name, (size_t)n);
bufptr += n;
if (attr->value_tag > 0xff)
{
*bufptr++ = IPP_TAG_EXTENSION;
- *bufptr++ = attr->value_tag >> 24;
- *bufptr++ = attr->value_tag >> 16;
- *bufptr++ = attr->value_tag >> 8;
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 24);
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 16);
+ *bufptr++ = (ipp_uchar_t)(attr->value_tag >> 8);
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
}
else
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
* Now write the attribute value(s)...
*/
- switch (attr->value_tag & ~IPP_TAG_COPY)
+ switch (attr->value_tag & ~IPP_TAG_CUPS_CONST)
{
case IPP_TAG_UNSUPPORTED_VALUE :
case IPP_TAG_DEFAULT :
{
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 9)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
*bufptr++ = 0;
*bufptr++ = 4;
- *bufptr++ = value->integer >> 24;
- *bufptr++ = value->integer >> 16;
- *bufptr++ = value->integer >> 8;
- *bufptr++ = value->integer;
+ *bufptr++ = (ipp_uchar_t)(value->integer >> 24);
+ *bufptr++ = (ipp_uchar_t)(value->integer >> 16);
+ *bufptr++ = (ipp_uchar_t)(value->integer >> 8);
+ *bufptr++ = (ipp_uchar_t)value->integer;
}
break;
{
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 6)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
*bufptr++ = 0;
*bufptr++ = 1;
- *bufptr++ = value->boolean;
+ *bufptr++ = (ipp_uchar_t)value->boolean;
}
break;
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
}
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
{
DEBUG_printf(("1ippWriteIO: String too long (%d)", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_printf(("2ippWriteIO: writing string=%d,\"%s\"", n,
if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2))
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
* Put the 2-byte length and string characters in the buffer.
*/
- *bufptr++ = n >> 8;
- *bufptr++ = n;
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
if (n > 0)
{
- memcpy(bufptr, value->string.text, n);
+ memcpy(bufptr, value->string.text, (size_t)n);
bufptr += n;
}
}
{
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 16)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
{
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 14)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
*bufptr++ = 0;
*bufptr++ = 9;
- *bufptr++ = value->resolution.xres >> 24;
- *bufptr++ = value->resolution.xres >> 16;
- *bufptr++ = value->resolution.xres >> 8;
- *bufptr++ = value->resolution.xres;
- *bufptr++ = value->resolution.yres >> 24;
- *bufptr++ = value->resolution.yres >> 16;
- *bufptr++ = value->resolution.yres >> 8;
- *bufptr++ = value->resolution.yres;
- *bufptr++ = value->resolution.units;
+ *bufptr++ = (ipp_uchar_t)(value->resolution.xres >> 24);
+ *bufptr++ = (ipp_uchar_t)(value->resolution.xres >> 16);
+ *bufptr++ = (ipp_uchar_t)(value->resolution.xres >> 8);
+ *bufptr++ = (ipp_uchar_t)value->resolution.xres;
+ *bufptr++ = (ipp_uchar_t)(value->resolution.yres >> 24);
+ *bufptr++ = (ipp_uchar_t)(value->resolution.yres >> 16);
+ *bufptr++ = (ipp_uchar_t)(value->resolution.yres >> 8);
+ *bufptr++ = (ipp_uchar_t)value->resolution.yres;
+ *bufptr++ = (ipp_uchar_t)value->resolution.units;
}
break;
{
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 13)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
*bufptr++ = 0;
*bufptr++ = 8;
- *bufptr++ = value->range.lower >> 24;
- *bufptr++ = value->range.lower >> 16;
- *bufptr++ = value->range.lower >> 8;
- *bufptr++ = value->range.lower;
- *bufptr++ = value->range.upper >> 24;
- *bufptr++ = value->range.upper >> 16;
- *bufptr++ = value->range.upper >> 8;
- *bufptr++ = value->range.upper;
+ *bufptr++ = (ipp_uchar_t)(value->range.lower >> 24);
+ *bufptr++ = (ipp_uchar_t)(value->range.lower >> 16);
+ *bufptr++ = (ipp_uchar_t)(value->range.lower >> 8);
+ *bufptr++ = (ipp_uchar_t)value->range.lower;
+ *bufptr++ = (ipp_uchar_t)(value->range.upper >> 24);
+ *bufptr++ = (ipp_uchar_t)(value->range.upper >> 16);
+ *bufptr++ = (ipp_uchar_t)(value->range.upper >> 8);
+ *bufptr++ = (ipp_uchar_t)value->range.upper;
}
break;
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
}
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
DEBUG_printf(("1ippWriteIO: text/nameWithLanguage value "
"too long (%d)", n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2))
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
}
/* Length of entire value */
- *bufptr++ = n >> 8;
- *bufptr++ = n;
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
/* Length of language */
if (value->string.language != NULL)
else
n = 0;
- *bufptr++ = n >> 8;
- *bufptr++ = n;
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
/* Language */
if (n > 0)
{
- memcpy(bufptr, value->string.language, n);
+ memcpy(bufptr, value->string.language, (size_t)n);
bufptr += n;
}
else
n = 0;
- *bufptr++ = n >> 8;
- *bufptr++ = n;
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
/* Text */
if (n > 0)
{
- memcpy(bufptr, value->string.text, n);
+ memcpy(bufptr, value->string.text, (size_t)n);
bufptr += n;
}
}
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 5)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
* values with a zero-length name...
*/
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
*bufptr++ = 0;
*bufptr++ = 0;
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
* Then write the collection attribute...
*/
- value->collection->state = IPP_IDLE;
+ value->collection->state = IPP_STATE_IDLE;
if (ippWriteIO(dst, cb, 1, ipp,
- value->collection) == IPP_ERROR)
+ value->collection) == IPP_STATE_ERROR)
{
DEBUG_puts("1ippWriteIO: Unable to write collection value");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
}
break;
if ((IPP_BUF_SIZE - (bufptr - buffer)) < 3)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
}
- *bufptr++ = attr->value_tag;
+ *bufptr++ = (ipp_uchar_t)attr->value_tag;
*bufptr++ = 0;
*bufptr++ = 0;
}
DEBUG_printf(("1ippWriteIO: Data length too long (%d)",
n));
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
if ((int)(IPP_BUF_SIZE - (bufptr - buffer)) < (n + 2))
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP "
"attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
bufptr = buffer;
}
/* Length of unknown value */
- *bufptr++ = n >> 8;
- *bufptr++ = n;
+ *bufptr++ = (ipp_uchar_t)(n >> 8);
+ *bufptr++ = (ipp_uchar_t)n;
/* Value */
if (n > 0)
{
- memcpy(bufptr, value->unknown.data, n);
+ memcpy(bufptr, value->unknown.data, (size_t)n);
bufptr += n;
}
}
if (bufptr > buffer)
{
- if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
+ if ((*cb)(dst, buffer, (size_t)(bufptr - buffer)) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP attribute...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
DEBUG_printf(("2ippWriteIO: wrote %d bytes",
}
/*
- * If blocking is disabled, stop here...
+ * If blocking is disabled and we aren't at the end of the attribute
+ * list, stop here...
*/
- if (!blocking)
+ if (!blocking && ipp->current)
break;
}
n = 5;
}
- if ((*cb)(dst, buffer, n) < 0)
+ if ((*cb)(dst, buffer, (size_t)n) < 0)
{
DEBUG_puts("1ippWriteIO: Could not write IPP end-tag...");
_cupsBufferRelease((char *)buffer);
- return (IPP_ERROR);
+ return (IPP_STATE_ERROR);
}
- ipp->state = IPP_DATA;
+ ipp->state = IPP_STATE_DATA;
}
break;
- case IPP_DATA :
+ case IPP_STATE_DATA :
break;
default :
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("4ipp_add_attr(ipp=%p, name=\"%s\", group_tag=0x%x, value_tag=0x%x, "
- "num_values=%d)", ipp, name, group_tag, value_tag, num_values));
+ DEBUG_printf(("4ipp_add_attr(ipp=%p, name=\"%s\", group_tag=0x%x, value_tag=0x%x, num_values=%d)", (void *)ipp, name, group_tag, value_tag, num_values));
/*
* Range check input...
alloc_values = (num_values + IPP_MAX_VALUES - 1) & ~(IPP_MAX_VALUES - 1);
attr = calloc(sizeof(ipp_attribute_t) +
- (alloc_values - 1) * sizeof(_ipp_value_t), 1);
+ (size_t)(alloc_values - 1) * sizeof(_ipp_value_t), 1);
if (attr)
{
* Initialize attribute...
*/
+ DEBUG_printf(("4debug_alloc: %p %s %s%s (%d values)", (void *)attr, name, num_values > 1 ? "1setOf " : "", ippTagString(value_tag), num_values));
+
if (name)
attr->name = _cupsStrAlloc(name);
ipp->last = ipp->current = attr;
}
- DEBUG_printf(("5ipp_add_attr: Returning %p", attr));
+ DEBUG_printf(("5ipp_add_attr: Returning %p", (void *)attr));
return (attr);
}
_ipp_value_t *value; /* Current value */
- DEBUG_printf(("4ipp_free_values(attr=%p, element=%d, count=%d)", attr,
- element, count));
+ DEBUG_printf(("4ipp_free_values(attr=%p, element=%d, count=%d)", (void *)attr, element, count));
- if (!(attr->value_tag & IPP_TAG_COPY))
+ if (!(attr->value_tag & IPP_TAG_CUPS_CONST))
{
/*
* Free values as needed...
}
break;
+ case IPP_TAG_UNSUPPORTED_VALUE :
case IPP_TAG_DEFAULT :
case IPP_TAG_UNKNOWN :
case IPP_TAG_NOVALUE :
if ((element + count) < attr->num_values)
memmove(attr->values + element, attr->values + element + count,
- (attr->num_values - count - element) * sizeof(_ipp_value_t));
+ (size_t)(attr->num_values - count - element) * sizeof(_ipp_value_t));
attr->num_values -= count;
}
if (*value == '_')
*bufptr++ = '-';
else
- *bufptr++ = _cups_tolower(*value);
+ *bufptr++ = (char)_cups_tolower(*value);
*bufptr = '\0';
_ipp_value_t *value; /* Current value */
- DEBUG_printf(("3ipp_length(ipp=%p, collection=%d)", ipp, collection));
+ DEBUG_printf(("3ipp_length(ipp=%p, collection=%d)", (void *)ipp, collection));
if (!ipp)
{
DEBUG_printf(("5ipp_length: attr->name=\"%s\", attr->num_values=%d, "
"bytes=" CUPS_LLFMT, attr->name, attr->num_values, CUPS_LLCAST bytes));
- if (attr->value_tag < IPP_TAG_EXTENSION)
- bytes += attr->num_values; /* Value tag for each value */
+ if ((attr->value_tag & ~IPP_TAG_CUPS_CONST) < IPP_TAG_EXTENSION)
+ bytes += (size_t)attr->num_values;/* Value tag for each value */
else
- bytes += 5 * attr->num_values; /* Value tag for each value */
- bytes += 2 * attr->num_values; /* Name lengths */
- bytes += (int)strlen(attr->name); /* Name */
- bytes += 2 * attr->num_values; /* Value lengths */
+ bytes += (size_t)(5 * attr->num_values);
+ /* Value tag for each value */
+ bytes += (size_t)(2 * attr->num_values);
+ /* Name lengths */
+ bytes += strlen(attr->name); /* Name */
+ bytes += (size_t)(2 * attr->num_values);
+ /* Value lengths */
if (collection)
bytes += 5; /* Add membername overhead */
- switch (attr->value_tag & ~IPP_TAG_COPY)
+ switch (attr->value_tag & ~IPP_TAG_CUPS_CONST)
{
case IPP_TAG_UNSUPPORTED_VALUE :
case IPP_TAG_DEFAULT :
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
- bytes += 4 * attr->num_values;
+ bytes += (size_t)(4 * attr->num_values);
break;
case IPP_TAG_BOOLEAN :
- bytes += attr->num_values;
+ bytes += (size_t)attr->num_values;
break;
case IPP_TAG_TEXT :
break;
case IPP_TAG_DATE :
- bytes += 11 * attr->num_values;
+ bytes += (size_t)(11 * attr->num_values);
break;
case IPP_TAG_RESOLUTION :
- bytes += 9 * attr->num_values;
+ bytes += (size_t)(9 * attr->num_values);
break;
case IPP_TAG_RANGE :
- bytes += 8 * attr->num_values;
+ bytes += (size_t)(8 * attr->num_values);
break;
case IPP_TAG_TEXTLANG :
case IPP_TAG_NAMELANG :
- bytes += 4 * attr->num_values;/* Charset + text length */
+ bytes += (size_t)(4 * attr->num_values);
+ /* Charset + text length */
for (i = 0, value = attr->values;
i < attr->num_values;
for (i = 0, value = attr->values;
i < attr->num_values;
i ++, value ++)
- bytes += value->unknown.length;
+ bytes += (size_t)value->unknown.length;
break;
}
}
ipp_uchar_t *buffer, /* O - Buffer for data */
size_t length) /* I - Total length */
{
- int tbytes, /* Total bytes read */
- bytes; /* Bytes read this pass */
+ ssize_t tbytes, /* Total bytes read */
+ bytes; /* Bytes read this pass */
- DEBUG_printf(("7ipp_read_http(http=%p, buffer=%p, length=%d)",
- http, buffer, (int)length));
+ DEBUG_printf(("7ipp_read_http(http=%p, buffer=%p, length=%d)", (void *)http, (void *)buffer, (int)length));
/*
* Loop until all bytes are read...
tbytes < (int)length;
tbytes += bytes, buffer += bytes)
{
- DEBUG_printf(("9ipp_read_http: tbytes=%d, http->state=%d", tbytes,
- http->state));
+ DEBUG_printf(("9ipp_read_http: tbytes=" CUPS_LLFMT ", http->state=%d", CUPS_LLCAST tbytes, http->state));
- if (http->state == HTTP_WAITING)
+ if (http->state == HTTP_STATE_WAITING)
break;
if (http->used == 0 && !http->blocking)
break;
}
}
+ else if (http->used == 0 && http->timeout_value > 0)
+ {
+ /*
+ * Wait up to timeout seconds for more data on blocking sockets...
+ */
+
+ if (!httpWait(http, (int)(1000 * http->timeout_value)))
+ {
+ /*
+ * Signal no data...
+ */
- if ((bytes = httpRead2(http, (char *)buffer, length - tbytes)) < 0)
+ bytes = -1;
+ break;
+ }
+ }
+
+ if ((bytes = httpRead2(http, (char *)buffer, length - (size_t)tbytes)) < 0)
{
-#ifdef WIN32
+#ifdef _WIN32
break;
#else
if (errno != EAGAIN && errno != EINTR)
break;
bytes = 0;
-#endif /* WIN32 */
+#endif /* _WIN32 */
}
else if (bytes == 0)
break;
if (tbytes == 0 && bytes < 0)
tbytes = -1;
- DEBUG_printf(("8ipp_read_http: Returning %d bytes", tbytes));
+ DEBUG_printf(("8ipp_read_http: Returning " CUPS_LLFMT " bytes", CUPS_LLCAST tbytes));
return (tbytes);
}
ipp_uchar_t *buffer, /* O - Read buffer */
size_t length) /* I - Number of bytes to read */
{
-#ifdef WIN32
+#ifdef _WIN32
return ((ssize_t)read(*fd, buffer, (unsigned)length));
#else
return (read(*fd, buffer, length));
-#endif /* WIN32 */
+#endif /* _WIN32 */
}
* Reallocate memory...
*/
- if ((temp = realloc(temp, sizeof(ipp_attribute_t) +
- (alloc_values - 1) * sizeof(_ipp_value_t))) == NULL)
+ if ((temp = realloc(temp, sizeof(ipp_attribute_t) + (size_t)(alloc_values - 1) * sizeof(_ipp_value_t))) == NULL)
{
- _cupsSetHTTPError(HTTP_ERROR);
+ _cupsSetHTTPError(HTTP_STATUS_ERROR);
DEBUG_puts("4ipp_set_value: Unable to resize attribute.");
return (NULL);
}
* Zero the new memory...
*/
- memset(temp->values + temp->num_values, 0,
- (alloc_values - temp->num_values) * sizeof(_ipp_value_t));
+ memset(temp->values + temp->num_values, 0, (size_t)(alloc_values - temp->num_values) * sizeof(_ipp_value_t));
if (temp != *attr)
{
* Reset pointers in the list...
*/
+#ifndef __clang_analyzer__
+ DEBUG_printf(("4debug_free: %p %s", (void *)*attr, temp->name));
+#endif /* !__clang_analyzer__ */
+ DEBUG_printf(("4debug_alloc: %p %s %s%s (%d)", (void *)temp, temp->name, temp->num_values > 1 ? "1setOf " : "", ippTagString(temp->value_tag), temp->num_values));
+
if (ipp->current == *attr && ipp->prev)
{
/*
*/
*attr = temp;
- _cupsSetError(IPP_INTERNAL_ERROR,
+ _cupsSetError(IPP_STATUS_ERROR_INTERNAL,
_("IPP attribute is not a member of the message."), 1);
DEBUG_puts("4ipp_set_value: Unable to find attribute in message.");
return (NULL);
ipp_uchar_t *buffer, /* I - Data to write */
size_t length) /* I - Number of bytes to write */
{
-#ifdef WIN32
+#ifdef _WIN32
return ((ssize_t)write(*fd, buffer, (unsigned)length));
#else
return (write(*fd, buffer, length));
-#endif /* WIN32 */
+#endif /* _WIN32 */
}
-
-
-/*
- * End of "$Id: ipp.c 10102 2011-11-02 23:52:39Z mike $".
- */