/*
- * "$Id: ipp.c 5047 2006-02-02 05:14:15Z mike $"
+ * "$Id: ipp.c 7847 2008-08-19 04:22:14Z mike $"
*
* Internet Printing Protocol support functions for the Common UNIX
* Printing System (CUPS).
*
- * Copyright 1997-2006 by Easy Software Products, all rights reserved.
+ * Copyright 2007-2008 by Apple Inc.
+ * Copyright 1997-2007 by Easy Software Products, all rights reserved.
*
* These coded instructions, statements, and computer programs are the
- * property of Easy Software Products 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 missing or damaged please contact Easy Software Products
- * at:
- *
- * Attn: CUPS Licensing Information
- * Easy Software Products
- * 44141 Airport View Drive, Suite 204
- * Hollywood, Maryland 20636 USA
- *
- * Voice: (301) 373-9600
- * EMail: cups-info@cups.org
- * WWW: http://www.cups.org
+ * 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.
*
* 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 request.
- * _ipp_free_attr() - Free an attribute.
+ * _ippAddAttr() - Add a new attribute to the request.
+ * _ippFreeAttr() - Free an attribute.
* ipp_length() - Compute the length of an IPP message or
* collection value.
* ipp_read_http() - Semi-blocking read on a HTTP connection...
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddBoolean(%p, %02x, \'%s\', %d)\n", ipp, group, name, value));
+ DEBUG_printf(("ippAddBoolean(ipp=%p, group=%02x(%s), name=\"%s\", value=%d)\n",
+ ipp, group, ippTagString(group), name, value));
- if (ipp == NULL || name == NULL)
+ if (!ipp || !name)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
+ if ((attr = _ippAddAttr(ipp, 1)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = IPP_TAG_BOOLEAN;
attr->values[0].boolean = value;
ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippAddBooleans(%p, %02x, \'%s\', %d, %p)\n", ipp,
- group, name, num_values, values));
+ DEBUG_printf(("ippAddBooleans(ipp=%p, group=%02x(%s), name=\"%s\", "
+ "num_values=%d, values=%p)\n", ipp, group, ippTagString(group),
+ name, num_values, values));
- if (ipp == NULL || name == NULL || num_values < 1)
+ if (!ipp || !name || num_values < 1)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ippAddAttr(ipp, num_values)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = IPP_TAG_BOOLEAN;
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddCollection(%p, %02x, \'%s\', %p)\n", ipp, group, name,
- value));
+ DEBUG_printf(("ippAddCollection(ipp=%p, group=%02x(%s), name=\"%s\", "
+ "value=%p)\n", ipp, group, ippTagString(group), name, value));
- if (ipp == NULL || name == NULL)
+ if (!ipp || !name)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
+ if ((attr = _ippAddAttr(ipp, 1)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = IPP_TAG_BEGIN_COLLECTION;
attr->values[0].collection = value;
ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippAddCollections(%p, %02x, \'%s\', %d, %p)\n", ipp,
- group, name, num_values, values));
+ DEBUG_printf(("ippAddCollections(ipp=%p, group=%02x(%s), name=\"%s\", "
+ "num_values=%d, values=%p)\n", ipp, group, ippTagString(group),
+ name, num_values, values));
- if (ipp == NULL || name == NULL || num_values < 1)
+ if (!ipp || !name || num_values < 1)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ippAddAttr(ipp, num_values)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = IPP_TAG_BEGIN_COLLECTION;
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddDate(%p, %02x, \'%s\', %p)\n", ipp, group, name,
- value));
+ DEBUG_printf(("ippAddDate(ipp=%p, group=%02x(%s), name=\"%s\", value=%p)\n",
+ ipp, group, ippTagString(group), name, value));
- if (ipp == NULL || name == NULL || value == NULL)
+ if (!ipp || !name || !value)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
+ if ((attr = _ippAddAttr(ipp, 1)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = IPP_TAG_DATE;
memcpy(attr->values[0].date, value, 11);
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddInteger(%p, %d, \'%s\', %d)\n", ipp, group, name,
- value));
+ DEBUG_printf(("ippAddInteger(ipp=%p, group=%02x(%s), type=%02x(%s), "
+ "name=\"%s\", value=%d)\n", ipp, group, ippTagString(group),
+ type, ippTagString(type), name, value));
- if (ipp == NULL || name == NULL)
+ if (!ipp || !name)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
+ if ((attr = _ippAddAttr(ipp, 1)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = type;
attr->values[0].integer = value;
ipp_value_t *value; /* Current value */
- if (ipp == NULL || name == NULL || num_values < 1)
+ DEBUG_printf(("ippAddIntegers(ipp=%p, group=%02x(%s), type=%02x(%s), "
+ "name=\"%s\", num_values=%d, values=%p)\n", ipp,
+ group, ippTagString(group), type, ippTagString(type), name,
+ num_values, values));
+
+ if (!ipp || !name || num_values < 1)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ippAddAttr(ipp, num_values)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = type;
if (ipp == NULL || name == NULL)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
+ if ((attr = _ippAddAttr(ipp, 1)) == NULL)
return (NULL);
/*
* Initialize the attribute data...
*/
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = IPP_TAG_STRING;
attr->values[0].unknown.length = datalen;
if (data)
{
- attr->values[0].unknown.data = malloc(datalen);
+ if ((attr->values[0].unknown.data = malloc(datalen)) == NULL)
+ {
+ ippDeleteAttribute(ipp, attr);
+ return (NULL);
+ }
+
memcpy(attr->values[0].unknown.data, data, datalen);
}
*bufptr; /* Pointer into buffer */
- if (ipp == NULL || name == NULL)
+ DEBUG_printf(("ippAddString(ipp=%p, group=%02x(%s), type=%02x(%s), "
+ "name=\"%s\", charset=\"%s\", value=\"%s\")\n", ipp,
+ group, ippTagString(group), type, ippTagString(type), name,
+ charset, value));
+
+ if (!ipp || !name)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
+ if ((attr = _ippAddAttr(ipp, 1)) == NULL)
return (NULL);
/*
* Initialize the attribute data...
*/
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = type;
attr->values[0].string.charset = ((int)type & IPP_TAG_COPY) ? (char *)charset :
- charset ? _cups_sp_alloc(charset) : NULL;
+ charset ? _cupsStrAlloc(charset) : NULL;
attr->values[0].string.text = ((int)type & IPP_TAG_COPY) ? (char *)value :
- value ? _cups_sp_alloc(value) : NULL;
+ value ? _cupsStrAlloc(value) : NULL;
return (attr);
}
ipp_value_t *value; /* Current value */
- if (ipp == NULL || name == NULL || num_values < 1)
+ DEBUG_printf(("ippAddStrings(ipp=%p, group=%02x(%s), type=%02x(%s), "
+ "name=\"%s\", num_values=%d, charset=\"%s\", values=%p)\n", ipp,
+ group, ippTagString(group), type, ippTagString(type), name,
+ num_values, charset, values));
+
+ if (!ipp || !name || num_values < 1)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ippAddAttr(ipp, num_values)) == NULL)
return (NULL);
/*
* Initialize the attribute data...
*/
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = type;
{
if (i == 0)
value->string.charset = ((int)type & IPP_TAG_COPY) ? (char *)charset :
- charset ? _cups_sp_alloc(charset) : NULL;
+ charset ? _cupsStrAlloc(charset) : NULL;
else
value->string.charset = attr->values[0].string.charset;
if (type == IPP_TAG_LANGUAGE && !strcasecmp(values[i], "C"))
value->string.text = ((int)type & IPP_TAG_COPY) ? "en" :
- _cups_sp_alloc("en");
+ _cupsStrAlloc("en");
else
value->string.text = ((int)type & IPP_TAG_COPY) ? (char *)values[i] :
- _cups_sp_alloc(values[i]);
+ _cupsStrAlloc(values[i]);
}
}
ipp_attribute_t *attr; /* New attribute */
- if (ipp == NULL || name == NULL)
+ DEBUG_printf(("ippAddRange(ipp=%p, group=%02x(%s), name=\"%s\", lower=%d, "
+ "upper=%d)\n", ipp, group, ippTagString(group), name, lower,
+ upper));
+
+ if (!ipp || !name)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
+ if ((attr = _ippAddAttr(ipp, 1)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = IPP_TAG_RANGE;
attr->values[0].range.lower = lower;
ipp_value_t *value; /* Current value */
- if (ipp == NULL || name == NULL || num_values < 1)
+ DEBUG_printf(("ippAddRanges(ipp=%p, group=%02x(%s), name=\"%s\", "
+ "num_values=%d, lower=%p, upper=%p)\n", ipp, group,
+ ippTagString(group), name, num_values, lower, upper));
+
+ if (!ipp || !name || num_values < 1)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ippAddAttr(ipp, num_values)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = IPP_TAG_RANGE;
ipp_attribute_t *attr; /* New attribute */
- if (ipp == NULL || name == NULL)
+ DEBUG_printf(("ippAddResolution(ipp=%p, group=%02x(%s), name=\"%s\", "
+ "units=%d, xres=%d, yres=%d)\n", ipp, group,
+ ippTagString(group), name, units, xres, yres));
+
+ if (!ipp || !name)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, 1)) == NULL)
+ if ((attr = _ippAddAttr(ipp, 1)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = IPP_TAG_RESOLUTION;
attr->values[0].resolution.xres = xres;
ipp_value_t *value; /* Current value */
- if (ipp == NULL || name == NULL || num_values < 1)
+ DEBUG_printf(("ippAddResolutions(ipp=%p, group=%02x(%s), name=\"%s\", "
+ "num_value=%d, units=%d, xres=%p, yres=%p)\n", ipp, group,
+ ippTagString(group), name, num_values, units, xres, yres));
+
+ if (!ipp || !name || num_values < 1)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, num_values)) == NULL)
+ if ((attr = _ippAddAttr(ipp, num_values)) == NULL)
return (NULL);
- attr->name = _cups_sp_alloc(name);
+ attr->name = _cupsStrAlloc(name);
attr->group_tag = group;
attr->value_tag = IPP_TAG_RESOLUTION;
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("ippAddSeparator(%p)\n", ipp));
+ DEBUG_printf(("ippAddSeparator(ipp=%p)\n", ipp));
- if (ipp == NULL)
+ if (!ipp)
return (NULL);
- if ((attr = _ipp_add_attr(ipp, 0)) == NULL)
+ if ((attr = _ippAddAttr(ipp, 0)) == NULL)
return (NULL);
attr->group_tag = IPP_TAG_ZERO;
time_t t; /* Computed time */
+ if (!date)
+ return (0);
+
memset(&unixdate, 0, sizeof(unixdate));
/*
*next; /* Next attribute */
- DEBUG_printf(("ippDelete(): %p\n", ipp));
+ DEBUG_printf(("ippDelete(ipp=%p)\n", ipp));
- if (ipp == NULL)
+ if (!ipp)
return;
for (attr = ipp->attrs; attr != NULL; attr = next)
{
next = attr->next;
- _ipp_free_attr(attr);
+ _ippFreeAttr(attr);
}
free(ipp);
*prev; /* Previous attribute */
+ DEBUG_printf(("ippDeleteAttribute(ipp=%p, attr=%p)\n", ipp, attr));
+
/*
* Find the attribute in the list...
*/
* Free memory used by the attribute...
*/
- _ipp_free_attr(current);
+ _ippFreeAttr(current);
}
}
const char *name, /* I - Name of attribute */
ipp_tag_t type) /* I - Type of attribute */
{
- DEBUG_printf(("ippFindAttribute(%p, \'%s\')\n", ipp, name));
+ DEBUG_printf(("ippFindAttribute(ipp=%p, name=\"%s\", type=%02x(%s))\n", ipp,
+ name, type, ippTagString(type)));
- if (ipp == NULL || name == NULL)
+ if (!ipp || !name)
return (NULL);
/*
ipp_tag_t value_tag; /* Value tag */
- DEBUG_printf(("ippFindNextAttribute(%p, \'%s\')\n", ipp, name));
+ DEBUG_printf(("ippFindNextAttribute(ipp=%p, name=\"%s\", type=%02x(%s))\n",
+ ipp, name, type, ippTagString(type)));
- if (ipp == NULL || name == NULL)
+ if (!ipp || !name)
return (NULL);
if (ipp->current)
for (; attr != NULL; ipp->prev = attr, attr = attr->next)
{
- DEBUG_printf(("ippFindAttribute: attr = %p, name = \'%s\'\n", attr,
+ DEBUG_printf(("ippFindAttribute: attr=%p, name=\"%s\"\n", attr,
attr->name));
value_tag = (ipp_tag_t)(attr->value_tag & IPP_TAG_MASK);
cups_lang_t *language; /* Current language localization */
+ DEBUG_printf(("ippNewRequest(op=%02x(%s))\n", op, ippOpString(op)));
+
/*
* Create a new IPP message...
*/
DEBUG_printf(("ippRead(http=%p, ipp=%p), data_remaining=" CUPS_LLFMT "\n",
http, ipp, CUPS_LLCAST (http ? http->data_remaining : -1)));
- if (http == NULL)
+ if (!http)
return (IPP_ERROR);
- DEBUG_printf(("http->state = %d\n", http->state));
+ DEBUG_printf(("ippRead: http->state=%d, http->used=%d\n", http->state,
+ http->used));
- return (ippReadIO(http, (ipp_iocb_t)ipp_read_http,
- http->blocking || http->used != 0, NULL, ipp));
+ return (ippReadIO(http, (ipp_iocb_t)ipp_read_http, http->blocking, NULL,
+ ipp));
}
ippReadFile(int fd, /* I - HTTP data */
ipp_t *ipp) /* I - IPP data */
{
- DEBUG_printf(("ippReadFile(%d, %p)\n", fd, ipp));
+ DEBUG_printf(("ippReadFile(fd=%d, ipp=%p)\n", fd, ipp));
return (ippReadIO(&fd, (ipp_iocb_t)ipp_read_file, 1, NULL, ipp));
}
ipp_t *ipp) /* I - IPP data */
{
int n; /* Length of data */
- unsigned char buffer[32768], /* Data buffer */
- string[255], /* Small string buffer */
+ unsigned char buffer[IPP_MAX_LENGTH + 1],
+ /* Data buffer */
+ string[IPP_MAX_NAME],
+ /* Small string buffer */
*bufptr; /* Pointer into buffer */
ipp_attribute_t *attr; /* Current attribute */
ipp_tag_t tag; /* Current tag */
ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippReadIO(%p, %p, %d, %p, %p)\n", src, cb, blocking,
- parent, ipp));
+ DEBUG_printf(("ippReadIO(src=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)\n",
+ src, cb, blocking, parent, ipp));
+ DEBUG_printf(("ippReadIO: ipp->state=%d\n", ipp->state));
- if (src == NULL || ipp == NULL)
+ if (!src || !ipp)
return (IPP_ERROR);
switch (ipp->state)
* Get the request header...
*/
- if ((n = (*cb)(src, buffer, 8)) < 8)
+ if ((*cb)(src, buffer, 8) < 8)
{
- DEBUG_printf(("ippReadIO: Unable to read header (%d bytes read)!\n", n));
- return (n == 0 ? IPP_IDLE : IPP_ERROR);
+ DEBUG_puts("ippReadIO: Unable to read header!");
+ return (IPP_ERROR);
}
/*
if (buffer[0] != 1)
{
- DEBUG_printf(("ippReadIO: version number (%d.%d) is bad.\n", buffer[0],
- buffer[1]));
+ DEBUG_printf(("ippReadIO: version number (%d.%d) is bad.\n",
+ buffer[0], buffer[1]));
return (IPP_ERROR);
}
break;
case IPP_ATTRIBUTE :
- while ((*cb)(src, buffer, 1) > 0)
+ for (;;)
{
+ if ((*cb)(src, buffer, 1) < 1)
+ return (IPP_ERROR);
+
DEBUG_printf(("ippReadIO: ipp->current=%p, ipp->prev=%p\n",
ipp->current, ipp->prev));
ipp->curtag = tag;
ipp->current = NULL;
- DEBUG_printf(("ippReadIO: group tag = %x, ipp->prev=%p\n", tag,
- ipp->prev));
+ DEBUG_printf(("ippReadIO: group tag=%x(%s), ipp->prev=%p\n", tag,
+ ippTagString(tag), ipp->prev));
continue;
}
- DEBUG_printf(("ippReadIO: value tag = %x\n", tag));
+ DEBUG_printf(("ippReadIO: value tag=%x(%s)\n", tag,
+ ippTagString(tag)));
/*
* Get the name...
return (IPP_ERROR);
}
- DEBUG_printf(("ippReadIO: name length = %d\n", n));
+ DEBUG_printf(("ippReadIO: name length=%d\n", n));
if (n == 0 && tag != IPP_TAG_MEMBERNAME &&
tag != IPP_TAG_END_COLLECTION)
attr->value_tag = tag;
}
- else if (value_tag == IPP_TAG_STRING ||
- (value_tag >= IPP_TAG_TEXTLANG &&
+ else if ((value_tag >= IPP_TAG_TEXTLANG &&
value_tag <= IPP_TAG_MIMETYPE))
{
/*
* forms; accept sets of differing values...
*/
- if (tag != IPP_TAG_STRING &&
- (tag < IPP_TAG_TEXTLANG || tag > IPP_TAG_MIMETYPE))
+ if ((tag < IPP_TAG_TEXTLANG || tag > IPP_TAG_MIMETYPE) &&
+ tag != IPP_TAG_NOVALUE)
+ {
+ DEBUG_printf(("ippReadIO: 1setOf value tag %x(%s) != %x(%s)\n",
+ value_tag, ippTagString(value_tag), tag,
+ ippTagString(tag)));
return (IPP_ERROR);
+ }
}
else if (value_tag != tag)
+ {
+ DEBUG_printf(("ippReadIO: value tag %x(%s) != %x(%s)\n",
+ value_tag, ippTagString(value_tag), tag,
+ ippTagString(tag)));
return (IPP_ERROR);
+ }
/*
* Finally, reallocate the attribute array as needed...
if (ipp->current)
ipp->prev = ipp->current;
- attr = ipp->current = _ipp_add_attr(ipp, 1);
+ attr = ipp->current = _ippAddAttr(ipp, 1);
- DEBUG_printf(("ippReadIO: membername, ipp->current=%p, ipp->prev=%p\n",
- ipp->current, ipp->prev));
+ DEBUG_printf(("ippReadIO: membername, ipp->current=%p, "
+ "ipp->prev=%p\n", ipp->current, ipp->prev));
attr->group_tag = ipp->curtag;
attr->value_tag = IPP_TAG_ZERO;
if (ipp->current)
ipp->prev = ipp->current;
- attr = ipp->current = _ipp_add_attr(ipp, 1);
+ if ((attr = ipp->current = _ippAddAttr(ipp, 1)) == NULL)
+ {
+ DEBUG_puts("ippReadIO: unable to allocate attribute!");
+ return (IPP_ERROR);
+ }
- DEBUG_printf(("ippReadIO: name=\'%s\', ipp->current=%p, ipp->prev=%p\n",
- buffer, ipp->current, ipp->prev));
+ DEBUG_printf(("ippReadIO: name=\"%s\", ipp->current=%p, "
+ "ipp->prev=%p\n", buffer, ipp->current, ipp->prev));
attr->group_tag = ipp->curtag;
attr->value_tag = tag;
- attr->name = _cups_sp_alloc((char *)buffer);
+ attr->name = _cupsStrAlloc((char *)buffer);
attr->num_values = 0;
}
else
}
n = (buffer[0] << 8) | buffer[1];
- DEBUG_printf(("ippReadIO: value length = %d\n", n));
+ DEBUG_printf(("ippReadIO: value length=%d\n", n));
switch (tag)
{
case IPP_TAG_INTEGER :
case IPP_TAG_ENUM :
+ if (n != 4)
+ {
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
+ }
+
if ((*cb)(src, buffer, 4) < 4)
{
DEBUG_puts("ippReadIO: Unable to read integer value!");
value->integer = n;
break;
+
case IPP_TAG_BOOLEAN :
+ if (n != 1)
+ {
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
+ }
+
if ((*cb)(src, buffer, 1) < 1)
{
DEBUG_puts("ippReadIO: Unable to read boolean value!");
value->boolean = buffer[0];
break;
+
+ case IPP_TAG_NOVALUE :
+ if (attr->value_tag == IPP_TAG_NOVALUE)
+ {
+ if (n == 0)
+ break;
+
+ attr->value_tag = IPP_TAG_TEXT;
+ }
+
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_KEYWORD :
- case IPP_TAG_STRING :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
case IPP_TAG_CHARSET :
case IPP_TAG_LANGUAGE :
case IPP_TAG_MIMETYPE :
+ if (n >= sizeof(buffer))
+ {
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
+ }
+
if ((*cb)(src, buffer, n) < n)
{
DEBUG_puts("ippReadIO: unable to read name!");
}
buffer[n] = '\0';
- value->string.text = _cups_sp_alloc((char *)buffer);
- DEBUG_printf(("ippReadIO: value = \'%s\'\n",
+ value->string.text = _cupsStrAlloc((char *)buffer);
+ DEBUG_printf(("ippReadIO: value=\"%s\"\n",
value->string.text));
break;
+
case IPP_TAG_DATE :
+ if (n != 11)
+ {
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
+ }
+
if ((*cb)(src, value->date, 11) < 11)
{
DEBUG_puts("ippReadIO: Unable to date integer value!");
return (IPP_ERROR);
}
break;
+
case IPP_TAG_RESOLUTION :
+ if (n != 9)
+ {
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
+ }
+
if ((*cb)(src, buffer, 9) < 9)
{
DEBUG_puts("ippReadIO: Unable to read resolution value!");
value->resolution.units =
(ipp_res_t)buffer[8];
break;
+
case IPP_TAG_RANGE :
+ if (n != 8)
+ {
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
+ }
+
if ((*cb)(src, buffer, 8) < 8)
{
DEBUG_puts("ippReadIO: Unable to read range value!");
(((((buffer[4] << 8) | buffer[5]) << 8) | buffer[6]) << 8) |
buffer[7];
break;
+
case IPP_TAG_TEXTLANG :
case IPP_TAG_NAMELANG :
- if (n > sizeof(buffer) || n < 4)
+ if (n >= sizeof(buffer) || n < 4)
{
DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
return (IPP_ERROR);
n = (bufptr[0] << 8) | bufptr[1];
- if (n >= sizeof(string))
+ if ((bufptr + 2 + n) >= (buffer + sizeof(buffer)) ||
+ n >= sizeof(string))
{
- memcpy(string, bufptr + 2, sizeof(string) - 1);
- string[sizeof(string) - 1] = '\0';
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
}
- else
- {
- memcpy(string, bufptr + 2, n);
- string[n] = '\0';
- }
- value->string.charset = _cups_sp_alloc((char *)string);
+ memcpy(string, bufptr + 2, n);
+ string[n] = '\0';
+
+ value->string.charset = _cupsStrAlloc((char *)string);
bufptr += 2 + n;
n = (bufptr[0] << 8) | bufptr[1];
+ if ((bufptr + 2 + n) >= (buffer + sizeof(buffer)))
+ {
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
+ }
+
bufptr[2 + n] = '\0';
- value->string.text = _cups_sp_alloc((char *)bufptr + 2);
+ value->string.text = _cupsStrAlloc((char *)bufptr + 2);
break;
case IPP_TAG_BEGIN_COLLECTION :
if (n > 0)
{
- DEBUG_puts("ippReadIO: begCollection tag with value length > 0!");
+ DEBUG_puts("ippReadIO: begCollection tag with value length "
+ "> 0!");
return (IPP_ERROR);
}
case IPP_TAG_END_COLLECTION :
if (n > 0)
{
- DEBUG_puts("ippReadIO: endCollection tag with value length > 0!");
+ DEBUG_puts("ippReadIO: endCollection tag with value length "
+ "> 0!");
return (IPP_ERROR);
}
* we need to carry over...
*/
+ if (n >= sizeof(buffer))
+ {
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
+ }
+
if ((*cb)(src, buffer, n) < n)
{
DEBUG_puts("ippReadIO: Unable to read member name value!");
}
buffer[n] = '\0';
- attr->name = _cups_sp_alloc((char *)buffer);
+ attr->name = _cupsStrAlloc((char *)buffer);
/*
* Since collection members are encoded differently than
attr->num_values --;
- DEBUG_printf(("ippReadIO: member name = \"%s\"\n", attr->name));
+ DEBUG_printf(("ippReadIO: member name=\"%s\"\n", attr->name));
break;
default : /* Other unsupported values */
+ if (n > IPP_MAX_LENGTH)
+ {
+ DEBUG_printf(("ippReadIO: bad value length %d!\n", n));
+ return (IPP_ERROR);
+ }
+
+ if (!value)
+ {
+ DEBUG_puts("ippReadIO: NULL value!");
+ return (IPP_ERROR);
+ }
+
value->unknown.length = n;
if (n > 0)
{
- value->unknown.data = malloc(n);
+ if ((value->unknown.data = malloc(n)) == NULL)
+ {
+ DEBUG_puts("ippReadIO: Unable to allocate value");
+ return (IPP_ERROR);
+ }
+
if ((*cb)(src, value->unknown.data, n) < n)
{
DEBUG_puts("ippReadIO: Unable to read unsupported value!");
break; /* anti-compiler-warning-code */
}
+ DEBUG_printf(("ippReadIO: returning ipp->state=%d!\n", ipp->state));
+
return (ipp->state);
}
ippWrite(http_t *http, /* I - HTTP connection */
ipp_t *ipp) /* I - IPP data */
{
- DEBUG_printf(("ippWrite(%p, %p)\n", http, ipp));
+ DEBUG_printf(("ippWrite(http=%p, ipp=%p)\n", http, ipp));
- if (http == NULL)
+ if (!http)
return (IPP_ERROR);
return (ippWriteIO(http, (ipp_iocb_t)httpWrite2,
ippWriteFile(int fd, /* I - HTTP data */
ipp_t *ipp) /* I - IPP data */
{
- DEBUG_printf(("ippWriteFile(%d, %p)\n", fd, ipp));
+ DEBUG_printf(("ippWriteFile(fd=%d, ipp=%p)\n", fd, ipp));
ipp->state = IPP_IDLE;
{
int i; /* Looping var */
int n; /* Length of data */
- unsigned char buffer[32768], /* Data buffer */
+ unsigned char buffer[IPP_MAX_LENGTH + 2],
+ /* Data buffer + length bytes */
*bufptr; /* Pointer into buffer */
ipp_attribute_t *attr; /* Current attribute */
ipp_value_t *value; /* Current value */
- DEBUG_printf(("ippWriteIO(%p, %p, %d, %p, %p)\n", dst, cb, blocking,
- parent, ipp));
+ DEBUG_printf(("ippWriteIO(dst=%p, cb=%p, blocking=%d, parent=%p, ipp=%p)\n",
+ dst, cb, blocking, parent, ipp));
- if (dst == NULL || ipp == NULL)
+ if (!dst || !ipp)
return (IPP_ERROR);
switch (ipp->state)
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP header...");
+ DEBUG_puts("ippWriteIO: Could not write IPP header...");
return (IPP_ERROR);
}
}
ipp->current = ipp->attrs;
ipp->curtag = IPP_TAG_ZERO;
- DEBUG_printf(("ippWrite: version=%d.%d\n", buffer[0], buffer[1]));
- DEBUG_printf(("ippWrite: op_status=%04x\n", ipp->request.any.op_status));
- DEBUG_printf(("ippWrite: request_id=%d\n", ipp->request.any.request_id));
+ DEBUG_printf(("ippWriteIO: version=%d.%d\n", buffer[0], buffer[1]));
+ DEBUG_printf(("ippWriteIO: op_status=%04x\n",
+ ipp->request.any.op_status));
+ DEBUG_printf(("ippWriteIO: request_id=%d\n",
+ ipp->request.any.request_id));
/*
* If blocking is disabled, stop here...
if (attr->group_tag == IPP_TAG_ZERO)
continue;
- DEBUG_printf(("ippWrite: wrote group tag = %x\n", attr->group_tag));
+ DEBUG_printf(("ippWriteIO: wrote group tag=%x(%s)\n",
+ attr->group_tag, ippTagString(attr->group_tag)));
*bufptr++ = attr->group_tag;
}
else if (attr->group_tag == IPP_TAG_ZERO)
* Write the value tag, name length, and name string...
*/
- DEBUG_printf(("ippWrite: writing value tag = %x\n", attr->value_tag));
- DEBUG_printf(("ippWrite: writing name = %d, \'%s\'\n", n, attr->name));
+ DEBUG_printf(("ippWriteIO: writing value tag=%x(%s)\n",
+ attr->value_tag, ippTagString(attr->value_tag)));
+ DEBUG_printf(("ippWriteIO: writing name=%d,\"%s\"\n", n,
+ attr->name));
*bufptr++ = attr->value_tag;
*bufptr++ = n >> 8;
* and empty name for the collection member attribute...
*/
- DEBUG_printf(("ippWrite: writing value tag = %x\n",
+ DEBUG_printf(("ippWriteIO: writing value tag=%x(memberName)\n",
IPP_TAG_MEMBERNAME));
- DEBUG_printf(("ippWrite: writing name = %d, \'%s\'\n", n, attr->name));
- DEBUG_printf(("ippWrite: writing value tag = %x\n", attr->value_tag));
- DEBUG_puts("ippWrite: writing name = 0, \'\'\n");
+ DEBUG_printf(("ippWriteIO: writing name=%d,\"%s\"\n", n,
+ attr->name));
+ DEBUG_printf(("ippWriteIO: writing value tag=%x(%s)\n",
+ attr->value_tag, ippTagString(attr->value_tag)));
+ DEBUG_puts("ippWriteIO: writing name=0,\"\"\n");
*bufptr++ = IPP_TAG_MEMBERNAME;
*bufptr++ = 0;
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_KEYWORD :
- case IPP_TAG_STRING :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
case IPP_TAG_CHARSET :
* values with a zero-length name...
*/
- DEBUG_printf(("ippWrite: writing value tag = %x\n",
- attr->value_tag));
- DEBUG_printf(("ippWrite: writing name = 0, \'\'\n"));
+ DEBUG_printf(("ippWriteIO: writing value tag=%x(%s)\n",
+ attr->value_tag,
+ ippTagString(attr->value_tag)));
+ DEBUG_printf(("ippWriteIO: writing name=0,\"\"\n"));
if ((sizeof(buffer) - (bufptr - buffer)) < 3)
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
if (n > (sizeof(buffer) - 2))
return (IPP_ERROR);
- DEBUG_printf(("ippWrite: writing string = %d, \'%s\'\n", n,
+ DEBUG_printf(("ippWriteIO: writing string=%d,\"%s\"\n", n,
value->string.text));
if ((int)(sizeof(buffer) - (bufptr - buffer)) < (n + 2))
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
/*
* All simple strings consist of the 2-byte length and
* character data without the trailing nul normally found
- * in C strings. Also, strings cannot be longer than 32767
+ * in C strings. Also, strings cannot be longer than IPP_MAX_LENGTH
* bytes since the 2-byte length is a signed (twos-complement)
* value.
*
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
n = 4;
if (value->string.charset != NULL)
- n += strlen(value->string.charset);
+ n += (int)strlen(value->string.charset);
if (value->string.text != NULL)
- n += strlen(value->string.text);
+ n += (int)strlen(value->string.text);
if (n > (sizeof(buffer) - 2))
return (IPP_ERROR);
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
{
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP "
+ "attribute...");
return (IPP_ERROR);
}
if ((*cb)(dst, buffer, (int)(bufptr - buffer)) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP attribute...");
+ DEBUG_puts("ippWriteIO: Could not write IPP attribute...");
return (IPP_ERROR);
}
- DEBUG_printf(("ippWrite: wrote %d bytes\n", bufptr - buffer));
+ DEBUG_printf(("ippWriteIO: wrote %d bytes\n",
+ (int)(bufptr - buffer)));
/*
* If blocking is disabled, stop here...
if ((*cb)(dst, buffer, n) < 0)
{
- DEBUG_puts("ippWrite: Could not write IPP end-tag...");
+ DEBUG_puts("ippWriteIO: Could not write IPP end-tag...");
return (IPP_ERROR);
}
/*
- * '_ipp_add_attr()' - Add a new attribute to the request.
+ * '_ippAddAttr()' - Add a new attribute to the request.
*/
ipp_attribute_t * /* O - New attribute */
-_ipp_add_attr(ipp_t *ipp, /* I - IPP message */
- int num_values) /* I - Number of values */
+_ippAddAttr(ipp_t *ipp, /* I - IPP message */
+ int num_values) /* I - Number of values */
{
ipp_attribute_t *attr; /* New attribute */
- DEBUG_printf(("_ipp_add_attr(%p, %d)\n", ipp, num_values));
+ DEBUG_printf(("_ippAddAttr(ipp=%p, num_values=%d)\n", ipp, num_values));
- if (ipp == NULL || num_values < 0)
+ if (!ipp || num_values < 0)
return (NULL);
attr = calloc(sizeof(ipp_attribute_t) +
ipp->last = attr;
}
- DEBUG_printf(("_ipp_add_attr(): %p\n", attr));
+ DEBUG_printf(("_ippAddAttr(): %p\n", attr));
return (attr);
}
/*
- * '_ipp_free_attr()' - Free an attribute.
+ * '_ippFreeAttr()' - Free an attribute.
*/
void
-_ipp_free_attr(ipp_attribute_t *attr) /* I - Attribute to free */
+_ippFreeAttr(ipp_attribute_t *attr) /* I - Attribute to free */
{
int i; /* Looping var */
ipp_value_t *value; /* Current value */
- DEBUG_printf(("_ipp_free_attr(): %p\n", attr));
+ DEBUG_printf(("_ippFreeAttr(attr=%p)\n", attr));
switch (attr->value_tag)
{
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_KEYWORD :
- case IPP_TAG_STRING :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
case IPP_TAG_CHARSET :
for (i = 0, value = attr->values;
i < attr->num_values;
i ++, value ++)
- _cups_sp_free(value->string.text);
+ _cupsStrFree(value->string.text);
break;
case IPP_TAG_TEXTLANG :
i ++, value ++)
{
if (value->string.charset && i == 0)
- _cups_sp_free(value->string.charset);
- _cups_sp_free(value->string.text);
+ _cupsStrFree(value->string.charset);
+ _cupsStrFree(value->string.text);
}
break;
ippDelete(value->collection);
break;
+ case IPP_TAG_STRING :
+ for (i = 0, value = attr->values;
+ i < attr->num_values;
+ i ++, value ++)
+ free(value->unknown.data);
+ break;
+
default :
if (!((int)attr->value_tag & IPP_TAG_COPY))
{
}
if (attr->name)
- _cups_sp_free(attr->name);
+ _cupsStrFree(attr->name);
free(attr);
}
if (!attr->name)
continue;
- DEBUG_printf(("attr->name = %s, attr->num_values = %d, bytes = %d\n",
- attr->name, attr->num_values, bytes));
+ DEBUG_printf(("ipp_length: attr->name=\"%s\", attr->num_values=%d, "
+ "bytes=%d\n", attr->name, attr->num_values, bytes));
- bytes += strlen(attr->name); /* Name */
+ bytes += (int)strlen(attr->name); /* Name */
bytes += attr->num_values; /* Value tag for each value */
bytes += 2 * attr->num_values; /* Name lengths */
bytes += 2 * attr->num_values; /* Value lengths */
case IPP_TAG_TEXT :
case IPP_TAG_NAME :
case IPP_TAG_KEYWORD :
- case IPP_TAG_STRING :
case IPP_TAG_URI :
case IPP_TAG_URISCHEME :
case IPP_TAG_CHARSET :
i < attr->num_values;
i ++, value ++)
if (value->string.text != NULL)
- bytes += strlen(value->string.text);
+ bytes += (int)strlen(value->string.text);
break;
case IPP_TAG_DATE :
i ++, value ++)
{
if (value->string.charset != NULL)
- bytes += strlen(value->string.charset);
+ bytes += (int)strlen(value->string.charset);
if (value->string.text != NULL)
- bytes += strlen(value->string.text);
+ bytes += (int)strlen(value->string.text);
}
break;
for (i = 0, value = attr->values;
i < attr->num_values;
i ++, value ++)
- bytes += ipp_length(value->collection, 1);
+ bytes += (int)ipp_length(value->collection, 1);
break;
default :
else
bytes ++;
- DEBUG_printf(("bytes = %d\n", bytes));
+ DEBUG_printf(("ipp_length: bytes=%d\n", bytes));
return (bytes);
}
DEBUG_printf(("ipp_read_http(http=%p, buffer=%p, length=%d)\n",
- http, buffer, length));
+ http, buffer, (int)length));
/*
* Loop until all bytes are read...
*/
- for (tbytes = 0, bytes = 0; tbytes < length; tbytes += bytes, buffer += bytes)
+ for (tbytes = 0, bytes = 0;
+ tbytes < (int)length;
+ tbytes += bytes, buffer += bytes)
{
- DEBUG_printf(("tbytes = %d, http->state = %d\n", tbytes, http->state));
+ DEBUG_printf(("ipp_read_http: tbytes=%d, http->state=%d\n", tbytes,
+ http->state));
if (http->state == HTTP_WAITING)
break;
* Do "fast read" from HTTP buffer directly...
*/
- if (http->used > (length - tbytes))
- bytes = length - tbytes;
+ if (http->used > (int)(length - tbytes))
+ bytes = (int)(length - tbytes);
else
bytes = http->used;
if (!http->blocking)
{
/*
- * Wait up to 1 second for more data on non-blocking sockets...
+ * Wait up to 10 seconds for more data on non-blocking sockets...
*/
- if (!httpWait(http, 1000))
+ if (!httpWait(http, 10000))
{
/*
* Signal no data...
if (tbytes == 0 && bytes < 0)
tbytes = -1;
- DEBUG_printf(("returning %d bytes...\n", tbytes));
+ DEBUG_printf(("ipp_read_http: returning %d bytes...\n", tbytes));
return (tbytes);
}
ipp_uchar_t *buffer, /* O - Read buffer */
size_t length) /* I - Number of bytes to read */
{
+#ifdef WIN32
+ return ((ssize_t)read(*fd, buffer, (unsigned)length));
+#else
return (read(*fd, buffer, length));
+#endif /* WIN32 */
}
ipp_uchar_t *buffer, /* I - Data to write */
size_t length) /* I - Number of bytes to write */
{
+#ifdef WIN32
+ return ((ssize_t)write(*fd, buffer, (unsigned)length));
+#else
return (write(*fd, buffer, length));
+#endif /* WIN32 */
+}
+
+
+#ifdef __linux
+/*
+ * The following symbol definitions are provided only for KDE
+ * compatibility during the CUPS 1.2 testing period and will be
+ * removed in a future release of CUPS. These are PRIVATE APIs
+ * from CUPS 1.1.x that the KDE developers chose to use...
+ */
+
+ipp_attribute_t * /* O - New attribute */
+_ipp_add_attr(ipp_t *ipp, /* I - IPP message */
+ int num_values) /* I - Number of values */
+{
+ return (_ippAddAttr(ipp, num_values));
+}
+
+void
+_ipp_free_attr(ipp_attribute_t *attr) /* I - Attribute to free */
+{
+ _ippFreeAttr(attr);
}
+#endif /* __linux */
/*
- * End of "$Id: ipp.c 5047 2006-02-02 05:14:15Z mike $".
+ * End of "$Id: ipp.c 7847 2008-08-19 04:22:14Z mike $".
*/