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
31 #pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.11 */
32 /* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */
33
34 #include "stdio.h"
35 #include "string.h"
36 #include "errno.h"
37 #include "stdlib.h"
38
39 #include "lp.h"
40 #include "lp.set.h"
41
42 #if defined(__STDC__)
43 char * tparm ( char * , ... );
44 #else
45 extern char *tparm();
46 #endif
47
48 #if defined(__STDC__)
49 static int cat_charset ( char *, int , char * , int );
50 #else
51 static int cat_charset();
52 #endif
53
54 /**
55 ** set_charset()
56 **/
57
58 int
59 #if defined(__STDC__)
set_charset(char * char_set,int putout,char * type)60 set_charset (
61 char * char_set,
62 int putout,
63 char * type
64 )
65 #else
66 set_charset (char_set, putout, type)
67 char *char_set;
68 int putout;
69 char *type;
70 #endif
71 {
72 int cs,
73 ret;
74
75 char *rest,
76 *char_set_nm,
77 *char_set_names,
78 *select_char_set,
79 *start_char_set_def,
80 *p,
81 *q;
82
83 unsigned short has_print_wheel;
84
85
86 tidbit ((char *)0, "daisy", &has_print_wheel);
87 if (has_print_wheel)
88 return (E_SUCCESS);
89
90 tidbit ((char *)0, "csnm", &char_set_names);
91 if (
92 strlen(char_set) > (size_t) 2
93 && char_set[0] == 'c'
94 && char_set[1] == 's'
95 && char_set[2]
96 && 0 <= (cs = strtol(char_set + 2, &rest, 10)) && cs <= 63
97 && !*rest
98 )
99 char_set_nm = tparm(char_set_names, cs);
100
101 else {
102 for (cs = 0; cs <= 63; cs++)
103 if (
104 (char_set_nm = tparm(char_set_names, cs))
105 && *char_set_nm
106 && STREQU(char_set_nm, char_set)
107 )
108 break;
109 if (cs > 63)
110 return (E_FAILURE);
111 }
112
113 if (cs == 0)
114 return (E_SUCCESS);
115
116 if (char_set_nm)
117 if (!(char_set_nm = Strdup(char_set_nm))) {
118 errno = ENOMEM;
119 ret = E_FAILURE;
120 goto Return;
121 }
122
123 tidbit ((char *)0, "scs", &select_char_set);
124 p = q = 0;
125 if ((p = tparm(select_char_set, cs)) && *p && (p = Strdup(p))) {
126
127 tidbit ((char *)0, "scsd", &start_char_set_def);
128 if ((q = tparm(start_char_set_def, cs)) && *q) {
129 /*
130 * The ``start char. set def'n.'' capability
131 * is defined and set, so assume we MUST
132 * download the character set before using it.
133 */
134 if (
135 OKAY(char_set_nm)
136 && cat_charset(char_set_nm, 0, type, putout) != -1
137 || cat_charset((char *)0, cs, type, putout) != -1
138 || cat_charset(char_set, 0, type, putout) != -1
139 )
140 ;
141 else {
142 ret = E_FAILURE;
143 goto Return;
144 }
145
146 } else {
147 /*
148 * The ``start char. set def'n.'' capability
149 * is not defined and or set, so assume we MAY
150 * download the character set before using it.
151 */
152 if (
153 OKAY(char_set_nm)
154 && cat_charset(char_set_nm, 0, type, putout) != -1
155 || cat_charset((char *)0, cs, type, putout) != -1
156 || cat_charset(char_set, 0, type, putout) != -1
157 )
158 ;
159 }
160
161 if (putout)
162 putp (p);
163 ret = E_SUCCESS;
164
165 } else
166 ret = E_FAILURE;
167
168 Return: if (p)
169 Free (p);
170 if (q)
171 Free (q);
172 if (char_set_nm)
173 Free (char_set_nm);
174 return (ret);
175 }
176
177 /**
178 ** cat_charset() - DUMP CONTENT OF CHARACTER SET DEF'N FILE
179 **/
180
181 static int
182 #if defined(__STDC__)
cat_charset(char * name,int number,char * type,int putout)183 cat_charset (
184 char * name,
185 int number,
186 char * type,
187 int putout
188 )
189 #else
190 cat_charset (name, number, type, putout)
191 char *name;
192 int number,
193 putout;
194 char *type;
195 #endif
196 {
197 int fd;
198
199 char *p,
200 *parent,
201 *T,
202 buf[BUFSIZ];
203
204 int n,
205 ret;
206
207 if (!name)
208 sprintf ((name = "63"), "%d", number);
209
210 if (!(parent = getenv("CHARSETDIR")))
211 parent = CHARSETDIR;
212
213 (T = "x")[0] = type[0];
214 p = makepath(parent, T, type, name, (char *)0);
215 if (!p)
216 return (-1);
217 if ((fd = open_locked(p, "r", 0)) < 0) {
218 Free (p);
219 return (-1);
220 }
221 Free (p);
222
223 if (putout) {
224
225 errno = 0;
226 while ((n = read(fd, buf, BUFSIZ)))
227 fwrite (buf, 1, n, stdout);
228
229 if (errno != 0)
230 ret = -1;
231 else
232 ret = 0;
233
234 }
235 close(fd);
236 return (ret);
237 }
238