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
service_fill_in(service_t * svc,char * name)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
papiServiceCreate(papi_service_t * handle,char * service_name,char * user_name,char * password,int (* authCB)(papi_service_t svc,void * app_data),papi_encryption_t encryption,void * app_data)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
papiServiceDestroy(papi_service_t handle)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
papiServiceSetUserName(papi_service_t handle,char * user_name)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
papiServiceSetPassword(papi_service_t handle,char * password)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
papiServiceSetEncryption(papi_service_t handle,papi_encryption_t encryption)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
papiServiceSetAuthCB(papi_service_t handle,int (* authCB)(papi_service_t svc,void * app_data))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
papiServiceSetAppData(papi_service_t handle,void * app_data)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 *
papiServiceGetServiceName(papi_service_t handle)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 *
papiServiceGetUserName(papi_service_t handle)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 *
papiServiceGetPassword(papi_service_t handle)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
papiServiceGetEncryption(papi_service_t handle)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 *
papiServiceGetAppData(papi_service_t handle)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 **
papiServiceGetAttributeList(papi_service_t handle)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 *
papiServiceGetStatusMessage(papi_service_t handle)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
detailed_error(service_t * svc,char * fmt,...)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