Initial import from FreeBSD RELENG_4:
[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  */
36
37 #ifndef _SYS_FILE_H_
38 #define _SYS_FILE_H_
39
40 #ifndef _KERNEL
41 #include <sys/fcntl.h>
42 #include <sys/unistd.h>
43 #endif
44
45 #ifdef _KERNEL
46 #include <sys/queue.h>
47
48 struct stat;
49 struct proc;
50 struct uio;
51 struct knote;
52
53 /*
54  * Kernel descriptor table.
55  * One entry for each open kernel vnode and socket.
56  */
57 struct file {
58         LIST_ENTRY(file) f_list;/* list of active files */
59         short   f_FILLER3;      /* (old f_flag) */
60 #define DTYPE_VNODE     1       /* file */
61 #define DTYPE_SOCKET    2       /* communications endpoint */
62 #define DTYPE_PIPE      3       /* pipe */
63 #define DTYPE_FIFO      4       /* fifo (named pipe) */
64 #define DTYPE_KQUEUE    5       /* event queue */
65 #define DTYPE_CRYPTO    6       /* crypto */
66         short   f_type;         /* descriptor type */
67         u_int   f_flag;         /* see fcntl.h */
68         struct  ucred *f_cred;  /* credentials associated with descriptor */
69         struct  fileops {
70                 int     (*fo_read)      __P((struct file *fp, struct uio *uio,
71                                             struct ucred *cred, int flags,
72                                             struct proc *p));
73                 int     (*fo_write)     __P((struct file *fp, struct uio *uio,
74                                             struct ucred *cred, int flags,
75                                             struct proc *p));
76 #define FOF_OFFSET      1
77                 int     (*fo_ioctl)     __P((struct file *fp, u_long com,
78                                             caddr_t data, struct proc *p));
79                 int     (*fo_poll)      __P((struct file *fp, int events,
80                                             struct ucred *cred, struct proc *p));
81                 int     (*fo_kqfilter)  __P((struct file *fp,
82                                             struct knote *kn));
83                 int     (*fo_stat)      __P((struct file *fp, struct stat *sb,
84                                             struct proc *p));
85                 int     (*fo_close)     __P((struct file *fp, struct proc *p));
86         } *f_ops;
87         int     f_seqcount;     /*
88                                  * count of sequential accesses -- cleared
89                                  * by most seek operations.
90                                  */
91         off_t   f_nextoff;      /*
92                                  * offset of next expected read or write
93                                  */
94         off_t   f_offset;
95         caddr_t f_data;         /* vnode or socket */
96         int     f_count;        /* reference count */
97         int     f_msgcount;     /* reference count from message queue */
98 };
99
100 #ifdef MALLOC_DECLARE
101 MALLOC_DECLARE(M_FILE);
102 #endif
103
104 LIST_HEAD(filelist, file);
105 extern struct filelist filehead; /* head of list of open files */
106 extern struct fileops vnops;
107 extern struct fileops badfileops;
108 extern int maxfiles;            /* kernel limit on number of open files */
109 extern int maxfilesperproc;     /* per process limit on number of open files */
110 extern int nfiles;              /* actual number of open files */
111
112 static __inline void fhold __P((struct file *fp));
113 int fdrop __P((struct file *fp, struct proc *p));
114
115 static __inline void
116 fhold(fp)
117         struct file *fp;
118 {
119
120         fp->f_count++;
121 }
122
123 static __inline int fo_read __P((struct file *fp, struct uio *uio,
124     struct ucred *cred, int flags, struct proc *p));
125 static __inline int fo_write __P((struct file *fp, struct uio *uio,
126     struct ucred *cred, int flags, struct proc *p));
127 static __inline int fo_ioctl __P((struct file *fp, u_long com, caddr_t data,
128     struct proc *p));
129 static __inline int fo_poll __P((struct file *fp, int events,
130     struct ucred *cred, struct proc *p));
131 static __inline int fo_stat __P((struct file *fp, struct stat *sb,
132     struct proc *p));
133 static __inline int fo_close __P((struct file *fp, struct proc *p));
134 static __inline int fo_kqfilter __P((struct file *fp, struct knote *kn));
135
136 static __inline int
137 fo_read(fp, uio, cred, flags, p)
138         struct file *fp;
139         struct uio *uio;
140         struct ucred *cred;
141         struct proc *p;
142         int flags;
143 {
144         int error;
145
146         fhold(fp);
147         error = (*fp->f_ops->fo_read)(fp, uio, cred, flags, p);
148         fdrop(fp, p);
149         return (error);
150 }
151
152 static __inline int
153 fo_write(fp, uio, cred, flags, p)
154         struct file *fp;
155         struct uio *uio;
156         struct ucred *cred;
157         struct proc *p;
158         int flags;
159 {
160         int error;
161
162         fhold(fp);
163         error = (*fp->f_ops->fo_write)(fp, uio, cred, flags, p);
164         fdrop(fp, p);
165         return (error);
166 }
167
168 static __inline int
169 fo_ioctl(fp, com, data, p)
170         struct file *fp;
171         u_long com;
172         caddr_t data;
173         struct proc *p;
174 {
175         int error;
176
177         fhold(fp);
178         error = (*fp->f_ops->fo_ioctl)(fp, com, data, p);
179         fdrop(fp, p);
180         return (error);
181 }
182
183 static __inline int
184 fo_poll(fp, events, cred, p)
185         struct file *fp;
186         int events;
187         struct ucred *cred;
188         struct proc *p;
189 {
190         int error;
191
192         fhold(fp);
193         error = (*fp->f_ops->fo_poll)(fp, events, cred, p);
194         fdrop(fp, p);
195         return (error);
196 }
197
198 static __inline int
199 fo_stat(fp, sb, p)
200         struct file *fp;
201         struct stat *sb;
202         struct proc *p;
203 {
204         int error;
205
206         fhold(fp);
207         error = (*fp->f_ops->fo_stat)(fp, sb, p);
208         fdrop(fp, p);
209         return (error);
210 }
211
212 static __inline int
213 fo_close(fp, p)
214         struct file *fp;
215         struct proc *p;
216 {
217
218         return ((*fp->f_ops->fo_close)(fp, p));
219 }
220
221 static __inline int
222 fo_kqfilter(fp, kn)
223         struct file *fp;
224         struct knote *kn;
225 {
226
227         return ((*fp->f_ops->fo_kqfilter)(fp, kn));
228 }
229
230 #endif /* _KERNEL */
231
232 #endif /* !SYS_FILE_H */