355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * CDDL HEADER START
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * The contents of this file are subject to the terms of the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Common Development and Distribution License (the "License").
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * You may not use this file except in compliance with the License.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * or http://www.opensolaris.org/os/licensing.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * See the License for the specific language governing permissions
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * and limitations under the License.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * When distributing Covered Code, include this CDDL HEADER in each
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * If applicable, add the following below this CDDL HEADER, with the
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * fields enclosed by brackets "[]" replaced with your own identifying
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * information: Portions Copyright [yyyy] [name of copyright owner]
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * CDDL HEADER END
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * Use is subject to license terms.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs *
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/* $Id: write.c 146 2006-03-24 00:26:54Z njacobs $ */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#pragma ident "%Z%%M% %I% %E% SMI"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdio.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdlib.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <string.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <sys/types.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <netinet/in.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <inttypes.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <papi.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <ipp.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic int8_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_attribute_to_ipp_type(papi_attribute_value_type_t type)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (type) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_INTEGER:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (VTAG_INTEGER);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_BOOLEAN:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (VTAG_BOOLEAN);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_RANGE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (VTAG_RANGE_OF_INTEGER);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_RESOLUTION:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (VTAG_RESOLUTION);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_DATETIME:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (VTAG_DATE_TIME);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_STRING:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (VTAG_TEXT_WITHOUT_LANGUAGE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (0);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_ipp_type_match(papi_attribute_value_type_t papi, int8_t ipp)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (papi) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_STRING:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (ipp) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_URI:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_OCTET_STRING:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_TEXT_WITHOUT_LANGUAGE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_URI_SCHEME:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_CHARSET:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_NATURAL_LANGUAGE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_MIME_MEDIA_TYPE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_NAME_WITHOUT_LANGUAGE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_KEYWORD:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs default:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_CONFLICT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_INTEGER:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (ipp) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_ENUM:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case VTAG_INTEGER:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs default:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_CONFLICT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_BOOLEAN:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (ipp != VTAG_BOOLEAN)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_CONFLICT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_RANGE:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (ipp != VTAG_RANGE_OF_INTEGER)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_CONFLICT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_RESOLUTION:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (ipp != VTAG_RESOLUTION)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_CONFLICT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_DATETIME:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (ipp != VTAG_DATE_TIME)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_CONFLICT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_COLLECTION:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* don't need to match */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_write_attribute(ipp_writer_t iwrite, void *fd, papi_attribute_t *attribute)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_value_t **values;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int8_t type;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *name;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs name = attribute->name;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs values = attribute->values;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((type = name_to_ipp_type(name)) == 0)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs type = papi_attribute_to_ipp_type(attribute->type);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* The types don't match, so don't send the attribute */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((status = papi_ipp_type_match(attribute->type, type)) != PAPI_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (status);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (values == NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uint16_t length;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs type = VTAG_UNSUPPORTED;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &type, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (name != NULL) { /* first value gets named */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(strlen(name));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, name, strlen(name)) != strlen(name))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(0);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; values[i] != NULL; i++) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_value_t *value = values[i];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uint16_t length = 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &type, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (name != NULL) { /* first value gets named */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(strlen(name));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, name, strlen(name)) != strlen(name))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs name = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(0);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (attribute->type) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_STRING: {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *v = (char *)value->string;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (v != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs size_t str_length = strlen(v);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * if the length is more than 16 bits can
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * express, send what can be represented
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * in 16 bits. IPP "strings" can only be
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * that large.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (str_length > 0xFFFF)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs str_length = 0xFFFF;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(str_length);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, v, str_length) != str_length)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_BOOLEAN: {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int8_t v = (int8_t)value->boolean;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(1);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &v, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_INTEGER: {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int32_t v = (int32_t)value->integer;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(4);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs v = (int32_t)htonl(v);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &v, 4) != 4)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_RANGE: {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int32_t min = (int32_t)htonl((int)(value->range).lower),
355b4669e025ff377602b6fc7caaf30dbc218371jacobs max = (int32_t)htonl((int)(value->range).upper);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(8);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &min, 4) != 4)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &max, 4) != 4)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_RESOLUTION: {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int32_t x = (int)(value->resolution).xres,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs y = (int)(value->resolution).yres;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int8_t units = (int8_t)(value->resolution).units;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(9);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs x = (int32_t)htonl(x);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs y = (int32_t)htonl(y);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &x, 4) != 4)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &y, 4) != 4)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &units, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_DATETIME: {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs struct tm *v = gmtime(&value->datetime);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int8_t c;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uint16_t s;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(11);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = (uint16_t)htons(v->tm_year + 1900);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &s, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = v->tm_mon + 1;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = v->tm_mday;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = v->tm_hour;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = v->tm_min;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = v->tm_sec;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = /* v->deciseconds */ 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = /* v->utc_dir */ 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = /* v->utc_hours */ 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = /* v->utc_minutes */ 0;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs default: {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * If there is a value, it is not one of our
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * types, so we couldn't use it anyway. We assume
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * that it was an OOB type with no value
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs length = (uint16_t)htons(0);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &length, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs break;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_write_attribute_group(ipp_writer_t iwrite, void *fd, int8_t type,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **attributes)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* write group tag */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &type, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* write values */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (i = 0; ((attributes[i] != NULL) && (result == PAPI_OK)); i++)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_write_attribute(iwrite, fd, attributes[i]);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_write_attribute_groups(ipp_writer_t iwrite, void *fd,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **groups)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int8_t c;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (c = DTAG_MIN; c <= DTAG_MAX; c++) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **group = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs void *iter = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char name[32];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) ipp_tag_string(c, name, sizeof (name));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs for (status = papiAttributeListGetCollection(groups, &iter,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs name, &group);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ((status == PAPI_OK) && (result == PAPI_OK));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = papiAttributeListGetCollection(groups, &iter,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs NULL, &group))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_write_attribute_group(iwrite, fd,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c, group);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = DTAG_END_OF_ATTRIBUTES;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = PAPI_DEVICE_ERROR;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsstatic papi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_write_message_header(ipp_writer_t iwrite, void *fd,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **message)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int tmp;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int8_t c;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uint16_t s;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int32_t i;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* write the version */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetInteger(message, NULL, "version-major", &tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = tmp;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetInteger(message, NULL, "version-minor", &tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs c = tmp;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &c, 1) != 1)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* write the request/status code */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetInteger(message, NULL, "status-code", &tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetInteger(message, NULL, "operation-id", &tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs s = (uint16_t)htons(tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &s, 2) != 2)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /* write the request id */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetInteger(message, NULL, "request-id", &tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs i = (uint32_t)htonl(tmp);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (iwrite(fd, &i, 4) != 4)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_DEVICE_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsipp_write_message(ipp_writer_t iwrite, void *fd, papi_attribute_t **message)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((iwrite == NULL) || (fd == NULL) || (message == NULL))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_write_message_header(iwrite, fd, message);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (result == PAPI_OK)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = ipp_write_attribute_groups(iwrite, fd, message);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}