1 /*
2 * Copyright (c) 2011 Apple Inc. All rights reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23 #include <sys/cdefs.h>
24 #include <sys/types.h>
25 #include <stdarg.h>
26 #include <sys/fcntl.h>
27 #include <sys/errno.h>
28 #include <sys/content_protection.h>
29
30 int __open_dprotected_np(const char* path, int flags, int class, int dpflags, int mode);
31 int __openat_dprotected_np(int fd, const char* path, int flags, int class, int dpflags, int mode, int authfd);
32
33 int
open_dprotected_np(const char * path,int flags,int class,int dpflags,...)34 open_dprotected_np(const char *path, int flags, int class, int dpflags, ...)
35 {
36 int mode = 0;
37
38 if (dpflags & O_DP_AUTHENTICATE) {
39 errno = EINVAL;
40 return -1;
41 }
42
43 if (flags & O_CREAT) {
44 va_list ap;
45 va_start(ap, dpflags);
46 mode = va_arg(ap, int);
47 va_end(ap);
48 }
49 return __open_dprotected_np(path, flags, class, dpflags, mode);
50 }
51
52 int
openat_dprotected_np(int fd,const char * path,int flags,int class,int dpflags,...)53 openat_dprotected_np(int fd, const char *path, int flags, int class, int dpflags, ...)
54 {
55 int mode = 0;
56
57 if (dpflags & O_DP_AUTHENTICATE) {
58 errno = EINVAL;
59 return -1;
60 }
61
62 if (flags & O_CREAT) {
63 va_list ap;
64 va_start(ap, dpflags);
65 mode = va_arg(ap, int);
66 va_end(ap);
67 }
68 return __openat_dprotected_np(fd, path, flags, class, dpflags, mode, AUTH_OPEN_NOAUTHFD);
69 }
70
71 int
openat_authenticated_np(int fd,const char * path,int flags,int authfd)72 openat_authenticated_np(int fd, const char *path, int flags, int authfd)
73 {
74 if (flags & O_CREAT) {
75 errno = EINVAL;
76 return -1;
77 }
78
79 if ((authfd != AUTH_OPEN_NOAUTHFD) && (authfd < 0)) {
80 errno = EBADF;
81 return -1;
82 }
83
84 return __openat_dprotected_np(fd, path, flags, PROTECTION_CLASS_DEFAULT, O_DP_AUTHENTICATE, 0, authfd);
85 }
86