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