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