xref: /titanic_52/usr/src/cmd/lp/cmd/lpadmin/fromclass.c (revision 7c478bd95313f5f23a4c958a745db2134aa03244)
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 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
23 /*	  All Rights Reserved  	*/
24 
25 
26 #ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.5	*/
27 
28 #include "stdio.h"
29 #include "errno.h"
30 
31 #include "lp.h"
32 #include "class.h"
33 #include "msgs.h"
34 
35 #define	WHO_AM_I	I_AM_LPADMIN
36 #include "oam.h"
37 
38 #include "lpadmin.h"
39 
40 
41 static void		_fromclass();
42 
43 /**
44  ** fromclass() - REMOVE PRINTER FROM A CLASS
45  **/
46 
47 void			fromclass (printer, class)
48 	char			*printer,
49 				*class;
50 {
51 	CLASS			*pc;
52 
53 	if (!(pc = getclass(class))) {
54 		LP_ERRMSG1 (ERROR, E_LP_NOCLASS, class);
55 		done (1);
56 	}
57 
58 	if (!searchlist(printer, pc->members)) {
59 		LP_ERRMSG2 (ERROR, E_ADM_NOTMEM, printer, class);
60 		done (1);
61 	}
62 
63 	_fromclass (printer, class, pc);
64 
65 	return;
66 }
67 
68 /**
69  ** fromallclasses() - DELETE A PRINTER FROM ALL CLASSES
70  **/
71 
72 void			fromallclasses (printer)
73 	char			*printer;
74 {
75 	register CLASS		*pc;
76 
77 
78 	while ((pc = getclass(NAME_ALL)))
79 		if (searchlist(printer, pc->members))
80 			_fromclass (printer, pc->name, pc);
81 
82 	if (errno != ENOENT) {
83 		LP_ERRMSG1 (ERROR, E_ADM_GETCLASSES, PERROR);
84 		done (1);
85 	}
86 
87 	return;
88 }
89 
90 /**
91  ** _fromclass() - REALLY DELETE PRINTER FROM CLASS
92  **/
93 
94 static void		_fromclass (printer, class, pc)
95 	char			*printer,
96 				*class;
97 	CLASS			*pc;
98 {
99 	int			rc;
100 
101 
102 	if (dellist(&pc->members, printer) == -1) {
103 		LP_ERRMSG (ERROR, E_LP_MALLOC);
104 		done(1);
105 	}
106 
107  	if (!pc->members)
108 		rmdest (1, class);
109 
110 	else {
111 		BEGIN_CRITICAL
112 			if (putclass(class, pc) == -1) {
113 				LP_ERRMSG2 (
114 					ERROR,
115 					E_LP_PUTCLASS,
116 					class,
117 					PERROR
118 				);
119 				done(1);
120 			}
121 		END_CRITICAL
122 
123 		send_message(S_LOAD_CLASS, class, "", "");
124 		rc = output(R_LOAD_CLASS);
125 
126 		switch(rc) {
127 		case MOK:
128 			break;
129 
130 		case MNODEST:
131 		case MERRDEST:
132 			LP_ERRMSG (ERROR, E_ADM_ERRDEST);
133 			done (1);
134 			/*NOTREACHED*/
135 
136 		case MNOSPACE:
137 			LP_ERRMSG (WARNING, E_ADM_NOCSPACE);
138 			break;
139 
140 		case MNOPERM:	/* taken care of up front */
141 		default:
142 			LP_ERRMSG1 (ERROR, E_LP_BADSTATUS, rc);
143 			done (1);
144 			/*NOTREACHED*/
145 		}
146 
147 	}
148 	return;
149 }
150