xref: /onnv-gate/usr/src/cmd/lp/lib/printers/printwheels.c (revision 0:68f95e015346)
1*0Sstevel@tonic-gate /*
2*0Sstevel@tonic-gate  * CDDL HEADER START
3*0Sstevel@tonic-gate  *
4*0Sstevel@tonic-gate  * The contents of this file are subject to the terms of the
5*0Sstevel@tonic-gate  * Common Development and Distribution License, Version 1.0 only
6*0Sstevel@tonic-gate  * (the "License").  You may not use this file except in compliance
7*0Sstevel@tonic-gate  * with the License.
8*0Sstevel@tonic-gate  *
9*0Sstevel@tonic-gate  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
10*0Sstevel@tonic-gate  * or http://www.opensolaris.org/os/licensing.
11*0Sstevel@tonic-gate  * See the License for the specific language governing permissions
12*0Sstevel@tonic-gate  * and limitations under the License.
13*0Sstevel@tonic-gate  *
14*0Sstevel@tonic-gate  * When distributing Covered Code, include this CDDL HEADER in each
15*0Sstevel@tonic-gate  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
16*0Sstevel@tonic-gate  * If applicable, add the following below this CDDL HEADER, with the
17*0Sstevel@tonic-gate  * fields enclosed by brackets "[]" replaced with your own identifying
18*0Sstevel@tonic-gate  * information: Portions Copyright [yyyy] [name of copyright owner]
19*0Sstevel@tonic-gate  *
20*0Sstevel@tonic-gate  * CDDL HEADER END
21*0Sstevel@tonic-gate  */
22*0Sstevel@tonic-gate /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23*0Sstevel@tonic-gate /*	  All Rights Reserved  	*/
24*0Sstevel@tonic-gate 
25*0Sstevel@tonic-gate 
26*0Sstevel@tonic-gate #ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.13	*/
27*0Sstevel@tonic-gate /* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */
28*0Sstevel@tonic-gate 
29*0Sstevel@tonic-gate #include "string.h"
30*0Sstevel@tonic-gate #include "errno.h"
31*0Sstevel@tonic-gate #include "sys/types.h"
32*0Sstevel@tonic-gate #include "stdlib.h"
33*0Sstevel@tonic-gate 
34*0Sstevel@tonic-gate #include "lp.h"
35*0Sstevel@tonic-gate #include "printers.h"
36*0Sstevel@tonic-gate 
37*0Sstevel@tonic-gate /**
38*0Sstevel@tonic-gate  ** getpwheel() - GET PRINT WHEEL INFO FROM DISK
39*0Sstevel@tonic-gate  **/
40*0Sstevel@tonic-gate 
41*0Sstevel@tonic-gate PWHEEL *
42*0Sstevel@tonic-gate #if	defined(__STDC__)
43*0Sstevel@tonic-gate getpwheel (
44*0Sstevel@tonic-gate 	char *			name
45*0Sstevel@tonic-gate )
46*0Sstevel@tonic-gate #else
47*0Sstevel@tonic-gate getpwheel (name)
48*0Sstevel@tonic-gate 	char			*name;
49*0Sstevel@tonic-gate #endif
50*0Sstevel@tonic-gate {
51*0Sstevel@tonic-gate 	static long		lastdir		= -1;
52*0Sstevel@tonic-gate 
53*0Sstevel@tonic-gate 	static PWHEEL		pwheel;
54*0Sstevel@tonic-gate 
55*0Sstevel@tonic-gate 	register FALERT		*pa;
56*0Sstevel@tonic-gate 
57*0Sstevel@tonic-gate 
58*0Sstevel@tonic-gate 	if (!name || !*name) {
59*0Sstevel@tonic-gate 		errno = EINVAL;
60*0Sstevel@tonic-gate 		return (0);
61*0Sstevel@tonic-gate 	}
62*0Sstevel@tonic-gate 
63*0Sstevel@tonic-gate 	/*
64*0Sstevel@tonic-gate 	 * Getting ``all''? If so, jump into the directory
65*0Sstevel@tonic-gate 	 * wherever we left off.
66*0Sstevel@tonic-gate 	 */
67*0Sstevel@tonic-gate 	if (STREQU(NAME_ALL, name)) {
68*0Sstevel@tonic-gate 		if (!(name = next_dir(Lp_A_PrintWheels, &lastdir)))
69*0Sstevel@tonic-gate 			return (0);
70*0Sstevel@tonic-gate 	} else
71*0Sstevel@tonic-gate 		lastdir = -1;
72*0Sstevel@tonic-gate 
73*0Sstevel@tonic-gate 	/*
74*0Sstevel@tonic-gate 	 * Get the information for the alert.
75*0Sstevel@tonic-gate 	 */
76*0Sstevel@tonic-gate 	if (!(pa = getalert(Lp_A_PrintWheels, name))) {
77*0Sstevel@tonic-gate 
78*0Sstevel@tonic-gate 		/*
79*0Sstevel@tonic-gate 		 * Unless the world has turned weird, we shouldn't
80*0Sstevel@tonic-gate 		 * get ENOTDIR if we're doing the ``all'' case--because
81*0Sstevel@tonic-gate 		 * getting here in the all case meant the printwheel
82*0Sstevel@tonic-gate 		 * directory exists, but ENOTDIR means it doesn't!
83*0Sstevel@tonic-gate 		 */
84*0Sstevel@tonic-gate 		if (errno == ENOTDIR)
85*0Sstevel@tonic-gate 			errno = ENOENT; /* printwheel doesn't exist */
86*0Sstevel@tonic-gate 
87*0Sstevel@tonic-gate 		return (0);
88*0Sstevel@tonic-gate 	}
89*0Sstevel@tonic-gate 
90*0Sstevel@tonic-gate 	pwheel.alert = *pa;
91*0Sstevel@tonic-gate 	pwheel.name = Strdup(name);
92*0Sstevel@tonic-gate 
93*0Sstevel@tonic-gate 	return (&pwheel);
94*0Sstevel@tonic-gate }
95*0Sstevel@tonic-gate 
96*0Sstevel@tonic-gate /**
97*0Sstevel@tonic-gate  ** putpwheel() - PUT PRINT WHEEL INFO TO DISK
98*0Sstevel@tonic-gate  **/
99*0Sstevel@tonic-gate 
100*0Sstevel@tonic-gate int
101*0Sstevel@tonic-gate #if	defined(__STDC__)
102*0Sstevel@tonic-gate putpwheel (
103*0Sstevel@tonic-gate 	char *			name,
104*0Sstevel@tonic-gate 	PWHEEL *		pwheelp
105*0Sstevel@tonic-gate )
106*0Sstevel@tonic-gate #else
107*0Sstevel@tonic-gate putpwheel (name, pwheelp)
108*0Sstevel@tonic-gate 	char			*name;
109*0Sstevel@tonic-gate 	PWHEEL			*pwheelp;
110*0Sstevel@tonic-gate #endif
111*0Sstevel@tonic-gate {
112*0Sstevel@tonic-gate 	register char		*path;
113*0Sstevel@tonic-gate 
114*0Sstevel@tonic-gate 	struct stat		statbuf;
115*0Sstevel@tonic-gate 
116*0Sstevel@tonic-gate 
117*0Sstevel@tonic-gate 	if (!name || !*name) {
118*0Sstevel@tonic-gate 		errno = EINVAL;
119*0Sstevel@tonic-gate 		return (-1);
120*0Sstevel@tonic-gate 	}
121*0Sstevel@tonic-gate 
122*0Sstevel@tonic-gate 	if (STREQU(name, NAME_ALL)) {
123*0Sstevel@tonic-gate 		errno = ENOENT;
124*0Sstevel@tonic-gate 		return (-1);
125*0Sstevel@tonic-gate 	}
126*0Sstevel@tonic-gate 
127*0Sstevel@tonic-gate 	/*
128*0Sstevel@tonic-gate 	 * Create the parent directory for this printer
129*0Sstevel@tonic-gate 	 * if it doesn't yet exist.
130*0Sstevel@tonic-gate 	 */
131*0Sstevel@tonic-gate 	if (!(path = makepath(Lp_A_PrintWheels, name, (char *)0)))
132*0Sstevel@tonic-gate 		return (-1);
133*0Sstevel@tonic-gate 	if (Stat(path, &statbuf) == 0) {
134*0Sstevel@tonic-gate 		if (!(statbuf.st_mode & S_IFDIR)) {
135*0Sstevel@tonic-gate 			Free (path);
136*0Sstevel@tonic-gate 			errno = ENOTDIR;
137*0Sstevel@tonic-gate 			return (-1);
138*0Sstevel@tonic-gate 		}
139*0Sstevel@tonic-gate 	} else if (errno != ENOENT || mkdir_lpdir(path, MODE_DIR) == -1) {
140*0Sstevel@tonic-gate 		Free (path);
141*0Sstevel@tonic-gate 		return (-1);
142*0Sstevel@tonic-gate 	}
143*0Sstevel@tonic-gate 	Free (path);
144*0Sstevel@tonic-gate 
145*0Sstevel@tonic-gate 	/*
146*0Sstevel@tonic-gate 	 * Now write out the alert condition.
147*0Sstevel@tonic-gate 	 */
148*0Sstevel@tonic-gate 	if (putalert(Lp_A_PrintWheels, name, &(pwheelp->alert)) == -1)
149*0Sstevel@tonic-gate 		return (-1);
150*0Sstevel@tonic-gate 
151*0Sstevel@tonic-gate 	return (0);
152*0Sstevel@tonic-gate }
153*0Sstevel@tonic-gate 
154*0Sstevel@tonic-gate /**
155*0Sstevel@tonic-gate  ** delpwheel() - DELETE PRINT WHEEL INFO FROM DISK
156*0Sstevel@tonic-gate  **/
157*0Sstevel@tonic-gate 
158*0Sstevel@tonic-gate #if	defined(__STDC__)
159*0Sstevel@tonic-gate static int		_delpwheel ( char * );
160*0Sstevel@tonic-gate #else
161*0Sstevel@tonic-gate static int		_delpwheel();
162*0Sstevel@tonic-gate #endif
163*0Sstevel@tonic-gate 
164*0Sstevel@tonic-gate int
165*0Sstevel@tonic-gate #if	defined(__STDC__)
166*0Sstevel@tonic-gate delpwheel (
167*0Sstevel@tonic-gate 	char *			name
168*0Sstevel@tonic-gate )
169*0Sstevel@tonic-gate #else
170*0Sstevel@tonic-gate delpwheel (name)
171*0Sstevel@tonic-gate 	char			*name;
172*0Sstevel@tonic-gate #endif
173*0Sstevel@tonic-gate {
174*0Sstevel@tonic-gate 	long			lastdir;
175*0Sstevel@tonic-gate 
176*0Sstevel@tonic-gate 
177*0Sstevel@tonic-gate 	if (!name || !*name) {
178*0Sstevel@tonic-gate 		errno = EINVAL;
179*0Sstevel@tonic-gate 		return (-1);
180*0Sstevel@tonic-gate 	}
181*0Sstevel@tonic-gate 
182*0Sstevel@tonic-gate 	if (STREQU(NAME_ALL, name)) {
183*0Sstevel@tonic-gate 		lastdir = -1;
184*0Sstevel@tonic-gate 		while ((name = next_dir(Lp_A_PrintWheels, &lastdir)))
185*0Sstevel@tonic-gate 			if (_delpwheel(name) == -1)
186*0Sstevel@tonic-gate 				return (-1);
187*0Sstevel@tonic-gate 		return (0);
188*0Sstevel@tonic-gate 	} else
189*0Sstevel@tonic-gate 		return (_delpwheel(name));
190*0Sstevel@tonic-gate }
191*0Sstevel@tonic-gate 
192*0Sstevel@tonic-gate /**
193*0Sstevel@tonic-gate  ** _delpwheel()
194*0Sstevel@tonic-gate  **/
195*0Sstevel@tonic-gate 
196*0Sstevel@tonic-gate static int
197*0Sstevel@tonic-gate #if	defined(__STDC__)
198*0Sstevel@tonic-gate _delpwheel (
199*0Sstevel@tonic-gate 	char *			name
200*0Sstevel@tonic-gate )
201*0Sstevel@tonic-gate #else
202*0Sstevel@tonic-gate _delpwheel (name)
203*0Sstevel@tonic-gate 	char			*name;
204*0Sstevel@tonic-gate #endif
205*0Sstevel@tonic-gate {
206*0Sstevel@tonic-gate 	register char		*path;
207*0Sstevel@tonic-gate 
208*0Sstevel@tonic-gate 	if (delalert(Lp_A_PrintWheels, name) == -1)
209*0Sstevel@tonic-gate 		return (-1);
210*0Sstevel@tonic-gate 	if (!(path = makepath(Lp_A_PrintWheels, name, (char *)0)))
211*0Sstevel@tonic-gate 		return (-1);
212*0Sstevel@tonic-gate 	if (Rmdir(path)) {
213*0Sstevel@tonic-gate 		Free (path);
214*0Sstevel@tonic-gate 		return (-1);
215*0Sstevel@tonic-gate 	}
216*0Sstevel@tonic-gate 	Free (path);
217*0Sstevel@tonic-gate 	return (0);
218*0Sstevel@tonic-gate }
219*0Sstevel@tonic-gate 
220*0Sstevel@tonic-gate /**
221*0Sstevel@tonic-gate  **  freepwheel() - FREE MEMORY ALLOCATED FOR PRINT WHEEL STRUCTURE
222*0Sstevel@tonic-gate  **/
223*0Sstevel@tonic-gate 
224*0Sstevel@tonic-gate void
225*0Sstevel@tonic-gate #if	defined(__STDC__)
226*0Sstevel@tonic-gate freepwheel (
227*0Sstevel@tonic-gate 	PWHEEL *		ppw
228*0Sstevel@tonic-gate )
229*0Sstevel@tonic-gate #else
230*0Sstevel@tonic-gate freepwheel (ppw)
231*0Sstevel@tonic-gate 	PWHEEL			*ppw;
232*0Sstevel@tonic-gate #endif
233*0Sstevel@tonic-gate {
234*0Sstevel@tonic-gate 	if (!ppw)
235*0Sstevel@tonic-gate 		return;
236*0Sstevel@tonic-gate 	if (ppw->name)
237*0Sstevel@tonic-gate 		Free (ppw->name);
238*0Sstevel@tonic-gate 	if (ppw->alert.shcmd)
239*0Sstevel@tonic-gate 		Free (ppw->alert.shcmd);
240*0Sstevel@tonic-gate 	return;
241*0Sstevel@tonic-gate }
242