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 * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
24 */
25
26 /*LINTLIBRARY*/
27
28 #include <stdio.h>
29 #include <string.h>
30 #include <stdlib.h>
31
32 #include <papi_impl.h>
33
34
35 papi_status_t
papiAttributeListAddLPString(papi_attribute_t *** list,int flags,char * name,char * value)36 papiAttributeListAddLPString(papi_attribute_t ***list, int flags, char *name,
37 char *value)
38 {
39 papi_status_t result = PAPI_BAD_ARGUMENT;
40
41 if ((list != NULL) && (name != NULL) && (value != NULL) &&
42 (value[0] != '\0'))
43 result = papiAttributeListAddString(list, flags, name, value);
44 return (result);
45 }
46
47 papi_status_t
papiAttributeListAddLPStrings(papi_attribute_t *** list,int flags,char * name,char ** values)48 papiAttributeListAddLPStrings(papi_attribute_t ***list, int flags, char *name,
49 char **values)
50 {
51 papi_status_t result = PAPI_OK;
52 int i, flgs = flags;
53
54 if ((list == NULL) || (name == NULL) || (values == NULL))
55 result = PAPI_BAD_ARGUMENT;
56
57 for (i = 0; ((result == PAPI_OK) && (values[i] != NULL));
58 i++, flgs = PAPI_ATTR_APPEND)
59 result = papiAttributeListAddString(list, flgs, name,
60 values[i]);
61
62 return (result);
63 }
64
65 void
papiAttributeListGetLPString(papi_attribute_t ** attributes,char * key,char ** string)66 papiAttributeListGetLPString(papi_attribute_t **attributes, char *key,
67 char **string)
68 {
69 char *value = NULL;
70
71 papiAttributeListGetString(attributes, NULL, key, &value);
72 if (value != NULL) {
73 if (*string != NULL)
74 free(*string);
75 *string = strdup(value);
76 }
77 }
78
79 void
papiAttributeListGetLPStrings(papi_attribute_t ** attributes,char * key,char *** strings)80 papiAttributeListGetLPStrings(papi_attribute_t **attributes, char *key,
81 char ***strings)
82 {
83 papi_status_t status;
84 char **values = NULL;
85 char *value = NULL;
86 void *iter = NULL;
87
88 for (status = papiAttributeListGetString(attributes, &iter,
89 key, &value);
90 status == PAPI_OK;
91 status = papiAttributeListGetString(attributes, &iter,
92 NULL, &value))
93 addlist(&values, value);
94
95 if (values != NULL) {
96 if (*strings != NULL)
97 freelist(*strings);
98 *strings = values;
99 }
100 }
101
102 char *
printer_name_from_uri_id(char * uri,int32_t id)103 printer_name_from_uri_id(char *uri, int32_t id)
104 {
105 REQUEST *request = NULL;
106 char *result = "";
107
108 if (uri != NULL) {
109 if ((result = strrchr(uri, '/')) != NULL) {
110 result += 1;
111 } else
112 result = (char *)uri;
113
114 if ((strcmp(result, "jobs") == 0) ||
115 (strcmp(result, "any") == 0) ||
116 (strcmp(result, "all") == 0))
117 result = "";
118 }
119
120 if ((result[0] == '\0') && (id != -1)) {
121 char path[32];
122
123 snprintf(path, sizeof (path), "%d-0", id);
124 if ((request = getrequest(path)) != NULL)
125 result = request->destination;
126 }
127
128 result = strdup(result);
129
130 if (request != NULL)
131 freerequest(request);
132
133 return (result);
134 }
135
136 /*
137 * LP content type <-> MIME type conversion table. (order dependent)
138 */
139 static struct {
140 char *mime_type;
141 char *lp_type;
142 } type_map[] = {
143 { "text/plain", "simple" },
144 { "application/octet-stream", "raw" },
145 { "application/octet-stream", "any" },
146 { "application/postscript", "postscript" },
147 { "application/postscript", "ps" },
148 { "application/x-cif", "cif" },
149 { "application/x-dvi", "dvi" },
150 { "application/x-plot", "plot" },
151 { "application/x-ditroff", "troff" },
152 { "application/x-troff", "otroff" },
153 { "application/x-pr", "pr" },
154 { "application/x-fortran", "fortran" },
155 { "application/x-raster", "raster" },
156 { NULL, NULL}
157 };
158
159 char *
mime_type_to_lp_type(char * mime_type)160 mime_type_to_lp_type(char *mime_type)
161 {
162 int i;
163
164 if (mime_type == NULL)
165 return ("simple");
166
167 for (i = 0; type_map[i].mime_type != NULL; i++)
168 if (strcasecmp(type_map[i].mime_type, mime_type) == 0)
169 return (type_map[i].lp_type);
170
171 return (mime_type);
172 }
173
174 char *
lp_type_to_mime_type(char * lp_type)175 lp_type_to_mime_type(char *lp_type)
176 {
177 int i;
178
179 if (lp_type == NULL)
180 return ("text/plain");
181
182 for (i = 0; type_map[i].lp_type != NULL; i++)
183 if (strcasecmp(type_map[i].lp_type, lp_type) == 0)
184 return (type_map[i].mime_type);
185
186 return (lp_type);
187 }
188