thread stage 4: remove curpcb, use td_pcb reference instead. Move the pcb
[dragonfly.git] / sys / sys / file.h
1 /*
2  * Copyright (c) 1982, 1986, 1989, 1993
3  *      The Regents of the University of California.  All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  * 3. All advertising materials mentioning features or use of this software
14  *    must display the following acknowledgement:
15  *      This product includes software developed by the University of
16  *      California, Berkeley and its contributors.
17  * 4. Neither the name of the University nor the names of its contributors
18  *    may be used to endorse or promote products derived from this software
19  *    without specific prior written permission.
20  *
21  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
22  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
25  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31  * SUCH DAMAGE.
32  *
33  *      @(#)file.h      8.3 (Berkeley) 1/9/95
34  * $FreeBSD: src/sys/sys/file.h,v 1.22.2.7 2002/11/21 23:39:24 sam Exp $
35  * $DragonFly: src/sys/sys/file.h,v 1.2 2003/06/17 04:28:58 dillon Exp $
36  */
37
38 #ifndef _SYS_FILE_H_
39 #define _SYS_FILE_H_
40
41 #ifndef _KERNEL
42 #include <sys/fcntl.h>
43 #include <sys/unistd.h>
44 #endif
45
46 #ifdef _KERNEL
47 #include <sys/queue.h>
48
49 struct stat;
50 struct proc;
51 struct uio;
52 struct knote;
53
54 /*
55  * Kernel descriptor table.
56  * One entry for each open kernel vnode and socket.
57  */
58 struct file {
59         LIST_ENTRY(file) f_list;/* list of active files */
60         short   f_FILLER3;      /* (old f_flag) */
61 #define DTYPE_VNODE     1       /* file */
62 #define DTYPE_SOCKET    2       /* communications endpoint */
63 #define DTYPE_PIPE      3       /* pipe */
64 #define DTYPE_FIFO      4       /* fifo (named pipe) */
65 #define DTYPE_KQUEUE    5       /* event queue */
66 #define DTYPE_CRYPTO    6       /* crypto */
67         short   f_type;         /* descriptor type */
68         u_int   f_flag;         /* see fcntl.h */
69         struct  ucred *f_cred;  /* credentials associated with descriptor */
70         struct  fileops {
71                 int     (*fo_read)      __P((struct file *fp, struct uio *uio,
72                                             struct ucred *cred, int flags,
73                                             struct proc *p));
74                 int     (*fo_write)     __P((struct file *fp, struct uio *uio,
75                                             struct ucred *cred, int flags,
76                                             struct proc *p));
77 #define FOF_OFFSET      1
78                 int     (*fo_ioctl)     __P((struct file *fp, u_long com,
79                                             caddr_t data, struct proc *p));
80                 int     (*fo_poll)      __P((struct file *fp, int events,
81                                             struct ucred *cred, struct proc *p));
82                 int     (*fo_kqfilter)  __P((struct file *fp,
83                                             struct knote *kn));
84                 int     (*fo_stat)      __P((struct file *fp, struct stat *sb,
85                                             struct proc *p));
86                 int     (*fo_close)     __P((struct file *fp, struct proc *p));
87         } *f_ops;
88         int     f_seqcount;     /*
89                                  * count of sequential accesses -- cleared
90                                  * by most seek operations.
91                                  */
92         off_t   f_nextoff;      /*
93                                  * offset of next expected read or write
94                                  */
95         off_t   f_offset;
96         caddr_t f_data;         /* vnode or socket */
97         int     f_count;        /* reference count */
98         int     f_msgcount;     /* reference count from message queue */
99 };
100
101 #ifdef MALLOC_DECLARE
102 MALLOC_DECLARE(M_FILE);
103 #endif
104
105 LIST_HEAD(filelist, file);
106 extern struct filelist filehead; /* head of list of open files */
107 extern struct fileops vnops;
108 extern struct fileops badfileops;
109 extern int maxfiles;            /* kernel limit on number of open files */
110 extern int maxfilesperproc;     /* per process limit on number of open files */
111 extern int nfiles;              /* actual number of open files */
112
113 static __inline void fhold __P((struct file *fp));
114 int fdrop __P((struct file *fp, struct proc *p));
115
116 static __inline void
117 fhold(fp)
118         struct file *fp;
119 {
120
121         fp->f_count++;
122 }
123
124 static __inline int fo_read __P((struct file *fp, struct uio *uio,
125     struct ucred *cred, int flags, struct proc *p));
126 static __inline int fo_write __P((struct file *fp, struct uio *uio,
127     struct ucred *cred, int flags, struct proc *p));
128 static __inline int fo_ioctl __P((struct file *fp, u_long com, caddr_t data,
129     struct proc *p));
130 static __inline int fo_poll __P((struct file *fp, int events,
131     struct ucred *cred, struct proc *p));
132 static __inline int fo_stat __P((struct file *fp, struct stat *sb,
133     struct proc *p));
134 static __inline int fo_close __P((struct file *fp, struct proc *p));
135 static __inline int fo_kqfilter __P((struct file *fp, struct knote *kn));
136
137 static __inline int
138 fo_read(fp, uio, cred, flags, p)
139         struct file *fp;
140         struct uio *uio;
141         struct ucred *cred;
142         struct proc *p;
143         int flags;
144 {
145         int error;
146
147         fhold(fp);
148         error = (*fp->f_ops->fo_read)(fp, uio, cred, flags, p);
149         fdrop(fp, p);
150         return (error);
151 }
152
153 static __inline int
154 fo_write(fp, uio, cred, flags, p)
155         struct file *fp;
156         struct uio *uio;
157         struct ucred *cred;
158         struct proc *p;
159         int flags;
160 {
161         int error;
162
163         fhold(fp);
164         error = (*fp->f_ops->fo_write)(fp, uio, cred, flags, p);
165         fdrop(fp, p);
166         return (error);
167 }
168
169 static __inline int
170 fo_ioctl(fp, com, data, p)
171         struct file *fp;
172         u_long com;
173         caddr_t data;
174         struct proc *p;
175 {
176         int error;
177
178         fhold(fp);
179         error = (*fp->f_ops->fo_ioctl)(fp, com, data, p);
180         fdrop(fp, p);
181         return (error);
182 }
183
184 static __inline int
185 fo_poll(fp, events, cred, p)
186         struct file *fp;
187         int events;
188         struct ucred *cred;
189         struct proc *p;
190 {
191         int error;
192
193         fhold(fp);
194         error = (*fp->f_ops->fo_poll)(fp, events, cred, p);
195         fdrop(fp, p);
196         return (error);
197 }
198
199 static __inline int
200 fo_stat(fp, sb, p)
201         struct file *fp;
202         struct stat *sb;
203         struct proc *p;
204 {
205         int error;
206
207         fhold(fp);
208         error = (*fp->f_ops->fo_stat)(fp, sb, p);
209         fdrop(fp, p);
210         return (error);
211 }
212
213 static __inline int
214 fo_close(fp, p)
215         struct file *fp;
216         struct proc *p;
217 {
218
219         return ((*fp->f_ops->fo_close)(fp, p));
220 }
221
222 static __inline int
223 fo_kqfilter(fp, kn)
224         struct file *fp;
225         struct knote *kn;
226 {
227
228         return ((*fp->f_ops->fo_kqfilter)(fp, kn));
229 }
230
231 #endif /* _KERNEL */
232
233 #endif /* !SYS_FILE_H */