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: ipp_types.c 146 2006-03-24 00:26:54Z njacobs $ */ 29 30 #include <stdio.h> 31 #include <stdlib.h> 32 #include <stdarg.h> 33 #include <string.h> 34 #include <ipp.h> 35 #include <errno.h> 36 #include <values.h> 37 38 #ifndef MININT 39 #define MININT (-MAXINT - 1) 40 #endif 41 42 typedef struct { 43 char *name; 44 int8_t ipp_type; 45 int min; 46 int max; 47 } attr_info_list_t; 48 49 static attr_info_list_t attr_list[] = { 50 {"operation-attribute-group", DTAG_OPERATION_ATTRIBUTES, 0, 0}, 51 {"job-attribute-group", DTAG_JOB_ATTRIBUTES, 0, 0}, 52 {"printer-attribute-group", DTAG_PRINTER_ATTRIBUTES, 0, 0}, 53 {"unsupported-attribute-group", DTAG_UNSUPPORTED_ATTRIBUTES, 0, 0}, 54 {"subscription-attribute-group", DTAG_SUBSCRIPTION_ATTRIBUTES, 0, 0}, 55 {"even-notificaton-attribute-group", 56 DTAG_EVENT_NOTIFICATION_ATTRIBUTES, 0, 0}, 57 {"attributes-charset", VTAG_CHARSET, 0, 255}, 58 {"attributes-natural-language", VTAG_NATURAL_LANGUAGE, 0, 255}, 59 {"charset-configured", VTAG_CHARSET, 0, 255}, 60 {"charset-supported", VTAG_CHARSET, 0, 255}, 61 {"color-supported", VTAG_BOOLEAN, 0, 1}, 62 {"compression", VTAG_KEYWORD, 1, 255}, 63 {"compression-supported", VTAG_KEYWORD, 1, 255}, 64 {"copies", VTAG_INTEGER, 1, MAXINT}, 65 {"copies-default", VTAG_INTEGER, 1, MAXINT}, 66 {"copies-supported", VTAG_RANGE_OF_INTEGER, 1, MAXINT}, 67 {"date-at-completed", VTAG_DATE_TIME, 0, 0}, 68 {"date-at-creation", VTAG_DATE_TIME, 0, 0}, 69 {"date-at-processing", VTAG_DATE_TIME, 0, 0}, 70 {"detailed-status-message", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 1023}, 71 {"document-access-error", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 1023}, 72 {"document-format", VTAG_MIME_MEDIA_TYPE, 0, 255}, 73 {"document-format-default", VTAG_MIME_MEDIA_TYPE, 0, 255}, 74 {"document-format-supported", VTAG_MIME_MEDIA_TYPE, 0, 255}, 75 {"document-name", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 76 {"document-name", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 77 {"document-natural-language", VTAG_NATURAL_LANGUAGE, 0, 255}, 78 {"finishing", VTAG_ENUM, 3, 31}, 79 {"finishing-default", VTAG_ENUM, 3, 31}, 80 {"finishing-supported", VTAG_ENUM, 3, 31}, 81 {"generated-natural-language-supported", VTAG_NATURAL_LANGUAGE, 0, 255}, 82 {"ipp-attribute-fidelity", VTAG_BOOLEAN, 0, 1}, 83 {"ipp-versions-supported", VTAG_KEYWORD, 1, 255}, 84 {"job-detailed-status-messages", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 1023}, 85 {"job-document-access-errors", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 1023}, 86 {"job-hold-until", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 87 {"job-hold-until-default", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 88 {"job-hold-until-supported", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 89 {"job-id", VTAG_INTEGER, 1, MAXINT}, 90 {"job-impressions", VTAG_INTEGER, 0, MAXINT}, 91 {"job-impressions-completed", VTAG_INTEGER, 0, MAXINT}, 92 {"job-impressions-supported", VTAG_RANGE_OF_INTEGER, 0, MAXINT}, 93 {"job-k-octets", VTAG_INTEGER, 0, MAXINT}, 94 {"job-k-octets-processed", VTAG_INTEGER, 0, MAXINT}, 95 {"job-k-octets-supported", VTAG_RANGE_OF_INTEGER, 0, MAXINT}, 96 {"job-media-sheets", VTAG_INTEGER, 0, MAXINT}, 97 {"job-media-sheets-completed", VTAG_INTEGER, 0, MAXINT}, 98 {"job-media-sheets-supported", VTAG_RANGE_OF_INTEGER, 0, MAXINT}, 99 {"job-message-from-operator", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 127}, 100 {"job-more-info", VTAG_URI, 0, 1023}, 101 {"job-name", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 102 {"job-originating-user-name", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 103 {"job-printer-up-time", VTAG_INTEGER, 1, MAXINT}, 104 {"job-printer-uri", VTAG_URI, 0, 1023}, 105 {"job-priority", VTAG_INTEGER, 1, 100}, 106 {"job-priority-default", VTAG_INTEGER, 1, 100}, 107 {"job-priority-supported", VTAG_INTEGER, 1, 100}, 108 {"job-sheets", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 109 {"job-sheets-default", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 110 {"job-sheets-supported", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 111 {"job-state", VTAG_ENUM, 3, 9}, 112 {"job-state-message", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 1023}, 113 {"job-state-reasons", VTAG_KEYWORD, 1, 255}, 114 {"job-uri", VTAG_URI, 0, 1023}, 115 {"last-document", VTAG_BOOLEAN, 0, 1}, 116 {"limit", VTAG_INTEGER, 1, MAXINT}, 117 {"media", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 118 {"media-default", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 119 {"media-supported", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 120 {"message", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 127}, 121 {"multiple-document-handling", VTAG_KEYWORD, 1, 255}, 122 {"multiple-document-handling-default", VTAG_KEYWORD, 1, 255}, 123 {"multiple-document-handling-supported", VTAG_KEYWORD, 1, 255}, 124 {"multiple-document-jobs-supported", VTAG_BOOLEAN, 0, 1}, 125 {"multiple-operation-time-out", VTAG_INTEGER, 1, MAXINT}, 126 {"my-jobs", VTAG_BOOLEAN, 0, 1}, 127 {"natural-language-configured", VTAG_NATURAL_LANGUAGE, 0, 255}, 128 {"number-of-documents", VTAG_INTEGER, 0, MAXINT}, 129 {"number-of-intervening-jobs", VTAG_INTEGER, 0, MAXINT}, 130 {"number-up", VTAG_INTEGER, 1, MAXINT}, 131 {"number-up-default", VTAG_INTEGER, 1, MAXINT}, 132 {"number-up-supported", VTAG_INTEGER, 1, MAXINT}, 133 {"operations-supported", VTAG_ENUM, 1, 0x8FFF}, 134 {"orientation-requested", VTAG_ENUM, 3, 6}, 135 {"orientation-requested-default", VTAG_ENUM, 3, 6}, 136 {"orientation-requested-supported", VTAG_ENUM, 3, 6}, 137 {"output-device-assigned", VTAG_NAME_WITHOUT_LANGUAGE, 0, 127}, 138 {"page-ranges", VTAG_RANGE_OF_INTEGER, 1, MAXINT}, 139 {"page-ranges-supported", VTAG_BOOLEAN, 0, 1}, 140 {"pages-per-minute", VTAG_INTEGER, 0, MAXINT}, 141 {"pages-per-minute-color", VTAG_INTEGER, 0, MAXINT}, 142 {"pdl-override-supported", VTAG_KEYWORD, 1, 255}, 143 {"print-quality", VTAG_ENUM, 3, 5}, 144 {"print-quality-default", VTAG_ENUM, 3, 5}, 145 {"print-quality-supported", VTAG_ENUM, 3, 5}, 146 {"printer-current-time", VTAG_DATE_TIME, 0, 1}, 147 {"printer-driver-installer", VTAG_URI, 0, 1023}, 148 {"printer-id", VTAG_INTEGER, 1, MAXINT}, 149 {"printer-info", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 127}, 150 {"printer-is-accepting-jobs", VTAG_BOOLEAN, 0, 1}, 151 {"printer-location", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 127}, 152 {"printer-make-and-model", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 127}, 153 {"printer-message-from-operator", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 127}, 154 {"printer-more-info", VTAG_URI, 0, 1023}, 155 {"printer-more-info-manufacturer", VTAG_URI, 0, 1023}, 156 {"printer-name", VTAG_NAME_WITHOUT_LANGUAGE, 0, 127}, 157 {"printer-resolution", VTAG_RESOLUTION, 0, 0}, 158 {"printer-resolution-default", VTAG_RESOLUTION, 0, 0}, 159 {"printer-resolution-supported", VTAG_RESOLUTION, 0, 0}, 160 {"printer-state", VTAG_ENUM, 3, 5}, 161 {"printer-state-message", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 1023}, 162 {"printer-state-reasons", VTAG_KEYWORD, 1, 255}, 163 {"printer-up-time", VTAG_INTEGER, 1, MAXINT}, 164 {"printer-uri", VTAG_URI, 0, 1023}, 165 {"printer-uri-supported", VTAG_URI, 0, 1023}, 166 {"queued-job-count", VTAG_INTEGER, 0, MAXINT}, 167 {"reference-uri-schemes-supported", VTAG_URI_SCHEME, 0, 63}, 168 {"requested-attributes", VTAG_KEYWORD, 1, 255}, 169 {"requesting-user-name", VTAG_NAME_WITHOUT_LANGUAGE, 0, 255}, 170 {"sides", VTAG_KEYWORD, 1, 255}, 171 {"sides-default", VTAG_KEYWORD, 1, 255}, 172 {"sides-supported", VTAG_KEYWORD, 1, 255}, 173 {"status-code", VTAG_ENUM, 1, 0x7FFF}, 174 {"status-message", VTAG_TEXT_WITHOUT_LANGUAGE, 0, 255}, 175 {"time-at-completed", VTAG_INTEGER, MININT, MAXINT}, 176 {"time-at-creation", VTAG_INTEGER, MININT, MAXINT}, 177 {"time-at-processing", VTAG_INTEGER, MININT, MAXINT}, 178 {"uri-authentication-supported", VTAG_KEYWORD, 1, 255}, 179 {"uri-security-supported", VTAG_KEYWORD, 1, 255}, 180 {"which-jobs", VTAG_KEYWORD, 1, 255}, 181 {NULL, 0, 0, 0} 182 }; 183 184 185 static attr_info_list_t * 186 get_attr_info_by_name(char *name) 187 { 188 if (name != NULL) { 189 int i; 190 191 for (i = 0; attr_list[i].name != NULL; i++) 192 if (strcasecmp(attr_list[i].name, name) == 0) 193 return (&attr_list[i]); 194 } 195 196 return (NULL); 197 } 198 199 size_t 200 max_val_len(int8_t type, char *name) 201 { 202 attr_info_list_t *t; 203 int result; 204 205 switch (type) { 206 case VTAG_INTEGER: 207 case VTAG_RANGE_OF_INTEGER: 208 case VTAG_ENUM: 209 result = MAXINT; 210 break; 211 case VTAG_URI: 212 case VTAG_OCTET_STRING: 213 case VTAG_TEXT_WITHOUT_LANGUAGE: 214 result = 1023; 215 break; 216 case VTAG_NATURAL_LANGUAGE: 217 case VTAG_URI_SCHEME: 218 case VTAG_CHARSET: 219 result = 63; 220 break; 221 case VTAG_NAME_WITHOUT_LANGUAGE: 222 case VTAG_MIME_MEDIA_TYPE: 223 case VTAG_KEYWORD: 224 result = 255; 225 break; 226 default: 227 result = MAXINT; 228 } 229 230 #define min(a, b) ((a < b) ? a : b) 231 if ((t = get_attr_info_by_name(name)) != NULL) 232 result = min(t->max, result); 233 #undef min 234 235 return (result); 236 } 237 238 size_t 239 min_val_len(int8_t type, char *name) 240 { 241 attr_info_list_t *t; 242 int result; 243 244 switch (type) { 245 case VTAG_INTEGER: 246 case VTAG_RANGE_OF_INTEGER: 247 result = MININT; 248 break; 249 case VTAG_ENUM: 250 result = 1; 251 break; 252 case VTAG_URI: 253 case VTAG_OCTET_STRING: 254 case VTAG_TEXT_WITHOUT_LANGUAGE: 255 case VTAG_MIME_MEDIA_TYPE: 256 case VTAG_NAME_WITHOUT_LANGUAGE: 257 case VTAG_URI_SCHEME: 258 case VTAG_CHARSET: 259 case VTAG_NATURAL_LANGUAGE: 260 result = 0; 261 break; 262 case VTAG_KEYWORD: 263 result = 1; 264 break; 265 default: 266 result = MININT; 267 } 268 269 #define max(a, b) ((a > b) ? a : b) 270 if ((t = get_attr_info_by_name(name)) != NULL) 271 result = max(t->min, result); 272 #undef max 273 274 return (result); 275 } 276 277 int 278 is_keyword(char *k) 279 { 280 /* [a-z][a-z0-9._-]* */ 281 if (*k < 'a' && *k > 'z') 282 return (0); 283 while (*(++k) != '\0') 284 if (*k < 'a' && *k > 'z' && *k < '0' && *k > '9' && 285 *k != '.' && *k != '_' && *k != '-') 286 return (0); 287 return (1); 288 } 289 290 int8_t 291 name_to_ipp_type(char *name) 292 { 293 int i; 294 295 if (name != NULL) 296 for (i = 0; attr_list[i].name != NULL; i++) 297 if (strcasecmp(attr_list[i].name, name) == 0) 298 return (attr_list[i].ipp_type); 299 300 return (0); 301 } 302