file.h revision 293549
1108473Strhodes/*-
2108473Strhodes * Copyright (c) 1982, 1986, 1989, 1993
3108473Strhodes *	The Regents of the University of California.  All rights reserved.
4108473Strhodes *
5230588Ssbruno * Redistribution and use in source and binary forms, with or without
6108473Strhodes * modification, are permitted provided that the following conditions
7108473Strhodes * are met:
8108473Strhodes * 1. Redistributions of source code must retain the above copyright
9108473Strhodes *    notice, this list of conditions and the following disclaimer.
10111447Sru * 2. Redistributions in binary form must reproduce the above copyright
11108473Strhodes *    notice, this list of conditions and the following disclaimer in the
12158762Sbrueffer *    documentation and/or other materials provided with the distribution.
13158762Sbrueffer * 4. Neither the name of the University nor the names of its contributors
14158762Sbrueffer *    may be used to endorse or promote products derived from this software
15158762Sbrueffer *    without specific prior written permission.
16111447Sru *
17111447Sru * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18158762Sbrueffer * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19158762Sbrueffer * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20158762Sbrueffer * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21158762Sbrueffer * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22158762Sbrueffer * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23158762Sbrueffer * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24158762Sbrueffer * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25158762Sbrueffer * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26108473Strhodes * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27108473Strhodes * SUCH DAMAGE.
28108473Strhodes *
29108473Strhodes *	@(#)file.h	8.3 (Berkeley) 1/9/95
30108473Strhodes * $FreeBSD: stable/10/sys/sys/file.h 293549 2016-01-09 16:48:50Z dchagin $
31108473Strhodes */
32108473Strhodes
33108473Strhodes#ifndef _SYS_FILE_H_
34108473Strhodes#define	_SYS_FILE_H_
35108473Strhodes
36108473Strhodes#ifndef _KERNEL
37111447Sru#include <sys/types.h> /* XXX */
38111447Sru#include <sys/fcntl.h>
39108473Strhodes#include <sys/unistd.h>
40108473Strhodes#else
41108473Strhodes#include <sys/queue.h>
42111447Sru#include <sys/refcount.h>
43111447Sru#include <sys/_lock.h>
44108473Strhodes#include <sys/_mutex.h>
45108473Strhodes
46111447Srustruct stat;
47111447Srustruct thread;
48131530Srustruct uio;
49111447Srustruct knote;
50108473Strhodesstruct vnode;
51111447Srustruct socket;
52108473Strhodes
53108473Strhodes
54108473Strhodes#endif /* _KERNEL */
55108473Strhodes
56108473Strhodes#define	DTYPE_VNODE	1	/* file */
57108473Strhodes#define	DTYPE_SOCKET	2	/* communications endpoint */
58111447Sru#define	DTYPE_PIPE	3	/* pipe */
59111447Sru#define	DTYPE_FIFO	4	/* fifo (named pipe) */
60108473Strhodes#define	DTYPE_KQUEUE	5	/* event queue */
61108473Strhodes#define	DTYPE_CRYPTO	6	/* crypto */
62108473Strhodes#define	DTYPE_MQUEUE	7	/* posix message queue */
63108473Strhodes#define	DTYPE_SHM	8	/* swap-backed shared memory */
64108473Strhodes#define	DTYPE_SEM	9	/* posix semaphore */
65249350Ssbruno#define	DTYPE_PTS	10	/* pseudo teletype master device */
66108473Strhodes#define	DTYPE_DEV	11	/* Device specific fd type */
67249350Ssbruno#define	DTYPE_PROCDESC	12	/* process descriptor */
68249350Ssbruno#define	DTYPE_LINUXEFD	13	/* emulation eventfd type */
69249350Ssbruno
70111447Sru#ifdef _KERNEL
71111447Sru
72130951Sscottlstruct file;
73130951Sscottlstruct filecaps;
74131530Srustruct ucred;
75131530Sru
76130951Sscottl#define	FOF_OFFSET	0x01	/* Use the offset in uio argument */
77131530Sru#define	FOF_NOLOCK	0x02	/* Do not take FOFFSET_LOCK */
78131530Sru#define	FOF_NEXTOFF	0x04	/* Also update f_nextoff */
79130951Sscottl#define	FOF_NOUPDATE	0x10	/* Do not update f_offset */
80130951Sscottloff_t foffset_lock(struct file *fp, int flags);
81131530Sruvoid foffset_lock_uio(struct file *fp, struct uio *uio, int flags);
82249350Ssbrunovoid foffset_unlock(struct file *fp, off_t val, int flags);
83249361Sjoelvoid foffset_unlock_uio(struct file *fp, struct uio *uio, int flags);
84176136Siwasaki
85176136Siwasakistatic inline off_t
86176136Siwasakifoffset_get(struct file *fp)
87176136Siwasaki{
88176136Siwasaki
89176136Siwasaki	return (foffset_lock(fp, FOF_NOLOCK));
90133091Ssimon}
91133091Ssimon
92133091Ssimontypedef int fo_rdwr_t(struct file *fp, struct uio *uio,
93133091Ssimon		    struct ucred *active_cred, int flags,
94108473Strhodes		    struct thread *td);
95133091Ssimontypedef	int fo_truncate_t(struct file *fp, off_t length,
96111447Sru		    struct ucred *active_cred, struct thread *td);
97249350Ssbrunotypedef	int fo_ioctl_t(struct file *fp, u_long com, void *data,
98111447Sru		    struct ucred *active_cred, struct thread *td);
99111447Srutypedef	int fo_poll_t(struct file *fp, int events,
100111447Sru		    struct ucred *active_cred, struct thread *td);
101111447Srutypedef	int fo_kqfilter_t(struct file *fp, struct knote *kn);
102122225Ssimontypedef	int fo_stat_t(struct file *fp, struct stat *sb,
103122225Ssimon		    struct ucred *active_cred, struct thread *td);
104122225Ssimontypedef	int fo_close_t(struct file *fp, struct thread *td);
105122225Ssimontypedef	int fo_chmod_t(struct file *fp, mode_t mode,
106122225Ssimon		    struct ucred *active_cred, struct thread *td);
107122225Ssimontypedef	int fo_chown_t(struct file *fp, uid_t uid, gid_t gid,
108122225Ssimon		    struct ucred *active_cred, struct thread *td);
109122225Ssimontypedef int fo_sendfile_t(struct file *fp, int sockfd, struct uio *hdr_uio,
110122225Ssimon		    struct uio *trl_uio, off_t offset, size_t nbytes,
111122225Ssimon		    off_t *sent, int flags, int kflags, struct thread *td);
112122225Ssimontypedef int fo_seek_t(struct file *fp, off_t offset, int whence,
113122225Ssimon		    struct thread *td);
114128337Spstypedef	int fo_flags_t;
115152316Sps
116130493Ssimonstruct fileops {
117152316Sps	fo_rdwr_t	*fo_read;
118152316Sps	fo_rdwr_t	*fo_write;
119179705Sps	fo_truncate_t	*fo_truncate;
120179705Sps	fo_ioctl_t	*fo_ioctl;
121230588Ssbruno	fo_poll_t	*fo_poll;
122230588Ssbruno	fo_kqfilter_t	*fo_kqfilter;
123230588Ssbruno	fo_stat_t	*fo_stat;
124230588Ssbruno	fo_close_t	*fo_close;
125253980Ssbruno	fo_chmod_t	*fo_chmod;
126253980Ssbruno	fo_chown_t	*fo_chown;
127152316Sps	fo_sendfile_t	*fo_sendfile;
128152316Sps	fo_seek_t	*fo_seek;
129152316Sps	fo_flags_t	fo_flags;	/* DFLAG_* below */
130152316Sps};
131179705Sps
132179705Sps#define DFLAG_PASSABLE	0x01	/* may be passed via unix sockets. */
133179705Sps#define DFLAG_SEEKABLE	0x02	/* seekable / nonsequential */
134179705Sps#endif /* _KERNEL */
135179705Sps
136179705Sps#if defined(_KERNEL) || defined(_WANT_FILE)
137230316Ssbruno/*
138230316Ssbruno * Kernel descriptor table.
139230588Ssbruno * One entry for each open kernel vnode and socket.
140230588Ssbruno *
141230588Ssbruno * Below is the list of locks that protects members in struct file.
142230588Ssbruno *
143253980Ssbruno * (a) f_vnode lock required (shared allows both reads and writes)
144253980Ssbruno * (f) protected with mtx_lock(mtx_pool_find(fp))
145253980Ssbruno * (d) cdevpriv_mtx
146253980Ssbruno * none	not locked
147253980Ssbruno */
148253980Ssbruno
149253980Ssbrunostruct fadvise_info {
150253980Ssbruno	int		fa_advice;	/* (f) FADV_* type. */
151253980Ssbruno	off_t		fa_start;	/* (f) Region start. */
152253980Ssbruno	off_t		fa_end;		/* (f) Region end. */
153152015Srse	off_t		fa_prevstart;	/* (f) Previous NOREUSE start. */
154130493Ssimon	off_t		fa_prevend;	/* (f) Previous NOREUSE end. */
155230588Ssbruno};
156230588Ssbruno
157253980Ssbrunostruct file {
158253980Ssbruno	void		*f_data;	/* file descriptor specific data */
159152015Srse	struct fileops	*f_ops;		/* File operations */
160152015Srse	struct ucred	*f_cred;	/* associated credentials. */
161179705Sps	struct vnode 	*f_vnode;	/* NULL or applicable vnode */
162179705Sps	short		f_type;		/* descriptor type */
163253980Ssbruno	short		f_vnread_flags; /* (f) Sleep lock for f_offset */
164253980Ssbruno	volatile u_int	f_flag;		/* see fcntl.h */
165253980Ssbruno	volatile u_int 	f_count;	/* reference count */
166253980Ssbruno	/*
167128337Sps	 *  DTYPE_VNODE specific fields.
168128337Sps	 */
169128337Sps	int		f_seqcount;	/* (a) Count of sequential accesses. */
170108473Strhodes	off_t		f_nextoff;	/* next expected read/write offset. */
171108473Strhodes	union {
172108473Strhodes		struct cdev_privdata *fvn_cdevpriv;
173108473Strhodes					/* (d) Private data for the cdev. */
174108473Strhodes		struct fadvise_info *fvn_advice;
175130951Sscottl	} f_vnun;
176111447Sru	/*
177111447Sru	 *  DFLAG_SEEKABLE specific fields
178111447Sru	 */
179111447Sru	off_t		f_offset;
180111447Sru	/*
181111447Sru	 * Mandatory Access control information.
182108473Strhodes	 */
183111447Sru	void		*f_label;	/* Place-holder for MAC label. */
184108473Strhodes};
185108473Strhodes
186108473Strhodes#define	f_cdevpriv	f_vnun.fvn_cdevpriv
187108473Strhodes#define	f_advice	f_vnun.fvn_advice
188111447Sru
189108508Strhodes#define	FOFFSET_LOCKED       0x1
190108508Strhodes#define	FOFFSET_LOCK_WAITING 0x2
191#define	FDEVFS_VNODE	     0x4
192
193#endif /* _KERNEL || _WANT_FILE */
194
195/*
196 * Userland version of struct file, for sysctl
197 */
198struct xfile {
199	size_t	xf_size;	/* size of struct xfile */
200	pid_t	xf_pid;		/* owning process */
201	uid_t	xf_uid;		/* effective uid of owning process */
202	int	xf_fd;		/* descriptor number */
203	void	*xf_file;	/* address of struct file */
204	short	xf_type;	/* descriptor type */
205	int	xf_count;	/* reference count */
206	int	xf_msgcount;	/* references from message queue */
207	off_t	xf_offset;	/* file offset */
208	void	*xf_data;	/* file descriptor specific data */
209	void	*xf_vnode;	/* vnode pointer */
210	u_int	xf_flag;	/* flags (see fcntl.h) */
211};
212
213#ifdef _KERNEL
214
215extern struct fileops vnops;
216extern struct fileops badfileops;
217extern struct fileops socketops;
218extern int maxfiles;		/* kernel limit on number of open files */
219extern int maxfilesperproc;	/* per process limit on number of open files */
220extern volatile int openfiles;	/* actual number of open files */
221
222int fget(struct thread *td, int fd, cap_rights_t *rightsp, struct file **fpp);
223int fget_mmap(struct thread *td, int fd, cap_rights_t *rightsp,
224    u_char *maxprotp, struct file **fpp);
225int fget_read(struct thread *td, int fd, cap_rights_t *rightsp,
226    struct file **fpp);
227int fget_write(struct thread *td, int fd, cap_rights_t *rightsp,
228    struct file **fpp);
229int _fdrop(struct file *fp, struct thread *td);
230
231/*
232 * The socket operations are used a couple of places.
233 * XXX: This is wrong, they should go through the operations vector for
234 * XXX: sockets instead of going directly for the individual functions. /phk
235 */
236fo_rdwr_t	soo_read;
237fo_rdwr_t	soo_write;
238fo_truncate_t	soo_truncate;
239fo_ioctl_t	soo_ioctl;
240fo_poll_t	soo_poll;
241fo_kqfilter_t	soo_kqfilter;
242fo_stat_t	soo_stat;
243fo_close_t	soo_close;
244
245fo_chmod_t	invfo_chmod;
246fo_chown_t	invfo_chown;
247fo_sendfile_t	invfo_sendfile;
248
249fo_sendfile_t	vn_sendfile;
250fo_seek_t	vn_seek;
251
252void finit(struct file *, u_int, short, void *, struct fileops *);
253int fgetvp(struct thread *td, int fd, cap_rights_t *rightsp,
254    struct vnode **vpp);
255int fgetvp_exec(struct thread *td, int fd, cap_rights_t *rightsp,
256    struct vnode **vpp);
257int fgetvp_rights(struct thread *td, int fd, cap_rights_t *needrightsp,
258    struct filecaps *havecaps, struct vnode **vpp);
259int fgetvp_read(struct thread *td, int fd, cap_rights_t *rightsp,
260    struct vnode **vpp);
261int fgetvp_write(struct thread *td, int fd, cap_rights_t *rightsp,
262    struct vnode **vpp);
263
264int fgetsock(struct thread *td, int fd, cap_rights_t *rightsp,
265    struct socket **spp, u_int *fflagp);
266void fputsock(struct socket *sp);
267
268static __inline int
269_fnoop(void)
270{
271
272	return (0);
273}
274
275#define	fhold(fp)							\
276	(refcount_acquire(&(fp)->f_count))
277#define	fdrop(fp, td)							\
278	(refcount_release(&(fp)->f_count) ? _fdrop((fp), (td)) : _fnoop())
279
280static __inline fo_rdwr_t	fo_read;
281static __inline fo_rdwr_t	fo_write;
282static __inline fo_truncate_t	fo_truncate;
283static __inline fo_ioctl_t	fo_ioctl;
284static __inline fo_poll_t	fo_poll;
285static __inline fo_kqfilter_t	fo_kqfilter;
286static __inline fo_stat_t	fo_stat;
287static __inline fo_close_t	fo_close;
288static __inline fo_chmod_t	fo_chmod;
289static __inline fo_chown_t	fo_chown;
290static __inline fo_sendfile_t	fo_sendfile;
291
292static __inline int
293fo_read(struct file *fp, struct uio *uio, struct ucred *active_cred,
294    int flags, struct thread *td)
295{
296
297	return ((*fp->f_ops->fo_read)(fp, uio, active_cred, flags, td));
298}
299
300static __inline int
301fo_write(struct file *fp, struct uio *uio, struct ucred *active_cred,
302    int flags, struct thread *td)
303{
304
305	return ((*fp->f_ops->fo_write)(fp, uio, active_cred, flags, td));
306}
307
308static __inline int
309fo_truncate(struct file *fp, off_t length, struct ucred *active_cred,
310    struct thread *td)
311{
312
313	return ((*fp->f_ops->fo_truncate)(fp, length, active_cred, td));
314}
315
316static __inline int
317fo_ioctl(struct file *fp, u_long com, void *data, struct ucred *active_cred,
318    struct thread *td)
319{
320
321	return ((*fp->f_ops->fo_ioctl)(fp, com, data, active_cred, td));
322}
323
324static __inline int
325fo_poll(struct file *fp, int events, struct ucred *active_cred,
326    struct thread *td)
327{
328
329	return ((*fp->f_ops->fo_poll)(fp, events, active_cred, td));
330}
331
332static __inline int
333fo_stat(struct file *fp, struct stat *sb, struct ucred *active_cred,
334    struct thread *td)
335{
336
337	return ((*fp->f_ops->fo_stat)(fp, sb, active_cred, td));
338}
339
340static __inline int
341fo_close(struct file *fp, struct thread *td)
342{
343
344	return ((*fp->f_ops->fo_close)(fp, td));
345}
346
347static __inline int
348fo_kqfilter(struct file *fp, struct knote *kn)
349{
350
351	return ((*fp->f_ops->fo_kqfilter)(fp, kn));
352}
353
354static __inline int
355fo_chmod(struct file *fp, mode_t mode, struct ucred *active_cred,
356    struct thread *td)
357{
358
359	return ((*fp->f_ops->fo_chmod)(fp, mode, active_cred, td));
360}
361
362static __inline int
363fo_chown(struct file *fp, uid_t uid, gid_t gid, struct ucred *active_cred,
364    struct thread *td)
365{
366
367	return ((*fp->f_ops->fo_chown)(fp, uid, gid, active_cred, td));
368}
369
370static __inline int
371fo_sendfile(struct file *fp, int sockfd, struct uio *hdr_uio,
372    struct uio *trl_uio, off_t offset, size_t nbytes, off_t *sent, int flags,
373    int kflags, struct thread *td)
374{
375
376	return ((*fp->f_ops->fo_sendfile)(fp, sockfd, hdr_uio, trl_uio, offset,
377	    nbytes, sent, flags, kflags, td));
378}
379
380static __inline int
381fo_seek(struct file *fp, off_t offset, int whence, struct thread *td)
382{
383
384	return ((*fp->f_ops->fo_seek)(fp, offset, whence, td));
385}
386
387#endif /* _KERNEL */
388
389#endif /* !SYS_FILE_H */
390