acl_valid.c revision 56625
1214455Srpaulo/*-
2214455Srpaulo * Copyright (c) 1999 Robert N. M. Watson
3214455Srpaulo * All rights reserved.
4214455Srpaulo *
5214455Srpaulo * Redistribution and use in source and binary forms, with or without
6214455Srpaulo * modification, are permitted provided that the following conditions
7214455Srpaulo * are met:
8214455Srpaulo * 1. Redistributions of source code must retain the above copyright
9214455Srpaulo *    notice, this list of conditions and the following disclaimer.
10214455Srpaulo * 2. Redistributions in binary form must reproduce the above copyright
11214455Srpaulo *    notice, this list of conditions and the following disclaimer in the
12214455Srpaulo *    documentation and/or other materials provided with the distribution.
13214455Srpaulo *
14214455Srpaulo * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15214455Srpaulo * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16214455Srpaulo * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17214455Srpaulo * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18214455Srpaulo * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19214455Srpaulo * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20214455Srpaulo * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21235426Sdelphij * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22214455Srpaulo * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23214455Srpaulo * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24214455Srpaulo * SUCH DAMAGE.
25214455Srpaulo *
26214455Srpaulo *	$FreeBSD: head/lib/libc/posix1e/acl_valid.c 56625 2000-01-26 04:19:38Z rwatson $
27214455Srpaulo */
28214455Srpaulo/*
29214455Srpaulo * acl_valid -- POSIX.1e ACL check routine
30214455Srpaulo */
31214455Srpaulo
32214455Srpaulo#include <sys/types.h>
33214455Srpaulo#include <sys/acl.h>
34214455Srpaulo#include <sys/errno.h>
35214455Srpaulo
36214455Srpaulo#include "acl_support.h"
37214455Srpaulo
38214455Srpaulo/*
39214455Srpaulo * acl_valid: accepts an ACL, returns 0 on valid ACL, -1 for invalid,
40214455Srpaulo * and errno set to EINVAL.
41214455Srpaulo *
42214455Srpaulo * Implemented by calling the acl_check routine in acl_support, which
43214455Srpaulo * requires ordering.  We call acl_support's acl_sort to make this
44214455Srpaulo * true.
45214455Srpaulo *
46214455Srpaulo * POSIX.1e allows acl_valid() to reorder the ACL as it sees fit.
47214455Srpaulo *
48214455Srpaulo * This call is deprecated, as it doesn't ask whether the ACL is valid
49214455Srpaulo * for a particular target.
50214455Srpaulo */
51214455Srpauloint
52214455Srpauloacl_valid(acl_t acl)
53214455Srpaulo{
54214455Srpaulo	int	error;
55214455Srpaulo
56214455Srpaulo	acl_sort(acl);
57214455Srpaulo	error = acl_check(acl);
58214455Srpaulo	if (error) {
59214455Srpaulo		errno = error;
60214455Srpaulo		return (-1);
61214455Srpaulo	} else {
62214455Srpaulo		return (0);
63214455Srpaulo	}
64214455Srpaulo}
65214455Srpaulo
66214455Srpaulo
67214455Srpauloint
68214455Srpauloacl_valid_file(const char *pathp, acl_type_t type, acl_t acl)
69214455Srpaulo{
70214455Srpaulo	int	error;
71214455Srpaulo
72214455Srpaulo	if (acl_posix1e(acl, type)) {
73214455Srpaulo		error = acl_sort(acl);
74214455Srpaulo		if (error) {
75214455Srpaulo			errno = error;
76214455Srpaulo			return (-1);
77214455Srpaulo		}
78214455Srpaulo	}
79214455Srpaulo
80214455Srpaulo	return (__acl_aclcheck_file(pathp, type, acl));
81214455Srpaulo}
82214455Srpaulo
83214455Srpaulo
84214455Srpauloint
85214455Srpauloacl_valid_fd(int fd, acl_type_t type, acl_t acl)
86214455Srpaulo{
87214455Srpaulo	int	error;
88214455Srpaulo
89214455Srpaulo	if (acl_posix1e(acl, type)) {
90214455Srpaulo		error = acl_sort(acl);
91214455Srpaulo		if (error) {
92214455Srpaulo			errno = error;
93214455Srpaulo			return (-1);
94214455Srpaulo		}
95214455Srpaulo	}
96214455Srpaulo
97235426Sdelphij	return (__acl_aclcheck_fd(fd, type, acl));
98235426Sdelphij}
99235426Sdelphij