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 171 2006-05-20 06:00:32Z njacobs $ */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#pragma ident "%Z%%M% %I% %E% SMI"
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs/*LINTLIBRARY*/
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdlib.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdio.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <stdarg.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <string.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <alloca.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <libintl.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <papi_impl.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs#include <config-site.h>
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobshttp_encryption_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobshttp_encryption_type(papi_encryption_t encryption)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs switch (encryption) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_ENCRYPT_IF_REQUESTED:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (HTTP_ENCRYPT_IF_REQUESTED);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_ENCRYPT_REQUIRED:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (HTTP_ENCRYPT_REQUIRED);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_ENCRYPT_ALWAYS:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (HTTP_ENCRYPT_ALWAYS);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs case PAPI_ENCRYPT_NEVER:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (HTTP_ENCRYPT_NEVER);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs default:
355b4669e025ff377602b6fc7caaf30dbc218371jacobs ; /* this should log an error */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (HTTP_ENCRYPT_NEVER); /* should never get here */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobsservice_connect(service_t *svc, char *service_name)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int port = 631;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->connection != NULL) /* alread connected ? */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_OK);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->uri == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_from_string(service_name, &svc->uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((service_name != NULL) && (svc->uri == NULL)) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs /*
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * a name was supplied and it's not in URI form, we will
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * try to use a "default" IPP service under the assumption
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * that this is most likely a short-form printer name from
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * from a papiPrinter*() or papiJob*() call and not from a
355b4669e025ff377602b6fc7caaf30dbc218371jacobs * papiServiceCreate() call.
355b4669e025ff377602b6fc7caaf30dbc218371jacobs */
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((service_name = getenv("PAPI_SERVICE_URI")) == NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *cups;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((cups = getenv("CUPS_SERVER")) != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char buf[BUFSIZ];
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs snprintf(buf, sizeof (buf),
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "ipp://%s/printers/", cups);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_name = strdup(buf);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (service_name == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_name = DEFAULT_IPP_SERVICE_URI;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_from_string(service_name, &svc->uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->uri == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_NOT_POSSIBLE);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->uri->port != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs port = strtol(svc->uri->port, NULL, 10);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->connection = httpConnectEncrypt(svc->uri->host, port,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs http_encryption_type(svc->encryption));
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->connection == NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->uri != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_free(svc->uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->uri = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = PAPI_SERVICE_UNAVAILABLE;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else if (service_name != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->name = strdup(service_name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
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 result = PAPI_NOT_POSSIBLE;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *encoding = getenv("HTTP_TRANSFER_ENCODING");
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_BAD_ARGUMENT);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((*handle = svc = calloc(1, sizeof (*svc))) == NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (PAPI_TEMPORARY_ERROR);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (user_name != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->user = strdup(user_name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (password != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->password = strdup(password);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->encryption = encryption;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (authCB != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->authCB = authCB;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (app_data != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->app_data = app_data;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if ((encoding != NULL) && (strcasecmp(encoding, "content-length") == 0))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->transfer_encoding = TRANSFER_ENCODING_LENGTH;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->transfer_encoding = TRANSFER_ENCODING_CHUNKED;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (service_name != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = service_connect(svc, service_name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceDestroy(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->attributes != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListFree(svc->attributes);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->name != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(svc->name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->user != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(svc->user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->password != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(svc->password);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->uri != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs uri_free(svc->uri);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->post != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(svc->post);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->connection != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpClose(svc->connection);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(handle);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceSetUserName(papi_service_t handle, char *user_name)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->user != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(svc->user);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->user = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (user_name != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->user = strdup(user_name);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = PAPI_BAD_ARGUMENT;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceSetPassword(papi_service_t handle, char *password)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (svc->password != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs free(svc->password);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->password = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (password != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->password = strdup(password);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = PAPI_BAD_ARGUMENT;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceSetEncryption(papi_service_t handle,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_encryption_t encryption)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->encryption = encryption;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs httpEncryption(svc->connection,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs (http_encryption_t)svc->encryption);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = PAPI_BAD_ARGUMENT;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceSetAuthCB(papi_service_t handle,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs int (*authCB)(papi_service_t svc, void *app_data))
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->authCB = authCB;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = PAPI_BAD_ARGUMENT;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_status_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceSetAppData(papi_service_t handle, void *app_data)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_status_t result = PAPI_OK;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs svc->app_data = (void *)app_data;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs } else
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = PAPI_BAD_ARGUMENT;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobschar *
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetServiceName(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = svc->name;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobschar *
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetUserName(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = svc->user;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobschar *
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetPassword(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = svc->password;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_encryption_t
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetEncryption(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_encryption_t result = PAPI_ENCRYPT_NEVER;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = svc->encryption;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobsvoid *
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetAppData(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs void *result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL) {
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = svc->app_data;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs }
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapi_attribute_t **
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetAttributeList(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papi_attribute_t **result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs if (handle != NULL)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs result = svc->attributes;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs return (result);
355b4669e025ff377602b6fc7caaf30dbc218371jacobs}
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobschar *
355b4669e025ff377602b6fc7caaf30dbc218371jacobspapiServiceGetStatusMessage(papi_service_t handle)
355b4669e025ff377602b6fc7caaf30dbc218371jacobs{
355b4669e025ff377602b6fc7caaf30dbc218371jacobs char *result = NULL;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs service_t *svc = handle;
355b4669e025ff377602b6fc7caaf30dbc218371jacobs
355b4669e025ff377602b6fc7caaf30dbc218371jacobs papiAttributeListGetString(svc->attributes, NULL,
355b4669e025ff377602b6fc7caaf30dbc218371jacobs "detailed-status-message", &result);
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}