17c478bdstevel@tonic-gate/*
27c478bdstevel@tonic-gate * CDDL HEADER START
37c478bdstevel@tonic-gate *
47c478bdstevel@tonic-gate * The contents of this file are subject to the terms of the
57c478bdstevel@tonic-gate * Common Development and Distribution License, Version 1.0 only
67c478bdstevel@tonic-gate * (the "License").  You may not use this file except in compliance
77c478bdstevel@tonic-gate * with the License.
87c478bdstevel@tonic-gate *
97c478bdstevel@tonic-gate * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
107c478bdstevel@tonic-gate * or http://www.opensolaris.org/os/licensing.
117c478bdstevel@tonic-gate * See the License for the specific language governing permissions
127c478bdstevel@tonic-gate * and limitations under the License.
137c478bdstevel@tonic-gate *
147c478bdstevel@tonic-gate * When distributing Covered Code, include this CDDL HEADER in each
157c478bdstevel@tonic-gate * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
167c478bdstevel@tonic-gate * If applicable, add the following below this CDDL HEADER, with the
177c478bdstevel@tonic-gate * fields enclosed by brackets "[]" replaced with your own identifying
187c478bdstevel@tonic-gate * information: Portions Copyright [yyyy] [name of copyright owner]
197c478bdstevel@tonic-gate *
207c478bdstevel@tonic-gate * CDDL HEADER END
217c478bdstevel@tonic-gate */
227c478bdstevel@tonic-gate/*
237c478bdstevel@tonic-gate * Copyright 1997 Sun Microsystems, Inc.  All rights reserved.
247c478bdstevel@tonic-gate * Use is subject to license terms.
257c478bdstevel@tonic-gate */
267c478bdstevel@tonic-gate
277c478bdstevel@tonic-gate/*	Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T	*/
287c478bdstevel@tonic-gate/*	  All Rights Reserved  	*/
297c478bdstevel@tonic-gate
307c478bdstevel@tonic-gate
317c478bdstevel@tonic-gate#pragma ident	"%Z%%M%	%I%	%E% SMI"	/* SVr4.0 1.9	*/
327c478bdstevel@tonic-gate/* EMACS_MODES: !fill, lnumb, !overwrite, !nodelete, !picture */
337c478bdstevel@tonic-gate
347c478bdstevel@tonic-gate#include "stdio.h"
357c478bdstevel@tonic-gate#include "errno.h"
367c478bdstevel@tonic-gate#include "string.h"
377c478bdstevel@tonic-gate#include "stdlib.h"
387c478bdstevel@tonic-gate
397c478bdstevel@tonic-gate#include "lp.h"
407c478bdstevel@tonic-gate#include "access.h"
417c478bdstevel@tonic-gate
427c478bdstevel@tonic-gatestatic char		**_loadaccess ( char * );
437c478bdstevel@tonic-gate
447c478bdstevel@tonic-gate/**
457c478bdstevel@tonic-gate ** load_userform_access() - LOAD ALLOW/DENY LISTS FOR USER+FORM
467c478bdstevel@tonic-gate **/
477c478bdstevel@tonic-gate
487c478bdstevel@tonic-gateint
497c478bdstevel@tonic-gateload_userform_access(char *form, char ***pallow, char ***pdeny)
507c478bdstevel@tonic-gate{
517c478bdstevel@tonic-gate	return (loadaccess(Lp_A_Forms, form, "", pallow, pdeny));
527c478bdstevel@tonic-gate}
537c478bdstevel@tonic-gate
547c478bdstevel@tonic-gate/**
557c478bdstevel@tonic-gate ** load_userprinter_access() - LOAD ALLOW/DENY LISTS FOR USER+PRINTER
567c478bdstevel@tonic-gate **/
577c478bdstevel@tonic-gate
587c478bdstevel@tonic-gateint
597c478bdstevel@tonic-gateload_userprinter_access(char *printer, char ***pallow, char ***pdeny)
607c478bdstevel@tonic-gate{
617c478bdstevel@tonic-gate	return (loadaccess(Lp_A_Printers, printer, UACCESSPREFIX, pallow,
627c478bdstevel@tonic-gate		pdeny));
637c478bdstevel@tonic-gate}
647c478bdstevel@tonic-gate
657c478bdstevel@tonic-gate/**
667c478bdstevel@tonic-gate ** load_formprinter_access() - LOAD ALLOW/DENY LISTS FOR FORM+PRINTER
677c478bdstevel@tonic-gate **/
687c478bdstevel@tonic-gate
697c478bdstevel@tonic-gateint
707c478bdstevel@tonic-gateload_formprinter_access(char *printer, char ***pallow, char ***pdeny)
717c478bdstevel@tonic-gate{
727c478bdstevel@tonic-gate	return (loadaccess(Lp_A_Printers, printer, FACCESSPREFIX, pallow,
737c478bdstevel@tonic-gate		pdeny));
747c478bdstevel@tonic-gate}
757c478bdstevel@tonic-gate
767c478bdstevel@tonic-gate/**
777c478bdstevel@tonic-gate ** load_paperprinter_access() - LOAD ALLOW/DENY LISTS FOR FORM+PRINTER
787c478bdstevel@tonic-gate **/
797c478bdstevel@tonic-gate
807c478bdstevel@tonic-gateint
817c478bdstevel@tonic-gateload_paperprinter_access(char *printer, char ***pallow, char ***pdeny)
827c478bdstevel@tonic-gate{
837c478bdstevel@tonic-gate	return (loadaccess(Lp_A_Printers, printer, PACCESSPREFIX, pallow,
847c478bdstevel@tonic-gate		pdeny));
857c478bdstevel@tonic-gate}
867c478bdstevel@tonic-gate
877c478bdstevel@tonic-gate/**
887c478bdstevel@tonic-gate ** loadaccess() - LOAD ALLOW OR DENY LISTS
897c478bdstevel@tonic-gate **/
907c478bdstevel@tonic-gate
917c478bdstevel@tonic-gateint
927c478bdstevel@tonic-gateloadaccess(char *dir, char *name, char *prefix, char ***pallow, char ***pdeny)
937c478bdstevel@tonic-gate{
947c478bdstevel@tonic-gate	register char		*allow_file	= 0,
957c478bdstevel@tonic-gate				*deny_file	= 0;
967c478bdstevel@tonic-gate
977c478bdstevel@tonic-gate	int			ret;
987c478bdstevel@tonic-gate
997c478bdstevel@tonic-gate	if (
1007c478bdstevel@tonic-gate		!(allow_file = getaccessfile(dir, name, prefix, ALLOWFILE))
1017c478bdstevel@tonic-gate	     || !(*pallow = _loadaccess(allow_file)) && errno != ENOENT
1027c478bdstevel@tonic-gate	     || !(deny_file = getaccessfile(dir, name, prefix, DENYFILE))
1037c478bdstevel@tonic-gate	     || !(*pdeny = _loadaccess(deny_file)) && errno != ENOENT
1047c478bdstevel@tonic-gate	)
1057c478bdstevel@tonic-gate		ret = -1;
1067c478bdstevel@tonic-gate	else
1077c478bdstevel@tonic-gate		ret = 0;
1087c478bdstevel@tonic-gate
1097c478bdstevel@tonic-gate	if (allow_file)
1107c478bdstevel@tonic-gate		Free (allow_file);
1117c478bdstevel@tonic-gate	if (deny_file)
1127c478bdstevel@tonic-gate		Free (deny_file);
1137c478bdstevel@tonic-gate
1147c478bdstevel@tonic-gate	return (ret);
1157c478bdstevel@tonic-gate}
1167c478bdstevel@tonic-gate
1177c478bdstevel@tonic-gate/**
1187c478bdstevel@tonic-gate ** _loadaccess() - LOAD ALLOW OR DENY FILE
1197c478bdstevel@tonic-gate **/
1207c478bdstevel@tonic-gate
1217c478bdstevel@tonic-gatestatic char **
1227c478bdstevel@tonic-gate_loadaccess(char *file)
1237c478bdstevel@tonic-gate{
1247c478bdstevel@tonic-gate	register size_t		nalloc,
1257c478bdstevel@tonic-gate				nlist;
1267c478bdstevel@tonic-gate
1277c478bdstevel@tonic-gate	register char		**list;
1287c478bdstevel@tonic-gate
1297c478bdstevel@tonic-gate	int fd;
1307c478bdstevel@tonic-gate
1317c478bdstevel@tonic-gate	char			buf[BUFSIZ];
1327c478bdstevel@tonic-gate
1337c478bdstevel@tonic-gate
1347c478bdstevel@tonic-gate	if ((fd = open_locked(file, "r", 0)) < 0)
1357c478bdstevel@tonic-gate		return (0);
1367c478bdstevel@tonic-gate
1377c478bdstevel@tonic-gate	/*
1387c478bdstevel@tonic-gate	 * Preallocate space for the initial list. We'll always
1397c478bdstevel@tonic-gate	 * allocate one more than the list size, for the terminating null.
1407c478bdstevel@tonic-gate	 */
1417c478bdstevel@tonic-gate	nalloc = ACC_MAX_GUESS;
1427c478bdstevel@tonic-gate	list = (char **)Malloc((nalloc + 1) * sizeof(char *));
1437c478bdstevel@tonic-gate	if (!list) {
1447c478bdstevel@tonic-gate		close(fd);
1457c478bdstevel@tonic-gate		errno = ENOMEM;
1467c478bdstevel@tonic-gate		return (0);
1477c478bdstevel@tonic-gate	}
1487c478bdstevel@tonic-gate
1497c478bdstevel@tonic-gate	errno = 0;
1507c478bdstevel@tonic-gate	for (nlist = 0; fdgets(buf, BUFSIZ, fd); ) {
1517c478bdstevel@tonic-gate
1527c478bdstevel@tonic-gate		buf[strlen(buf) - 1] = 0;
1537c478bdstevel@tonic-gate
1547c478bdstevel@tonic-gate		/*
1557c478bdstevel@tonic-gate		 * Allocate more space if needed.
1567c478bdstevel@tonic-gate		 */
1577c478bdstevel@tonic-gate		if (nlist >= nalloc) {
1587c478bdstevel@tonic-gate			nalloc += ACC_MAX_GUESS;
1597c478bdstevel@tonic-gate			list = (char **)Realloc(
1607c478bdstevel@tonic-gate				(char *)list,
1617c478bdstevel@tonic-gate				(nalloc + 1) * sizeof(char *)
1627c478bdstevel@tonic-gate			);
1637c478bdstevel@tonic-gate			if (!list) {
1647c478bdstevel@tonic-gate				close(fd);
1657c478bdstevel@tonic-gate				return (0);
1667c478bdstevel@tonic-gate			}
1677c478bdstevel@tonic-gate		}
1687c478bdstevel@tonic-gate
1697c478bdstevel@tonic-gate		list[nlist] = Strdup(buf);   /* if fail, minor problem */
1707c478bdstevel@tonic-gate		list[++nlist] = 0;
1717c478bdstevel@tonic-gate
1727c478bdstevel@tonic-gate	}
1737c478bdstevel@tonic-gate	if (errno != 0) {
1747c478bdstevel@tonic-gate		int			save_errno = errno;
1757c478bdstevel@tonic-gate
1767c478bdstevel@tonic-gate		close(fd);
1777c478bdstevel@tonic-gate		freelist (list);
1787c478bdstevel@tonic-gate		errno = save_errno;
1797c478bdstevel@tonic-gate		return (0);
1807c478bdstevel@tonic-gate	}
1817c478bdstevel@tonic-gate	close(fd);
1827c478bdstevel@tonic-gate
1837c478bdstevel@tonic-gate	/*
1847c478bdstevel@tonic-gate	 * If we have more space allocated than we need,
1857c478bdstevel@tonic-gate	 * return the extra.
1867c478bdstevel@tonic-gate	 */
1877c478bdstevel@tonic-gate	if (nlist != nalloc) {
1887c478bdstevel@tonic-gate		list = (char **)Realloc(
1897c478bdstevel@tonic-gate			(char *)list,
1907c478bdstevel@tonic-gate			(nlist + 1) * sizeof(char *)
1917c478bdstevel@tonic-gate		);
1927c478bdstevel@tonic-gate		if (!list) {
1937c478bdstevel@tonic-gate			errno = ENOMEM;
1947c478bdstevel@tonic-gate			return (0);
1957c478bdstevel@tonic-gate		}
1967c478bdstevel@tonic-gate	}
1977c478bdstevel@tonic-gate	list[nlist] = 0;
1987c478bdstevel@tonic-gate
1997c478bdstevel@tonic-gate	return (list);
2007c478bdstevel@tonic-gate}
201