1 /*	$NetBSD: file.h,v 1.79 2015/05/30 20:09:47 joerg Exp $	*/
2 
3 /*-
4  * Copyright (c) 2009 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Andrew Doran.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  *
19  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29  * POSSIBILITY OF SUCH DAMAGE.
30  */
31 
32 /*
33  * Copyright (c) 1982, 1986, 1989, 1993
34  *	The Regents of the University of California.  All rights reserved.
35  *
36  * Redistribution and use in source and binary forms, with or without
37  * modification, are permitted provided that the following conditions
38  * are met:
39  * 1. Redistributions of source code must retain the above copyright
40  *    notice, this list of conditions and the following disclaimer.
41  * 2. Redistributions in binary form must reproduce the above copyright
42  *    notice, this list of conditions and the following disclaimer in the
43  *    documentation and/or other materials provided with the distribution.
44  * 3. Neither the name of the University nor the names of its contributors
45  *    may be used to endorse or promote products derived from this software
46  *    without specific prior written permission.
47  *
48  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
49  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
50  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
51  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
52  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
53  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
54  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
55  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
56  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
57  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
58  * SUCH DAMAGE.
59  *
60  *	@(#)file.h	8.3 (Berkeley) 1/9/95
61  */
62 
63 #ifndef _SYS_FILE_H_
64 #define	_SYS_FILE_H_
65 
66 #include <sys/fcntl.h>
67 #include <sys/unistd.h>
68 
69 #ifdef _KERNEL
70 #include <sys/queue.h>
71 #include <sys/mutex.h>
72 #include <sys/condvar.h>
73 
74 struct proc;
75 struct lwp;
76 struct uio;
77 struct iovec;
78 struct stat;
79 struct knote;
80 struct uvm_object;
81 
82 struct fileops {
83 	int	(*fo_read)	(struct file *, off_t *, struct uio *,
84 				    kauth_cred_t, int);
85 	int	(*fo_write)	(struct file *, off_t *, struct uio *,
86 				    kauth_cred_t, int);
87 	int	(*fo_ioctl)	(struct file *, u_long, void *);
88 	int	(*fo_fcntl)	(struct file *, u_int, void *);
89 	int	(*fo_poll)	(struct file *, int);
90 	int	(*fo_stat)	(struct file *, struct stat *);
91 	int	(*fo_close)	(struct file *);
92 	int	(*fo_kqfilter)	(struct file *, struct knote *);
93 	void	(*fo_restart)	(struct file *);
94 	int	(*fo_mmap)	(struct file *, off_t *, size_t, int, int *,
95 				 int *, struct uvm_object **, int *);
96 	void	(*fo_spare2)	(void);
97 };
98 
99 union file_data {
100 	struct vnode *fd_vp;		// DTYPE_VNODE
101 	struct socket *fd_so;		// DTYPE_SOCKET
102 	struct pipe *fd_pipe;		// DTYPE_PIPE
103 	struct kqueue *fd_kq;		// DTYPE_KQUEUE
104 	void *fd_data;			// DTYPE_MISC
105 	struct rnd_ctx *fd_rndctx;	// DTYPE_MISC (rnd)
106 	int fd_devunit;			// DTYPE_MISC (tap)
107 	struct bpf_d *fd_bpf;		// DTYPE_MISC (bpf)
108 	struct fcrypt *fd_fcrypt;	// DTYPE_CRYPTO is not used
109 	struct mqueue *fd_mq;		// DTYPE_MQUEUE
110 	struct ksem *fd_ks;		// DTYPE_SEM
111 	struct iscsifd *fd_iscsi;	// DTYPE_MISC (iscsi)
112 };
113 
114 /*
115  * Kernel file descriptor.  One entry for each open kernel vnode and
116  * socket.
117  *
118  * This structure is exported via the KERN_FILE and KERN_FILE2 sysctl
119  * calls.  Only add members to the end, do not delete them.
120  */
121 struct file {
122 	off_t		f_offset;	/* first, is 64-bit */
123 	kauth_cred_t 	f_cred;		/* creds associated with descriptor */
124 	const struct fileops *f_ops;
125 	union file_data	f_undata;	/* descriptor data, e.g. vnode/socket */
126 	LIST_ENTRY(file) f_list;	/* list of active files */
127 	kmutex_t	f_lock;		/* lock on structure */
128 	int		f_flag;		/* see fcntl.h */
129 	u_int		f_marker;	/* traversal marker (sysctl) */
130 	u_int		f_type;		/* descriptor type */
131 	u_int		f_advice;	/* access pattern hint; UVM_ADV_* */
132 	u_int		f_count;	/* reference count */
133 	u_int		f_msgcount;	/* references from message queue */
134 	u_int		f_unpcount;	/* deferred close: see uipc_usrreq.c */
135 	SLIST_ENTRY(file) f_unplist;	/* deferred close: see uipc_usrreq.c */
136 };
137 
138 #define f_vnode		f_undata.fd_vp
139 #define f_socket	f_undata.fd_so
140 #define f_pipe		f_undata.fd_pipe
141 #define f_kqueue	f_undata.fd_kq
142 #define f_data		f_undata.fd_data
143 #define f_mqueue	f_undata.fd_mq
144 #define f_ksem		f_undata.fd_ks
145 
146 #define f_rndctx	f_undata.fd_rndctx
147 #define f_devunit	f_undata.fd_devunit
148 #define f_bpf		f_undata.fd_bpf
149 #define f_fcrypt	f_undata.fd_fcrypt
150 #define f_iscsi		f_undata.fd_iscsi
151 #endif
152 
153 /*
154  * Descriptor types.
155  */
156 
157 #define	DTYPE_VNODE	1		/* file */
158 #define	DTYPE_SOCKET	2		/* communications endpoint */
159 #define	DTYPE_PIPE	3		/* pipe */
160 #define	DTYPE_KQUEUE	4		/* event queue */
161 #define	DTYPE_MISC	5		/* misc file descriptor type */
162 #define	DTYPE_CRYPTO	6		/* crypto */
163 #define	DTYPE_MQUEUE	7		/* message queue */
164 #define	DTYPE_SEM	8		/* semaphore */
165 
166 #define DTYPE_NAMES	\
167     "0", "file", "socket", "pipe", "kqueue", "misc", "crypto", "mqueue", \
168     "semaphore"
169 
170 #ifdef _KERNEL
171 
172 /*
173  * Flags for fo_read and fo_write and do_fileread/write/v
174  */
175 #define	FOF_UPDATE_OFFSET	0x0001	/* update the file offset */
176 #define	FOF_IOV_SYSSPACE	0x0100	/* iov structure in kernel memory */
177 
178 LIST_HEAD(filelist, file);
179 extern struct filelist	filehead;	/* head of list of open files */
180 extern u_int		maxfiles;	/* kernel limit on # of open files */
181 
182 extern const struct fileops vnops;	/* vnode operations for files */
183 
184 int	dofileread(int, struct file *, void *, size_t,
185 	    off_t *, int, register_t *);
186 int	dofilewrite(int, struct file *, const void *,
187 	    size_t, off_t *, int, register_t *);
188 
189 int	do_filereadv(int, const struct iovec *, int, off_t *,
190 	    int, register_t *);
191 int	do_filewritev(int, const struct iovec *, int, off_t *,
192 	    int, register_t *);
193 
194 int	fsetown(pid_t *, u_long, const void *);
195 int	fgetown(pid_t, u_long, void *);
196 void	fownsignal(pid_t, int, int, int, void *);
197 
198 /* Commonly used fileops */
199 int	fnullop_fcntl(struct file *, u_int, void *);
200 int	fnullop_poll(struct file *, int);
201 int	fnullop_kqfilter(struct file *, struct knote *);
202 int	fbadop_read(struct file *, off_t *, struct uio *, kauth_cred_t, int);
203 int	fbadop_write(struct file *, off_t *, struct uio *, kauth_cred_t, int);
204 int	fbadop_ioctl(struct file *, u_long, void *);
205 int	fbadop_close(struct file *);
206 int	fbadop_stat(struct file *, struct stat *);
207 void	fnullop_restart(struct file *);
208 
209 #endif /* _KERNEL */
210 
211 #endif /* _SYS_FILE_H_ */
212