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 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 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 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 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 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 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 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 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 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 ** 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