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, Version 1.0 only 6 * (the "License"). You may not use this file except in compliance 7 * with the License. 8 * 9 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 10 * or http://www.opensolaris.org/os/licensing. 11 * See the License for the specific language governing permissions 12 * and limitations under the License. 13 * 14 * When distributing Covered Code, include this CDDL HEADER in each 15 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 16 * If applicable, add the following below this CDDL HEADER, with the 17 * fields enclosed by brackets "[]" replaced with your own identifying 18 * information: Portions Copyright [yyyy] [name of copyright owner] 19 * 20 * CDDL HEADER END 21 */ 22 /* 23 * Copyright 1997 Sun Microsystems, Inc. All rights reserved. 24 * Use is subject to license terms. 25 */ 26 27 /* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */ 28 /* All Rights Reserved */ 29 30 /* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */ 31 32 #include "stdio.h" 33 #include "string.h" 34 #include "errno.h" 35 #include "stdlib.h" 36 37 #include "lp.h" 38 #include "lp.set.h" 39 40 #if defined(__STDC__) 41 char * tparm ( char * , ... ); 42 #else 43 extern char *tparm(); 44 #endif 45 46 #if defined(__STDC__) 47 static int cat_charset ( char *, int , char * , int ); 48 #else 49 static int cat_charset(); 50 #endif 51 52 /** 53 ** set_charset() 54 **/ 55 56 int 57 #if defined(__STDC__) 58 set_charset ( 59 char * char_set, 60 int putout, 61 char * type 62 ) 63 #else 64 set_charset (char_set, putout, type) 65 char *char_set; 66 int putout; 67 char *type; 68 #endif 69 { 70 int cs, 71 ret; 72 73 char *rest, 74 *char_set_nm, 75 *char_set_names, 76 *select_char_set, 77 *start_char_set_def, 78 *p, 79 *q; 80 81 unsigned short has_print_wheel; 82 83 84 tidbit ((char *)0, "daisy", &has_print_wheel); 85 if (has_print_wheel) 86 return (E_SUCCESS); 87 88 tidbit ((char *)0, "csnm", &char_set_names); 89 if ( 90 strlen(char_set) > (size_t) 2 91 && char_set[0] == 'c' 92 && char_set[1] == 's' 93 && char_set[2] 94 && 0 <= (cs = strtol(char_set + 2, &rest, 10)) && cs <= 63 95 && !*rest 96 ) 97 char_set_nm = tparm(char_set_names, cs); 98 99 else { 100 for (cs = 0; cs <= 63; cs++) 101 if ( 102 (char_set_nm = tparm(char_set_names, cs)) 103 && *char_set_nm 104 && STREQU(char_set_nm, char_set) 105 ) 106 break; 107 if (cs > 63) 108 return (E_FAILURE); 109 } 110 111 if (cs == 0) 112 return (E_SUCCESS); 113 114 if (char_set_nm) 115 if (!(char_set_nm = Strdup(char_set_nm))) { 116 errno = ENOMEM; 117 ret = E_FAILURE; 118 goto Return; 119 } 120 121 tidbit ((char *)0, "scs", &select_char_set); 122 p = q = 0; 123 if ((p = tparm(select_char_set, cs)) && *p && (p = Strdup(p))) { 124 125 tidbit ((char *)0, "scsd", &start_char_set_def); 126 if ((q = tparm(start_char_set_def, cs)) && *q) { 127 /* 128 * The ``start char. set def'n.'' capability 129 * is defined and set, so assume we MUST 130 * download the character set before using it. 131 */ 132 if ( 133 OKAY(char_set_nm) 134 && cat_charset(char_set_nm, 0, type, putout) != -1 135 || cat_charset((char *)0, cs, type, putout) != -1 136 || cat_charset(char_set, 0, type, putout) != -1 137 ) 138 ; 139 else { 140 ret = E_FAILURE; 141 goto Return; 142 } 143 144 } else { 145 /* 146 * The ``start char. set def'n.'' capability 147 * is not defined and or set, so assume we MAY 148 * download the character set before using it. 149 */ 150 if ( 151 OKAY(char_set_nm) 152 && cat_charset(char_set_nm, 0, type, putout) != -1 153 || cat_charset((char *)0, cs, type, putout) != -1 154 || cat_charset(char_set, 0, type, putout) != -1 155 ) 156 ; 157 } 158 159 if (putout) 160 putp (p); 161 ret = E_SUCCESS; 162 163 } else 164 ret = E_FAILURE; 165 166 Return: if (p) 167 Free (p); 168 if (q) 169 Free (q); 170 if (char_set_nm) 171 Free (char_set_nm); 172 return (ret); 173 } 174 175 /** 176 ** cat_charset() - DUMP CONTENT OF CHARACTER SET DEF'N FILE 177 **/ 178 179 static int 180 #if defined(__STDC__) 181 cat_charset ( 182 char * name, 183 int number, 184 char * type, 185 int putout 186 ) 187 #else 188 cat_charset (name, number, type, putout) 189 char *name; 190 int number, 191 putout; 192 char *type; 193 #endif 194 { 195 int fd; 196 197 char *p, 198 *parent, 199 *T, 200 buf[BUFSIZ]; 201 202 int n, 203 ret; 204 205 if (!name) 206 sprintf ((name = "63"), "%d", number); 207 208 if (!(parent = getenv("CHARSETDIR"))) 209 parent = CHARSETDIR; 210 211 (T = "x")[0] = type[0]; 212 p = makepath(parent, T, type, name, (char *)0); 213 if (!p) 214 return (-1); 215 if ((fd = open_locked(p, "r", 0)) < 0) { 216 Free (p); 217 return (-1); 218 } 219 Free (p); 220 221 if (putout) { 222 223 errno = 0; 224 while ((n = read(fd, buf, BUFSIZ))) 225 fwrite (buf, 1, n, stdout); 226 227 if (errno != 0) 228 ret = -1; 229 else 230 ret = 0; 231 232 } 233 close(fd); 234 return (ret); 235 } 236