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 1993 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.8 */
32 /* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */
33
34 #include "errno.h"
35 #include "string.h"
36 #include "stdlib.h"
37
38 #include "lp.h"
39 #include "access.h"
40
41 static int chgaccess ( int , char ** , char * , char * , char * );
42 static char ** empty_list ( void );
43
44 /**
45 ** deny_user_form() - DENY USER ACCESS TO FORM
46 **/
47
48 int
deny_user_form(char ** user_list,char * form)49 deny_user_form(char **user_list, char *form)
50 {
51 return (chgaccess(0, user_list, form, Lp_A_Forms, ""));
52 }
53
54 /**
55 ** allow_user_form() - ALLOW USER ACCESS TO FORM
56 **/
57
58 int
allow_user_form(char ** user_list,char * form)59 allow_user_form(char **user_list, char *form)
60 {
61 return (chgaccess(1, user_list, form, Lp_A_Forms, ""));
62 }
63
64 /**
65 ** deny_user_printer() - DENY USER ACCESS TO PRINTER
66 **/
67
68 int
deny_user_printer(char ** user_list,char * printer)69 deny_user_printer(char **user_list, char *printer)
70 {
71 return (chgaccess(0, user_list, printer, Lp_A_Printers, UACCESSPREFIX));
72 }
73
74 /**
75 ** allow_user_printer() - ALLOW USER ACCESS TO PRINTER
76 **/
77
78 int
allow_user_printer(char ** user_list,char * printer)79 allow_user_printer(char **user_list, char *printer)
80 {
81 return (chgaccess(1, user_list, printer, Lp_A_Printers, UACCESSPREFIX));
82 }
83
84 /**
85 ** deny_form_printer() - DENY FORM USE ON PRINTER
86 **/
87
88 int
deny_form_printer(char ** form_list,char * printer)89 deny_form_printer(char **form_list, char *printer)
90 {
91 return (chgaccess(0, form_list, printer, Lp_A_Printers, FACCESSPREFIX));
92 }
93
94 /**
95 ** allow_form_printer() - ALLOW FORM USE ON PRINTER
96 **/
97
98 int
allow_form_printer(char ** form_list,char * printer)99 allow_form_printer(char **form_list, char *printer)
100 {
101 return (chgaccess(1, form_list, printer, Lp_A_Printers, FACCESSPREFIX));
102 }
103
104 /**
105 ** remove_paper_from_printer() - DENY FORM USE ON PRINTER
106 **/
107
108 int
remove_paper_from_printer(char ** form_list,char * printer)109 remove_paper_from_printer(char **form_list, char *printer)
110 {
111 return (chgaccess(0, form_list, printer, Lp_A_Printers, PACCESSPREFIX));
112 }
113
114 /**
115 ** add_paper_to_printer() - ALLOW FORM USE ON PRINTER
116 **/
117
118 int
add_paper_to_printer(char ** form_list,char * printer)119 add_paper_to_printer(char **form_list, char *printer)
120 {
121 return (chgaccess(1, form_list, printer, Lp_A_Printers, PACCESSPREFIX));
122 }
123
124 /**
125 ** chgaccess() - UPDATE ALLOW/DENY ACCESS OF ITEM TO RESOURCE
126 **/
127
128 static int
chgaccess(int isallow,char ** list,char * name,char * dir,char * prefix)129 chgaccess(int isallow, char **list, char *name, char *dir, char *prefix)
130 {
131 register char ***padd_list,
132 ***prem_list,
133 **pl;
134
135 char **allow_list,
136 **deny_list;
137
138 if (loadaccess(dir, name, prefix, &allow_list, &deny_list) == -1)
139 return (-1);
140
141 if (isallow) {
142 padd_list = &allow_list;
143 prem_list = &deny_list;
144 } else {
145 padd_list = &deny_list;
146 prem_list = &allow_list;
147 }
148
149 for (pl = list; *pl; pl++) {
150
151 /*
152 * Do the ``all'' and ``none'' cases explicitly,
153 * so that we can clean up the lists nicely.
154 */
155 if (STREQU(*pl, NAME_NONE)) {
156 isallow = !isallow;
157 goto AllCase;
158 }
159 if (
160 STREQU(*pl, NAME_ALL)
161 || STREQU(*pl, NAME_ANY)
162 || STREQU(*pl, ALL_BANG_ALL)
163 ) {
164 AllCase:
165 freelist (allow_list);
166 freelist (deny_list);
167 if (isallow) {
168 allow_list = 0;
169 deny_list = empty_list();
170 } else {
171 allow_list = 0;
172 deny_list = 0;
173 }
174 break;
175
176 } else {
177
178 /*
179 * For each regular item in the list,
180 * we add it to the ``add list'' and remove it
181 * from the ``remove list''. This is not
182 * efficient, especially if there are a lot of
183 * items in the caller's list; doing it the
184 * way we do, however, has the side effect
185 * of skipping duplicate names in the caller's
186 * list.
187 *
188 * Do a regular "addlist()"--the resulting
189 * list may have redundancies, but it will
190 * still be correct.
191 */
192 if (addlist(padd_list, *pl) == -1)
193 return (-1);
194 if (bang_dellist(prem_list, *pl) == -1)
195 return (-1);
196
197 }
198
199 }
200
201 return (dumpaccess(dir, name, prefix, &allow_list, &deny_list));
202 }
203
204 /**
205 ** empty_list() - CREATE AN EMPTY LIST
206 **/
207
208 static char **
empty_list(void)209 empty_list(void)
210 {
211 register char **empty;
212
213
214 if (!(empty = (char **)Malloc(sizeof(char *)))) {
215 errno = ENOMEM;
216 return (0);
217 }
218 *empty = 0;
219 return (empty);
220 }
221