]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/sys/file.h
Make dynamic sysctl entries start at 0x100, not decimal 100 - there are
[FreeBSD/FreeBSD.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$
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         short   f_type;         /* descriptor type */
66         int     f_count;        /* reference count */
67         int     f_msgcount;     /* references from message queue */
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         u_int   f_flag;         /* see fcntl.h */
97 };
98
99 #ifdef MALLOC_DECLARE
100 MALLOC_DECLARE(M_FILE);
101 #endif
102
103 LIST_HEAD(filelist, file);
104 extern struct filelist filehead; /* head of list of open files */
105 extern struct fileops vnops;
106 extern struct fileops badfileops;
107 extern int maxfiles;            /* kernel limit on number of open files */
108 extern int maxfilesperproc;     /* per process limit on number of open files */
109 extern int nfiles;              /* actual number of open files */
110
111 static __inline void fhold __P((struct file *fp));
112 int fdrop __P((struct file *fp, struct proc *p));
113
114 static __inline void
115 fhold(fp)
116         struct file *fp;
117 {
118
119         fp->f_count++;
120 }
121
122 static __inline int fo_read __P((struct file *fp, struct uio *uio,
123     struct ucred *cred, int flags, struct proc *p));
124 static __inline int fo_write __P((struct file *fp, struct uio *uio,
125     struct ucred *cred, int flags, struct proc *p));
126 static __inline int fo_ioctl __P((struct file *fp, u_long com, caddr_t data,
127     struct proc *p));
128 static __inline int fo_poll __P((struct file *fp, int events,
129     struct ucred *cred, struct proc *p));
130 static __inline int fo_stat __P((struct file *fp, struct stat *sb,
131     struct proc *p));
132 static __inline int fo_close __P((struct file *fp, struct proc *p));
133 static __inline int fo_kqfilter __P((struct file *fp, struct knote *kn));
134
135 static __inline int
136 fo_read(fp, uio, cred, flags, p)
137         struct file *fp;
138         struct uio *uio;
139         struct ucred *cred;
140         struct proc *p;
141         int flags;
142 {
143         int error;
144
145         fhold(fp);
146         error = (*fp->f_ops->fo_read)(fp, uio, cred, flags, p);
147         fdrop(fp, p);
148         return (error);
149 }
150
151 static __inline int
152 fo_write(fp, uio, cred, flags, p)
153         struct file *fp;
154         struct uio *uio;
155         struct ucred *cred;
156         struct proc *p;
157         int flags;
158 {
159         int error;
160
161         fhold(fp);
162         error = (*fp->f_ops->fo_write)(fp, uio, cred, flags, p);
163         fdrop(fp, p);
164         return (error);
165 }
166
167 static __inline int
168 fo_ioctl(fp, com, data, p)
169         struct file *fp;
170         u_long com;
171         caddr_t data;
172         struct proc *p;
173 {
174         int error;
175
176         fhold(fp);
177         error = (*fp->f_ops->fo_ioctl)(fp, com, data, p);
178         fdrop(fp, p);
179         return (error);
180 }
181
182 static __inline int
183 fo_poll(fp, events, cred, p)
184         struct file *fp;
185         int events;
186         struct ucred *cred;
187         struct proc *p;
188 {
189         int error;
190
191         fhold(fp);
192         error = (*fp->f_ops->fo_poll)(fp, events, cred, p);
193         fdrop(fp, p);
194         return (error);
195 }
196
197 static __inline int
198 fo_stat(fp, sb, p)
199         struct file *fp;
200         struct stat *sb;
201         struct proc *p;
202 {
203         int error;
204
205         fhold(fp);
206         error = (*fp->f_ops->fo_stat)(fp, sb, p);
207         fdrop(fp, p);
208         return (error);
209 }
210
211 static __inline int
212 fo_close(fp, p)
213         struct file *fp;
214         struct proc *p;
215 {
216
217         return ((*fp->f_ops->fo_close)(fp, p));
218 }
219
220 static __inline int
221 fo_kqfilter(fp, kn)
222         struct file *fp;
223         struct knote *kn;
224 {
225
226         return ((*fp->f_ops->fo_kqfilter)(fp, kn));
227 }
228
229 #endif /* _KERNEL */
230
231 #endif /* !SYS_FILE_H */