xref: /illumos-gate/usr/src/cmd/lp/cmd/lpadmin/rmdest.c (revision 581cede61ac9c14d8d4ea452562a567189eead78)
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 /*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
22 /*	  All Rights Reserved  	*/
23 
24 
25 #pragma ident	"%Z%%M%	%I%	%E% SMI"
26 
27 /*
28  * Copyright 2006 Sun Microsystems, Inc.  All rights reserved.
29  * Use is subject to license terms.
30  */
31 
32 #include "stdio.h"
33 #include "ctype.h"
34 #include "errno.h"
35 #include "sys/types.h"
36 
37 #include "lp.h"
38 #include "msgs.h"
39 #include "access.h"
40 #include "class.h"
41 #include "printers.h"
42 
43 #define	WHO_AM_I	I_AM_LPADMIN
44 #include "oam.h"
45 
46 #include "lpadmin.h"
47 
48 extern void		fromallclasses();
49 
50 /**
51  ** rmdest() - REMOVE DESTINATION
52  **/
53 
54 void			rmdest (aclass, dest)
55 	int			aclass;
56 	char			*dest;
57 {
58 	int			rc,
59 				type;
60 
61 
62 	if (!aclass)
63 		type = S_UNLOAD_PRINTER;
64 	else
65 		type = S_UNLOAD_CLASS;
66 
67 
68 	send_message(type, dest, "", "");
69 	rc = output(type + 1);
70 
71 	switch (rc) {
72 	case MOK:
73 	case MNODEST:
74 		BEGIN_CRITICAL
75 			if (
76 				aclass && delclass(dest) == -1
77 			     || !aclass && delprinter(dest) == -1
78 			) {
79 				if (rc == MNODEST && errno == ENOENT)
80 					LP_ERRMSG1 (
81 						ERROR,
82 						E_ADM_NODEST,
83 						dest
84 					);
85 
86 				else
87 					LP_ERRMSG2 (
88 						ERROR,
89 (rc == MNODEST? (aclass? E_LP_DELCLASS : E_LP_DELPRINTER) : E_ADM_DELSTRANGE),
90 						dest,
91 						PERROR
92 					);
93 
94 				done(1);
95 			}
96 		END_CRITICAL
97 
98 		/*
99 		 * S_UNLOAD_PRINTER tells the Spooler to remove
100 		 * the printer from all classes (in its internal
101 		 * tables, of course). So it's okay for us to do
102 		 * the same with the disk copies.
103 		 */
104 		if (!aclass)
105 			fromallclasses (dest);
106 
107 		if (STREQU(getdflt(), dest))
108 			newdflt (NAME_NONE);
109 
110 		if (system_labeled) {
111 			update_dev_dbs(dest, NULL, "REMOVE");
112 		}
113 		break;
114 
115 	case MBUSY:
116 		LP_ERRMSG1 (ERROR, E_ADM_DESTBUSY, dest);
117 		done (1);
118 
119 	case MNOPERM:	/* taken care of up front */
120 	default:
121 		LP_ERRMSG1 (ERROR, E_LP_BADSTATUS, rc);
122 		done (1);
123 		break;
124 
125 	}
126 	return;
127 }
128