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