1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 22 /* 23 * Copyright 2006 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 * 26 */ 27 28 /* $Id: service.c 163 2006-05-09 15:07:45Z njacobs $ */ 29 30 #include <stdlib.h> 31 #include <stdio.h> 32 #include <string.h> 33 #include <stdarg.h> 34 #include <uri.h> 35 #include <papi_impl.h> 36 37 papi_status_t 38 service_fill_in(service_t *svc, char *name) 39 { 40 papi_status_t status = PAPI_OK; 41 uri_t *uri = NULL; 42 43 if (svc == NULL) 44 return (PAPI_BAD_ARGUMENT); 45 46 if (name == NULL) 47 return (PAPI_OK); 48 49 /* 50 * valid URIs are in the form: 51 * lpd://server[:port]/.../queue[#extensions] 52 * rfc-1179://server[:port]/.../queue[#extensions] 53 * any authentication information supplied the URI is ignored. 54 */ 55 if (uri_from_string((char *)name, &uri) != -1) { 56 if ((strcasecmp(uri->scheme, "lpd") == 0) || 57 (strcasecmp(uri->scheme, "rfc-1179") == 0)) { 58 if (svc->uri != NULL) 59 uri_free(svc->uri); 60 svc->uri = uri; 61 } else { 62 uri_free(uri); 63 status = PAPI_URI_SCHEME; 64 } 65 } 66 67 return (status); 68 } 69 70 papi_status_t 71 papiServiceCreate(papi_service_t *handle, char *service_name, 72 char *user_name, char *password, 73 int (*authCB)(papi_service_t svc, void *app_data), 74 papi_encryption_t encryption, void *app_data) 75 { 76 papi_status_t status; 77 service_t *svc = NULL; 78 79 if (handle == NULL) 80 return (PAPI_BAD_ARGUMENT); 81 82 if ((*handle = svc = (service_t *)calloc(1, sizeof (*svc))) == NULL) 83 return (PAPI_TEMPORARY_ERROR); 84 85 if (service_name != NULL) 86 papiAttributeListAddString(&svc->attributes, PAPI_ATTR_EXCL, 87 "service-name", service_name); 88 89 (void) papiServiceSetUserName(svc, user_name); 90 (void) papiServiceSetPassword(svc, password); 91 (void) papiServiceSetAuthCB(svc, authCB); 92 (void) papiServiceSetAppData(svc, app_data); 93 (void) papiServiceSetEncryption(svc, encryption); 94 95 status = service_fill_in(svc, service_name); 96 97 return (status); 98 } 99 100 void 101 papiServiceDestroy(papi_service_t handle) 102 { 103 if (handle != NULL) { 104 service_t *svc = handle; 105 106 #ifdef DEADBEEF 107 if (svc->cache != NULL) 108 cache_free(svc->cache); 109 #endif 110 if (svc->uri != NULL) 111 uri_free(svc->uri); 112 if (svc->attributes != NULL) 113 papiAttributeListFree(svc->attributes); 114 free(svc); 115 } 116 } 117 118 papi_status_t 119 papiServiceSetUserName(papi_service_t handle, char *user_name) 120 { 121 service_t *svc = handle; 122 123 if (svc == NULL) 124 return (PAPI_BAD_ARGUMENT); 125 126 return (papiAttributeListAddString(&svc->attributes, PAPI_ATTR_REPLACE, 127 "user-name", user_name)); 128 } 129 130 papi_status_t 131 papiServiceSetPassword(papi_service_t handle, char *password) 132 { 133 service_t *svc = handle; 134 135 if (svc == NULL) 136 return (PAPI_BAD_ARGUMENT); 137 138 return (papiAttributeListAddString(&svc->attributes, 139 PAPI_ATTR_REPLACE, "password", password)); 140 } 141 142 papi_status_t 143 papiServiceSetEncryption(papi_service_t handle, 144 papi_encryption_t encryption) 145 { 146 service_t *svc = handle; 147 148 if (svc == NULL) 149 return (PAPI_BAD_ARGUMENT); 150 151 return (papiAttributeListAddInteger(&svc->attributes, PAPI_ATTR_REPLACE, 152 "encryption", (int)encryption)); 153 } 154 155 papi_status_t 156 papiServiceSetAuthCB(papi_service_t handle, 157 int (*authCB)(papi_service_t svc, void *app_data)) 158 { 159 service_t *svc = handle; 160 161 if (svc == NULL) 162 return (PAPI_BAD_ARGUMENT); 163 164 svc->authCB = (int (*)(papi_service_t svc, void *))authCB; 165 166 return (PAPI_OK); 167 } 168 169 papi_status_t 170 papiServiceSetAppData(papi_service_t handle, void *app_data) 171 { 172 service_t *svc = handle; 173 174 if (svc == NULL) 175 return (PAPI_BAD_ARGUMENT); 176 177 svc->app_data = (void *)app_data; 178 179 return (PAPI_OK); 180 } 181 182 char * 183 papiServiceGetServiceName(papi_service_t handle) 184 { 185 service_t *svc = handle; 186 char *result = NULL; 187 188 if (svc != NULL) 189 papiAttributeListGetString(svc->attributes, NULL, 190 "service-name", &result); 191 192 return (result); 193 } 194 195 char * 196 papiServiceGetUserName(papi_service_t handle) 197 { 198 service_t *svc = handle; 199 char *result = NULL; 200 201 if (svc != NULL) 202 papiAttributeListGetString(svc->attributes, NULL, 203 "user-name", &result); 204 205 return (result); 206 207 } 208 209 char * 210 papiServiceGetPassword(papi_service_t handle) 211 { 212 service_t *svc = handle; 213 char *result = NULL; 214 215 if (svc != NULL) 216 papiAttributeListGetString(svc->attributes, NULL, 217 "password", &result); 218 219 return (result); 220 } 221 222 papi_encryption_t 223 papiServiceGetEncryption(papi_service_t handle) 224 { 225 service_t *svc = handle; 226 papi_encryption_t result = PAPI_ENCRYPT_NEVER; 227 228 if (svc != NULL) 229 papiAttributeListGetInteger(svc->attributes, NULL, 230 "encryption", (int *)&result); 231 232 return (result); 233 } 234 235 void * 236 papiServiceGetAppData(papi_service_t handle) 237 { 238 service_t *svc = handle; 239 void *result = NULL; 240 241 if (svc != NULL) { 242 result = svc->app_data; 243 } 244 245 return (result); 246 247 } 248 249 papi_attribute_t ** 250 papiServiceGetAttributeList(papi_service_t handle) 251 { 252 service_t *svc = handle; 253 papi_attribute_t **result = NULL; 254 255 if (svc != NULL) 256 result = svc->attributes; 257 258 return (result); 259 } 260 261 char * 262 papiServiceGetStatusMessage(papi_service_t handle) 263 { 264 service_t *svc = handle; 265 char *result = NULL; 266 267 if (svc != NULL) { 268 papiAttributeListGetString(svc->attributes, NULL, 269 "detailed-status-message", &result); 270 } 271 272 return (result); 273 } 274 275 void 276 detailed_error(service_t *svc, char *fmt, ...) 277 { 278 if ((svc != NULL) && (fmt != NULL)) { 279 va_list ap; 280 char *message; 281 int rv; 282 283 va_start(ap, fmt); 284 rv = vasprintf(&message, fmt, ap); 285 va_end(ap); 286 287 if (rv >= 0) { 288 papiAttributeListAddString(&svc->attributes, 289 PAPI_ATTR_APPEND, "detailed-status-message", 290 message); 291 free(message); 292 } 293 } 294 } 295