-
Notifications
You must be signed in to change notification settings - Fork 31
/
Copy pathfile_internal.h
261 lines (235 loc) · 10.4 KB
/
file_internal.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
/*
* Copyright (c) 2000-2012 Apple Inc. All rights reserved.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_START@
*
* This file contains Original Code and/or Modifications of Original Code
* as defined in and that are subject to the Apple Public Source License
* Version 2.0 (the 'License'). You may not use this file except in
* compliance with the License. The rights granted to you under the License
* may not be used to create, or enable the creation or redistribution of,
* unlawful or unlicensed copies of an Apple operating system, or to
* circumvent, violate, or enable the circumvention or violation of, any
* terms of an Apple operating system software license agreement.
*
* Please obtain a copy of the License at
* http://www.opensource.apple.com/apsl/ and read it before using this file.
*
* The Original Code and all software distributed under the License are
* distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
* EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
* INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
* Please see the License for the specific language governing rights and
* limitations under the License.
*
* @APPLE_OSREFERENCE_LICENSE_HEADER_END@
*/
/* Copyright (c) 1995, 1997 Apple Computer, Inc. All Rights Reserved */
/*
* Copyright (c) 1982, 1986, 1989, 1993
* The Regents of the University of California. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the University of
* California, Berkeley and its contributors.
* 4. Neither the name of the University nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
*
* @(#)file.h 8.3 (Berkeley) 1/9/95
*/
#ifndef _SYS_FILE_INTERNAL_H_
#define _SYS_FILE_INTERNAL_H_
#include <sys/appleapiopts.h>
#include <sys/fcntl.h>
#include <sys/unistd.h>
#ifdef KERNEL
#include <sys/errno.h>
#include <sys/queue.h>
#include <sys/cdefs.h>
#include <sys/lock.h>
#include <sys/file.h>
#include <sys/filedesc.h>
struct proc;
struct uio;
struct knote;
#ifdef __APPLE_API_UNSTABLE
struct file;
/*
* Kernel descriptor table.
* One entry for each open kernel vnode and socket.
*/
struct fileproc {
unsigned int f_flags;
int32_t f_iocount;
struct fileglob * f_fglob;
void * f_waddr;
};
#define FILEPROC_NULL (struct fileproc *)0
#define FP_INCREATE 0x0001
#define FP_INCLOSE 0x0002
#define FP_INSELECT 0x0004
#define FP_UNUSED 0x0008 /* unused (was FP_INCHRREAD) */
#define FP_WRITTEN 0x0010
#define FP_CLOSING 0x0020
#define FP_WAITCLOSE 0x0040
#define FP_AIOISSUED 0x0080
#define FP_WAITEVENT 0x0100
#define FP_SELCONFLICT 0x0200 /* select conflict on an individual fp */
/* squeeze a "type" value into the upper flag bits */
#define _FP_TYPESHIFT 24
#define FP_TYPEMASK (0x7 << _FP_TYPESHIFT) /* 8 "types" of fileproc */
#define FILEPROC_TYPE(fp) ((fp)->f_flags & FP_TYPEMASK)
#define FP_ISGUARDED(fp, attribs) \
((FILEPROC_TYPE(fp) == FTYPE_GUARDED) ? fp_isguarded(fp, attribs) : 0)
typedef enum {
FTYPE_SIMPLE = 0,
FTYPE_GUARDED = (1 << _FP_TYPESHIFT)
} fileproc_type_t;
#define FP_VALID_FLAGS (FP_INCREATE | FP_INCLOSE | FP_INSELECT |\
FP_WRITTEN | FP_CLOSING | FP_WAITCLOSE |\
FP_AIOISSUED | FP_WAITEVENT | FP_SELCONFLICT | _FP_TYPEMASK)
#ifndef _KAUTH_CRED_T
#define _KAUTH_CRED_T
struct ucred;
typedef struct ucred *kauth_cred_t;
struct posix_cred;
typedef struct posix_cred *posix_cred_t;
#endif /* !_KAUTH_CRED_T */
/* file types */
typedef enum {
DTYPE_VNODE = 1, /* file */
DTYPE_SOCKET, /* communications endpoint */
DTYPE_PSXSHM, /* POSIX Shared memory */
DTYPE_PSXSEM, /* POSIX Semaphores */
DTYPE_KQUEUE, /* kqueue */
DTYPE_PIPE, /* pipe */
DTYPE_FSEVENTS, /* fsevents */
DTYPE_ATALK /* (obsolete) */
} file_type_t;
/* defines for fg_lflags */
#define FG_TERM 0x01 /* the fileglob is terminating .. */
#define FG_INSMSGQ 0x02 /* insert to msgqueue pending .. */
#define FG_WINSMSGQ 0x04 /* wait for the fielglob is in msgque */
#define FG_RMMSGQ 0x08 /* the fileglob is being removed from msgqueue */
#define FG_WRMMSGQ 0x10 /* wait for the fileglob to be removed from msgqueue */
#define FG_PORTMADE 0x20 /* a port was at some point created for this fileglob */
#define FG_NOSIGPIPE 0x40 /* don't deliver SIGPIPE with EPIPE return */
struct fileglob {
LIST_ENTRY(fileglob) f_msglist;/* list of active files */
int32_t fg_flag; /* see fcntl.h */
int32_t fg_count; /* reference count */
int32_t fg_msgcount; /* references from message queue */
int32_t fg_lflags; /* file global flags */
kauth_cred_t fg_cred; /* credentials associated with descriptor */
const struct fileops {
file_type_t fo_type; /* descriptor type */
int (*fo_read) (struct fileproc *fp, struct uio *uio,
int flags, vfs_context_t ctx);
int (*fo_write) (struct fileproc *fp, struct uio *uio,
int flags, vfs_context_t ctx);
#define FOF_OFFSET 0x00000001 /* offset supplied to vn_write */
#define FOF_PCRED 0x00000002 /* cred from proc, not current thread */
int (*fo_ioctl) (struct fileproc *fp, u_long com,
caddr_t data, vfs_context_t ctx);
int (*fo_select) (struct fileproc *fp, int which,
void *wql, vfs_context_t ctx);
int (*fo_close) (struct fileglob *fg, vfs_context_t ctx);
int (*fo_kqfilter) (struct fileproc *fp, struct knote *kn,
vfs_context_t ctx);
int (*fo_drain) (struct fileproc *fp, vfs_context_t ctx);
} *fg_ops;
off_t fg_offset;
void *fg_data; /* vnode or socket or SHM or semaphore */
lck_mtx_t fg_lock;
#if CONFIG_MACF
struct label *fg_label; /* JMM - use the one in the cred? */
#endif
};
#ifdef __APPLE_API_PRIVATE
LIST_HEAD(fmsglist, fileglob);
extern struct fmsglist fmsghead; /* head of list of open files */
extern int maxfiles; /* kernel limit on number of open files */
extern int nfiles; /* actual number of open files */
extern int maxfilesperproc;
#define FILEGLOB_DTYPE(fg) ((const file_type_t)((fg)->fg_ops->fo_type))
#endif /* __APPLE_API_PRIVATE */
__BEGIN_DECLS
int fo_read(struct fileproc *fp, struct uio *uio, int flags, vfs_context_t ctx);
int fo_write(struct fileproc *fp, struct uio *uio, int flags,
vfs_context_t ctx);
int fo_ioctl(struct fileproc *fp, u_long com, caddr_t data, vfs_context_t ctx);
int fo_select(struct fileproc *fp, int which, void *wql, vfs_context_t ctx);
int fo_close(struct fileglob *fg, vfs_context_t ctx);
int fo_kqfilter(struct fileproc *fp, struct knote *kn, vfs_context_t ctx);
void fileproc_drain(proc_t, struct fileproc *);
int fp_tryswap(proc_t, int fd, struct fileproc *nfp);
int fp_drop(struct proc *p, int fd, struct fileproc *fp, int locked);
int fp_drop_written(proc_t p, int fd, struct fileproc *fp);
int fp_drop_event(proc_t p, int fd, struct fileproc *fp);
int fp_free(struct proc * p, int fd, struct fileproc * fp);
struct kqueue;
int fp_getfkq(struct proc *p, int fd, struct fileproc **resultfp, struct kqueue **resultkq);
struct psemnode;
int fp_getfpsem(struct proc *p, int fd, struct fileproc **resultfp, struct psemnode **resultpsem);
struct pshmnode;
int fp_getfpshm(struct proc *p, int fd, struct fileproc **resultfp, struct pshmnode **resultpshm);
struct pipe;
int fp_getfpipe(struct proc *p, int fd, struct fileproc **resultfp, struct pipe **resultpipe);
struct atalk;
int fp_getfatalk(struct proc *p, int fd, struct fileproc **resultfp, struct atalk **resultatalk);
struct vnode;
int fp_getfvp(struct proc *p, int fd, struct fileproc **resultfp, struct vnode **resultvp);
int fp_getfvpandvid(struct proc *p, int fd, struct fileproc **resultfp, struct vnode **resultvp, uint32_t * vidp);
struct socket;
int fp_getfsock(struct proc *p, int fd, struct fileproc **resultfp, struct socket **results);
int fp_lookup(struct proc *p, int fd, struct fileproc **resultfp, int locked);
int fp_isguarded(struct fileproc *fp, u_int attribs);
int fp_guard_exception(proc_t p, int fd, struct fileproc *fp, u_int attribs);
int closef_locked(struct fileproc *fp, struct fileglob *fg, struct proc *p);
int close_internal_locked(proc_t p, int fd, struct fileproc *fp, int flags);
struct nameidata;
struct vnode_attr;
int open1(vfs_context_t ctx, struct nameidata *ndp, int uflags,
struct vnode_attr *vap, fp_allocfn_t fp_zalloc, void *cra,
int32_t *retval);
int kqueue_body(struct proc *p, fp_allocfn_t, void *cra, int32_t *retval);
void fg_insertuipc(struct fileglob * fg);
void fg_removeuipc(struct fileglob * fg);
void unp_gc_wait(void);
void procfdtbl_reservefd(struct proc * p, int fd);
void procfdtbl_markclosefd(struct proc * p, int fd);
void procfdtbl_releasefd(struct proc * p, int fd, struct fileproc * fp);
void procfdtbl_waitfd(struct proc * p, int fd);
void procfdtbl_clearfd(struct proc * p, int fd);
boolean_t filetype_issendable(file_type_t type);
extern int fdgetf_noref(proc_t, int, struct fileproc **);
extern struct fileproc *fileproc_alloc_init(void *crargs);
extern void fileproc_free(struct fileproc *fp);
extern void guarded_fileproc_free(struct fileproc *fp);
__END_DECLS
#endif /* __APPLE_API_UNSTABLE */
#endif /* KERNEL */
#endif /* !_SYS_FILE_INTERNAL_H_ */