file.h revision 293549
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 * 4. Neither the name of the University nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 *	@(#)file.h	8.3 (Berkeley) 1/9/95
30 * $FreeBSD: stable/10/sys/sys/file.h 293549 2016-01-09 16:48:50Z dchagin $
31 */
32
33#ifndef _SYS_FILE_H_
34#define	_SYS_FILE_H_
35
36#ifndef _KERNEL
37#include <sys/types.h> /* XXX */
38#include <sys/fcntl.h>
39#include <sys/unistd.h>
40#else
41#include <sys/queue.h>
42#include <sys/refcount.h>
43#include <sys/_lock.h>
44#include <sys/_mutex.h>
45
46struct stat;
47struct thread;
48struct uio;
49struct knote;
50struct vnode;
51struct socket;
52
53
54#endif /* _KERNEL */
55
56#define	DTYPE_VNODE	1	/* file */
57#define	DTYPE_SOCKET	2	/* communications endpoint */
58#define	DTYPE_PIPE	3	/* pipe */
59#define	DTYPE_FIFO	4	/* fifo (named pipe) */
60#define	DTYPE_KQUEUE	5	/* event queue */
61#define	DTYPE_CRYPTO	6	/* crypto */
62#define	DTYPE_MQUEUE	7	/* posix message queue */
63#define	DTYPE_SHM	8	/* swap-backed shared memory */
64#define	DTYPE_SEM	9	/* posix semaphore */
65#define	DTYPE_PTS	10	/* pseudo teletype master device */
66#define	DTYPE_DEV	11	/* Device specific fd type */
67#define	DTYPE_PROCDESC	12	/* process descriptor */
68#define	DTYPE_LINUXEFD	13	/* emulation eventfd type */
69
70#ifdef _KERNEL
71
72struct file;
73struct filecaps;
74struct ucred;
75
76#define	FOF_OFFSET	0x01	/* Use the offset in uio argument */
77#define	FOF_NOLOCK	0x02	/* Do not take FOFFSET_LOCK */
78#define	FOF_NEXTOFF	0x04	/* Also update f_nextoff */
79#define	FOF_NOUPDATE	0x10	/* Do not update f_offset */
80off_t foffset_lock(struct file *fp, int flags);
81void foffset_lock_uio(struct file *fp, struct uio *uio, int flags);
82void foffset_unlock(struct file *fp, off_t val, int flags);
83void foffset_unlock_uio(struct file *fp, struct uio *uio, int flags);
84
85static inline off_t
86foffset_get(struct file *fp)
87{
88
89	return (foffset_lock(fp, FOF_NOLOCK));
90}
91
92typedef int fo_rdwr_t(struct file *fp, struct uio *uio,
93		    struct ucred *active_cred, int flags,
94		    struct thread *td);
95typedef	int fo_truncate_t(struct file *fp, off_t length,
96		    struct ucred *active_cred, struct thread *td);
97typedef	int fo_ioctl_t(struct file *fp, u_long com, void *data,
98		    struct ucred *active_cred, struct thread *td);
99typedef	int fo_poll_t(struct file *fp, int events,
100		    struct ucred *active_cred, struct thread *td);
101typedef	int fo_kqfilter_t(struct file *fp, struct knote *kn);
102typedef	int fo_stat_t(struct file *fp, struct stat *sb,
103		    struct ucred *active_cred, struct thread *td);
104typedef	int fo_close_t(struct file *fp, struct thread *td);
105typedef	int fo_chmod_t(struct file *fp, mode_t mode,
106		    struct ucred *active_cred, struct thread *td);
107typedef	int fo_chown_t(struct file *fp, uid_t uid, gid_t gid,
108		    struct ucred *active_cred, struct thread *td);
109typedef int fo_sendfile_t(struct file *fp, int sockfd, struct uio *hdr_uio,
110		    struct uio *trl_uio, off_t offset, size_t nbytes,
111		    off_t *sent, int flags, int kflags, struct thread *td);
112typedef int fo_seek_t(struct file *fp, off_t offset, int whence,
113		    struct thread *td);
114typedef	int fo_flags_t;
115
116struct fileops {
117	fo_rdwr_t	*fo_read;
118	fo_rdwr_t	*fo_write;
119	fo_truncate_t	*fo_truncate;
120	fo_ioctl_t	*fo_ioctl;
121	fo_poll_t	*fo_poll;
122	fo_kqfilter_t	*fo_kqfilter;
123	fo_stat_t	*fo_stat;
124	fo_close_t	*fo_close;
125	fo_chmod_t	*fo_chmod;
126	fo_chown_t	*fo_chown;
127	fo_sendfile_t	*fo_sendfile;
128	fo_seek_t	*fo_seek;
129	fo_flags_t	fo_flags;	/* DFLAG_* below */
130};
131
132#define DFLAG_PASSABLE	0x01	/* may be passed via unix sockets. */
133#define DFLAG_SEEKABLE	0x02	/* seekable / nonsequential */
134#endif /* _KERNEL */
135
136#if defined(_KERNEL) || defined(_WANT_FILE)
137/*
138 * Kernel descriptor table.
139 * One entry for each open kernel vnode and socket.
140 *
141 * Below is the list of locks that protects members in struct file.
142 *
143 * (a) f_vnode lock required (shared allows both reads and writes)
144 * (f) protected with mtx_lock(mtx_pool_find(fp))
145 * (d) cdevpriv_mtx
146 * none	not locked
147 */
148
149struct fadvise_info {
150	int		fa_advice;	/* (f) FADV_* type. */
151	off_t		fa_start;	/* (f) Region start. */
152	off_t		fa_end;		/* (f) Region end. */
153	off_t		fa_prevstart;	/* (f) Previous NOREUSE start. */
154	off_t		fa_prevend;	/* (f) Previous NOREUSE end. */
155};
156
157struct file {
158	void		*f_data;	/* file descriptor specific data */
159	struct fileops	*f_ops;		/* File operations */
160	struct ucred	*f_cred;	/* associated credentials. */
161	struct vnode 	*f_vnode;	/* NULL or applicable vnode */
162	short		f_type;		/* descriptor type */
163	short		f_vnread_flags; /* (f) Sleep lock for f_offset */
164	volatile u_int	f_flag;		/* see fcntl.h */
165	volatile u_int 	f_count;	/* reference count */
166	/*
167	 *  DTYPE_VNODE specific fields.
168	 */
169	int		f_seqcount;	/* (a) Count of sequential accesses. */
170	off_t		f_nextoff;	/* next expected read/write offset. */
171	union {
172		struct cdev_privdata *fvn_cdevpriv;
173					/* (d) Private data for the cdev. */
174		struct fadvise_info *fvn_advice;
175	} f_vnun;
176	/*
177	 *  DFLAG_SEEKABLE specific fields
178	 */
179	off_t		f_offset;
180	/*
181	 * Mandatory Access control information.
182	 */
183	void		*f_label;	/* Place-holder for MAC label. */
184};
185
186#define	f_cdevpriv	f_vnun.fvn_cdevpriv
187#define	f_advice	f_vnun.fvn_advice
188
189#define	FOFFSET_LOCKED       0x1
190#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