3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller/*
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * CDDL HEADER START
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller *
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * The contents of this file are subject to the terms of the
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * Common Development and Distribution License (the "License").
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * You may not use this file except in compliance with the License.
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller *
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * or http://www.opensolaris.org/os/licensing.
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * See the License for the specific language governing permissions
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * and limitations under the License.
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller *
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * When distributing Covered Code, include this CDDL HEADER in each
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * If applicable, add the following below this CDDL HEADER, with the
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * fields enclosed by brackets "[]" replaced with your own identifying
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * information: Portions Copyright [yyyy] [name of copyright owner]
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller *
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * CDDL HEADER END
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller */
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller/*
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * Use is subject to license terms.
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller *
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller */
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller/* $Id: service.c 163 2006-05-09 15:07:45Z njacobs $ */
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller#pragma ident "%Z%%M% %I% %E% SMI"
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller#include <stdlib.h>
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller#include <stdio.h>
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller#include <string.h>
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller#include <stdarg.h>
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller#include <alloca.h>
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller#include <uri.h>
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller#include <papi_impl.h>
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmillerpapi_status_t
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmillerservice_fill_in(service_t *svc, char *name)
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller{
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller papi_status_t status = PAPI_OK;
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller uri_t *uri = NULL;
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller if (svc == NULL)
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller return (PAPI_BAD_ARGUMENT);
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller if (name == NULL)
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller return (PAPI_OK);
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller /*
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * valid URIs are in the form:
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller * lpd://server[:port]/.../queue[#extensions]
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller * rfc-1179://server[:port]/.../queue[#extensions]
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller * any authentication information supplied the URI is ignored.
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller */
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller if (uri_from_string((char *)name, &uri) != -1) {
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller if ((strcasecmp(uri->scheme, "lpd") == 0) ||
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller (strcasecmp(uri->scheme, "rfc-1179") == 0)) {
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller if (svc->uri != NULL)
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller uri_free(svc->uri);
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller svc->uri = uri;
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller } else {
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller uri_free(uri);
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller status = PAPI_URI_SCHEME;
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller }
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller }
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller return (status);
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller}
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller
3a666413480ef97101461705e1f47cbab0266301Brendan Mmillerpapi_status_t
3a666413480ef97101461705e1f47cbab0266301Brendan MmillerpapiServiceCreate(papi_service_t *handle, char *service_name,
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller char *user_name, char *password,
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller int (*authCB)(papi_service_t svc, void *app_data),
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller papi_encryption_t encryption, void *app_data)
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller{
3a666413480ef97101461705e1f47cbab0266301Brendan Mmiller papi_status_t status;
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller service_t *svc = NULL;
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller if (handle == NULL)
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller return (PAPI_BAD_ARGUMENT);
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller if ((*handle = svc = (service_t *)calloc(1, sizeof (*svc))) == NULL)
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller return (PAPI_TEMPORARY_ERROR);
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller if (service_name != NULL)
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller papiAttributeListAddString(&svc->attributes, PAPI_ATTR_EXCL,
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller "service-name", service_name);
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller (void) papiServiceSetUserName(svc, user_name);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller (void) papiServiceSetPassword(svc, password);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller (void) papiServiceSetAuthCB(svc, authCB);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller (void) papiServiceSetAppData(svc, app_data);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller (void) papiServiceSetEncryption(svc, encryption);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller status = service_fill_in(svc, service_name);
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller return (status);
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller}
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmillervoid
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan MmillerpapiServiceDestroy(papi_service_t handle)
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller{
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller if (handle != NULL) {
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller service_t *svc = handle;
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller#ifdef DEADBEEF
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller if (svc->cache != NULL)
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller cache_free(svc->cache);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller#endif
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller if (svc->uri != NULL)
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller uri_free(svc->uri);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller if (svc->attributes != NULL)
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller papiAttributeListFree(svc->attributes);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller free(svc);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller }
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller}
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmillerpapi_status_t
99054f32a1766b8a8f60509cb724359413171d1dBrendan MmillerpapiServiceSetUserName(papi_service_t handle, char *user_name)
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller{
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller service_t *svc = handle;
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller if (svc == NULL)
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller return (PAPI_BAD_ARGUMENT);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller return (papiAttributeListAddString(&svc->attributes, PAPI_ATTR_REPLACE,
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller "user-name", user_name));
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller}
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmillerpapi_status_t
99054f32a1766b8a8f60509cb724359413171d1dBrendan MmillerpapiServiceSetPassword(papi_service_t handle, char *password)
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller{
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller service_t *svc = handle;
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller if (svc == NULL)
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller return (PAPI_BAD_ARGUMENT);
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller return (papiAttributeListAddString(&svc->attributes,
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller PAPI_ATTR_REPLACE, "password", password));
ba208d3f0e9d48f3c841cdd627f200a7bb04cea8Brendan Mmiller}
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmillerpapi_status_t
99054f32a1766b8a8f60509cb724359413171d1dBrendan MmillerpapiServiceSetEncryption(papi_service_t handle,
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller papi_encryption_t encryption)
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller{
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller service_t *svc = handle;
99054f32a1766b8a8f60509cb724359413171d1dBrendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller if (svc == NULL)
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller return (PAPI_BAD_ARGUMENT);
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller
3f424ffdb194d6ff7ac053c5b3e53211a2de2d64Brendan Mmiller return (papiAttributeListAddInteger(&svc->attributes, PAPI_ATTR_REPLACE,
"encryption", (int)encryption));
}
papi_status_t
papiServiceSetAuthCB(papi_service_t handle,
int (*authCB)(papi_service_t svc, void *app_data))
{
service_t *svc = handle;
if (svc == NULL)
return (PAPI_BAD_ARGUMENT);
svc->authCB = (int (*)(papi_service_t svc, void *))authCB;
return (PAPI_OK);
}
papi_status_t
papiServiceSetAppData(papi_service_t handle, void *app_data)
{
service_t *svc = handle;
if (svc == NULL)
return (PAPI_BAD_ARGUMENT);
svc->app_data = (void *)app_data;
return (PAPI_OK);
}
char *
papiServiceGetServiceName(papi_service_t handle)
{
service_t *svc = handle;
char *result = NULL;
if (svc != NULL)
papiAttributeListGetString(svc->attributes, NULL,
"service-name", &result);
return (result);
}
char *
papiServiceGetUserName(papi_service_t handle)
{
service_t *svc = handle;
char *result = NULL;
if (svc != NULL)
papiAttributeListGetString(svc->attributes, NULL,
"user-name", &result);
return (result);
}
char *
papiServiceGetPassword(papi_service_t handle)
{
service_t *svc = handle;
char *result = NULL;
if (svc != NULL)
papiAttributeListGetString(svc->attributes, NULL,
"password", &result);
return (result);
}
papi_encryption_t
papiServiceGetEncryption(papi_service_t handle)
{
service_t *svc = handle;
papi_encryption_t result = PAPI_ENCRYPT_NEVER;
if (svc != NULL)
papiAttributeListGetInteger(svc->attributes, NULL,
"encryption", (int *)&result);
return (result);
}
void *
papiServiceGetAppData(papi_service_t handle)
{
service_t *svc = handle;
void *result = NULL;
if (svc != NULL) {
result = svc->app_data;
}
return (result);
}
papi_attribute_t **
papiServiceGetAttributeList(papi_service_t handle)
{
service_t *svc = handle;
papi_attribute_t **result = NULL;
if (svc != NULL)
result = svc->attributes;
return (result);
}
char *
papiServiceGetStatusMessage(papi_service_t handle)
{
service_t *svc = handle;
char *result = NULL;
if (svc != NULL) {
papiAttributeListGetString(svc->attributes, NULL,
"detailed-status-message", &result);
}
return (result);
}
void
detailed_error(service_t *svc, char *fmt, ...)
{
if ((svc != NULL) && (fmt != NULL)) {
va_list ap;
size_t size;
char *message = alloca(BUFSIZ);
va_start(ap, fmt);
/*
* fill in the message. If the buffer is too small, allocate
* one that is large enough and fill it in.
*/
if ((size = vsnprintf(message, BUFSIZ, fmt, ap)) >= BUFSIZ)
if ((message = alloca(size)) != NULL)
vsnprintf(message, size, fmt, ap);
va_end(ap);
papiAttributeListAddString(&svc->attributes, PAPI_ATTR_APPEND,
"detailed-status-message", message);
}
}