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: service.c 163 2006-05-09 15:07:45Z njacobs $ */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#pragma ident "%Z%%M% %I% %E% SMI"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdlib.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdio.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <string.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdarg.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <alloca.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <uri.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <papi_impl.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsservice_fill_in(service_t *svc, char *name)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_t *uri = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (name == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * valid URIs are in the form:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * lpd://server[:port]/.../queue[#extensions]
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * rfc-1179://server[:port]/.../queue[#extensions]
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * any authentication information supplied the URI is ignored.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (uri_from_string((char *)name, &uri) != -1) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((strcasecmp(uri->scheme, "lpd") == 0) ||
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (strcasecmp(uri->scheme, "rfc-1179") == 0)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->uri != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_free(svc->uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->uri = uri;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_free(uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = PAPI_URI_SCHEME;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (status);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceCreate(papi_service_t *handle, char *service_name,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *user_name, char *password,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int (*authCB)(papi_service_t svc, void *app_data),
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_encryption_t encryption, void *app_data)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t status;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((*handle = svc = (service_t *)calloc(1, sizeof (*svc))) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (service_name != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(&svc->attributes, PAPI_ATTR_EXCL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "service-name", service_name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiServiceSetUserName(svc, user_name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiServiceSetPassword(svc, password);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiServiceSetAuthCB(svc, authCB);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiServiceSetAppData(svc, app_data);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (void) papiServiceSetEncryption(svc, encryption);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs status = service_fill_in(svc, service_name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (status);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceDestroy(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#ifdef DEADBEEF
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->cache != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs cache_free(svc->cache);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#endif
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->uri != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_free(svc->uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->attributes != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(svc->attributes);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(svc);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceSetUserName(papi_service_t handle, char *user_name)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (papiAttributeListAddString(&svc->attributes, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "user-name", user_name));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceSetPassword(papi_service_t handle, char *password)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (papiAttributeListAddString(&svc->attributes,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs PAPI_ATTR_REPLACE, "password", password));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceSetEncryption(papi_service_t handle,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_encryption_t encryption)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (papiAttributeListAddInteger(&svc->attributes, PAPI_ATTR_REPLACE,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "encryption", (int)encryption));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceSetAuthCB(papi_service_t handle,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int (*authCB)(papi_service_t svc, void *app_data))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->authCB = (int (*)(papi_service_t svc, void *))authCB;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceSetAppData(papi_service_t handle, void *app_data)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->app_data = (void *)app_data;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobschar *
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetServiceName(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(svc->attributes, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "service-name", &result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobschar *
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetUserName(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(svc->attributes, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "user-name", &result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobschar *
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetPassword(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(svc->attributes, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "password", &result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_encryption_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetEncryption(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_encryption_t result = PAPI_ENCRYPT_NEVER;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetInteger(svc->attributes, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "encryption", (int *)&result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid *
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetAppData(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs void *result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = svc->app_data;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_attribute_t **
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetAttributeList(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = svc->attributes;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobschar *
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetStatusMessage(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(svc->attributes, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "detailed-status-message", &result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobsdetailed_error(service_t *svc, char *fmt, ...)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((svc != NULL) && (fmt != NULL)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs va_list ap;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs size_t size;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *message = alloca(BUFSIZ);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs va_start(ap, fmt);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * fill in the message. If the buffer is too small, allocate
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * one that is large enough and fill it in.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((size = vsnprintf(message, BUFSIZ, fmt, ap)) >= BUFSIZ)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((message = alloca(size)) != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs vsnprintf(message, size, fmt, ap);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs va_end(ap);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListAddString(&svc->attributes, PAPI_ATTR_APPEND,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "detailed-status-message", message);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}