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 /*	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 "string.h"
33 #include "errno.h"
34 #include "sys/types.h"
35 #include "stdlib.h"
36 
37 #include "lp.h"
38 #include "printers.h"
39 
40 /**
41  ** getpwheel() - GET PRINT WHEEL INFO FROM DISK
42  **/
43 
44 PWHEEL *
45 #if	defined(__STDC__)
getpwheel(char * name)46 getpwheel (
47 	char *			name
48 )
49 #else
50 getpwheel (name)
51 	char			*name;
52 #endif
53 {
54 	static long		lastdir		= -1;
55 
56 	PWHEEL		*pwp;
57 
58 	register FALERT		*pa;
59 
60 
61 	if (!name || !*name) {
62 		errno = EINVAL;
63 		return (0);
64 	}
65 
66 	/*
67 	 * Getting ``all''? If so, jump into the directory
68 	 * wherever we left off.
69 	 */
70 	if (STREQU(NAME_ALL, name)) {
71 		if (!(name = next_dir(Lp_A_PrintWheels, &lastdir)))
72 			return (0);
73 	} else
74 		lastdir = -1;
75 
76 	/*
77 	 * Get the information for the alert.
78 	 */
79 	if (!(pa = getalert(Lp_A_PrintWheels, name))) {
80 
81 		/*
82 		 * Unless the world has turned weird, we shouldn't
83 		 * get ENOTDIR if we're doing the ``all'' case--because
84 		 * getting here in the all case meant the printwheel
85 		 * directory exists, but ENOTDIR means it doesn't!
86 		 */
87 		if (errno == ENOTDIR)
88 			errno = ENOENT; /* printwheel doesn't exist */
89 
90 		return (0);
91 	}
92 
93 	pwp = calloc(1, sizeof (*pwp));
94 	pwp->alert = *pa;
95 	pwp->name = Strdup(name);
96 
97 	return (pwp);
98 }
99 
100 /**
101  ** putpwheel() - PUT PRINT WHEEL INFO TO DISK
102  **/
103 
104 int
105 #if	defined(__STDC__)
putpwheel(char * name,PWHEEL * pwheelp)106 putpwheel (
107 	char *			name,
108 	PWHEEL *		pwheelp
109 )
110 #else
111 putpwheel (name, pwheelp)
112 	char			*name;
113 	PWHEEL			*pwheelp;
114 #endif
115 {
116 	register char		*path;
117 
118 	struct stat		statbuf;
119 
120 
121 	if (!name || !*name) {
122 		errno = EINVAL;
123 		return (-1);
124 	}
125 
126 	if (STREQU(name, NAME_ALL)) {
127 		errno = ENOENT;
128 		return (-1);
129 	}
130 
131 	/*
132 	 * Create the parent directory for this printer
133 	 * if it doesn't yet exist.
134 	 */
135 	if (!(path = makepath(Lp_A_PrintWheels, name, (char *)0)))
136 		return (-1);
137 	if (Stat(path, &statbuf) == 0) {
138 		if (!S_ISDIR(statbuf.st_mode)) {
139 			Free (path);
140 			errno = ENOTDIR;
141 			return (-1);
142 		}
143 	} else if (errno != ENOENT || mkdir_lpdir(path, MODE_DIR) == -1) {
144 		Free (path);
145 		return (-1);
146 	}
147 	Free (path);
148 
149 	/*
150 	 * Now write out the alert condition.
151 	 */
152 	if (putalert(Lp_A_PrintWheels, name, &(pwheelp->alert)) == -1)
153 		return (-1);
154 
155 	return (0);
156 }
157 
158 /**
159  ** delpwheel() - DELETE PRINT WHEEL INFO FROM DISK
160  **/
161 
162 #if	defined(__STDC__)
163 static int		_delpwheel ( char * );
164 #else
165 static int		_delpwheel();
166 #endif
167 
168 int
169 #if	defined(__STDC__)
delpwheel(char * name)170 delpwheel (
171 	char *			name
172 )
173 #else
174 delpwheel (name)
175 	char			*name;
176 #endif
177 {
178 	long			lastdir;
179 
180 
181 	if (!name || !*name) {
182 		errno = EINVAL;
183 		return (-1);
184 	}
185 
186 	if (STREQU(NAME_ALL, name)) {
187 		lastdir = -1;
188 		while ((name = next_dir(Lp_A_PrintWheels, &lastdir)))
189 			if (_delpwheel(name) == -1)
190 				return (-1);
191 		return (0);
192 	} else
193 		return (_delpwheel(name));
194 }
195 
196 /**
197  ** _delpwheel()
198  **/
199 
200 static int
201 #if	defined(__STDC__)
_delpwheel(char * name)202 _delpwheel (
203 	char *			name
204 )
205 #else
206 _delpwheel (name)
207 	char			*name;
208 #endif
209 {
210 	register char		*path;
211 
212 	if (delalert(Lp_A_PrintWheels, name) == -1)
213 		return (-1);
214 	if (!(path = makepath(Lp_A_PrintWheels, name, (char *)0)))
215 		return (-1);
216 	if (Rmdir(path)) {
217 		Free (path);
218 		return (-1);
219 	}
220 	Free (path);
221 	return (0);
222 }
223 
224 /**
225  **  freepwheel() - FREE MEMORY ALLOCATED FOR PRINT WHEEL STRUCTURE
226  **/
227 
228 void
229 #if	defined(__STDC__)
freepwheel(PWHEEL * ppw)230 freepwheel (
231 	PWHEEL *		ppw
232 )
233 #else
234 freepwheel (ppw)
235 	PWHEEL			*ppw;
236 #endif
237 {
238 	if (!ppw)
239 		return;
240 	if (ppw->name)
241 		Free (ppw->name);
242 	if (ppw->alert.shcmd)
243 		Free (ppw->alert.shcmd);
244 	Free (ppw);
245 
246 	return;
247 }
248