| 1 | /*	$NetBSD: file.h,v 1.93 2023/07/10 02:31:55 christos 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/types.h> |
| 67 | |
| 68 | #include <sys/fcntl.h> |
| 69 | #include <sys/unistd.h> |
| 70 | |
| 71 | #if defined(_KERNEL) || defined(_KMEMUSER) |
| 72 | #include <sys/queue.h> |
| 73 | #include <sys/mutex.h> |
| 74 | #include <sys/condvar.h> |
| 75 | |
| 76 | struct flock; |
| 77 | struct iovec; |
| 78 | struct knote; |
| 79 | struct lwp; |
| 80 | struct proc; |
| 81 | struct stat; |
| 82 | struct uio; |
| 83 | struct uvm_object; |
| 84 | |
| 85 | struct fileops { |
| 86 | 	const char *fo_name; |
| 87 | 	int	(*fo_read)	(struct file *, off_t *, struct uio *, |
| 88 | 				 kauth_cred_t, int); |
| 89 | 	int	(*fo_write)	(struct file *, off_t *, struct uio *, |
| 90 | 				 kauth_cred_t, int); |
| 91 | 	int	(*fo_ioctl)	(struct file *, u_long, void *); |
| 92 | 	int	(*fo_fcntl)	(struct file *, u_int, void *); |
| 93 | 	int	(*fo_poll)	(struct file *, int); |
| 94 | 	int	(*fo_stat)	(struct file *, struct stat *); |
| 95 | 	int	(*fo_close)	(struct file *); |
| 96 | 	int	(*fo_kqfilter)	(struct file *, struct knote *); |
| 97 | 	void	(*fo_restart)	(struct file *); |
| 98 | 	int	(*fo_mmap)	(struct file *, off_t *, size_t, int, int *, |
| 99 | 				 int *, struct uvm_object **, int *); |
| 100 | 	int	(*fo_seek)	(struct file *, off_t, int, off_t *, int); |
| 101 | 	int	(*fo_advlock)	(struct file *, void *, int, struct flock *, |
| 102 | 				 int); |
| 103 | 	int	(*fo_fpathconf)	(struct file *, int, register_t *); |
| 104 | 	int	(*fo_posix_fadvise) |
| 105 | 				(struct file *, off_t, off_t, int); |
| 106 | 	int	(*fo_truncate)	(struct file *, off_t); |
| 107 | }; |
| 108 | |
| 109 | union file_data { |
| 110 | 	struct vnode *fd_vp;		// DTYPE_VNODE |
| 111 | 	struct socket *fd_so;		// DTYPE_SOCKET |
| 112 | 	struct pipe *fd_pipe;		// DTYPE_PIPE |
| 113 | 	struct kqueue *fd_kq;		// DTYPE_KQUEUE |
| 114 | 	struct eventfd *fd_eventfd;	// DTYPE_EVENTFD |
| 115 | 	struct timerfd *fd_timerfd;	// DTYPE_TIMERFD |
| 116 | 	void *fd_data;			// DTYPE_MISC |
| 117 | 	struct audio_file *fd_audioctx;	// DTYPE_MISC (audio) |
| 118 | 	struct pad_softc *fd_pad;	// DTYPE_MISC (pad) |
| 119 | 	int fd_devunit;			// DTYPE_MISC (tap) |
| 120 | 	struct bpf_d *fd_bpf;		// DTYPE_MISC (bpf) |
| 121 | 	struct fcrypt *fd_fcrypt;	// DTYPE_CRYPTO is not used |
| 122 | 	struct mqueue *fd_mq;		// DTYPE_MQUEUE |
| 123 | 	struct ksem *fd_ks;		// DTYPE_SEM |
| 124 | 	struct iscsifd *fd_iscsi;	// DTYPE_MISC (iscsi) |
| 125 | 	struct memfd *fd_memfd;		// DTYPE_MEMFD |
| 126 | }; |
| 127 | |
| 128 | /* |
| 129 | * Kernel file descriptor. One entry for each open kernel vnode and |
| 130 | * socket. |
| 131 | * |
| 132 | * This structure is exported via the KERN_FILE sysctl. |
| 133 | * Only add members to the end, do not delete them. |
| 134 | * |
| 135 | * Note: new code should not use KERN_FILE; use KERN_FILE2 instead, |
| 136 | * which exports struct kinfo_file instead; struct kinfo_file is |
| 137 | * declared in sys/sysctl.h and is meant to be ABI-stable. |
| 138 | */ |
| 139 | struct file { |
| 140 | 	off_t		f_offset;	/* first, is 64-bit */ |
| 141 | 	kauth_cred_t 	f_cred;		/* creds associated with descriptor */ |
| 142 | 	const struct fileops *f_ops; |
| 143 | 	union file_data	f_undata;	/* descriptor data, e.g. vnode/socket */ |
| 144 | 	LIST_ENTRY(file) f_list;	/* list of active files */ |
| 145 | 	kmutex_t	f_lock;		/* lock on structure */ |
| 146 | 	int		f_flag;		/* see fcntl.h */ |
| 147 | 	u_int		f_marker;	/* traversal marker (sysctl) */ |
| 148 | 	u_int		f_type;		/* descriptor type */ |
| 149 | 	u_int		f_advice;	/* access pattern hint; UVM_ADV_* */ |
| 150 | 	u_int		f_count;	/* reference count */ |
| 151 | 	u_int		f_msgcount;	/* references from message queue */ |
| 152 | 	u_int		f_unpcount;	/* deferred close: see uipc_usrreq.c */ |
| 153 | 	SLIST_ENTRY(file) f_unplist;	/* deferred close: see uipc_usrreq.c */ |
| 154 | }; |
| 155 | |
| 156 | #define f_vnode		f_undata.fd_vp |
| 157 | #define f_socket	f_undata.fd_so |
| 158 | #define f_pipe		f_undata.fd_pipe |
| 159 | #define f_kqueue	f_undata.fd_kq |
| 160 | #define f_data		f_undata.fd_data |
| 161 | #define f_mqueue	f_undata.fd_mq |
| 162 | #define f_ksem		f_undata.fd_ks |
| 163 | #define f_eventfd	f_undata.fd_eventfd |
| 164 | #define f_timerfd	f_undata.fd_timerfd |
| 165 | #define f_memfd		f_undata.fd_memfd |
| 166 | |
| 167 | #define f_rndctx	f_undata.fd_rndctx |
| 168 | #define f_audioctx	f_undata.fd_audioctx |
| 169 | #define f_pad		f_undata.fd_pad |
| 170 | #define f_devunit	f_undata.fd_devunit |
| 171 | #define f_bpf		f_undata.fd_bpf |
| 172 | #define f_fcrypt	f_undata.fd_fcrypt |
| 173 | #define f_iscsi		f_undata.fd_iscsi |
| 174 | #endif /* _KERNEL || _KMEMUSER */ |
| 175 | |
| 176 | /* |
| 177 | * Descriptor types. |
| 178 | */ |
| 179 | |
| 180 | #define	DTYPE_VNODE	1		/* file */ |
| 181 | #define	DTYPE_SOCKET	2		/* communications endpoint */ |
| 182 | #define	DTYPE_PIPE	3		/* pipe */ |
| 183 | #define	DTYPE_KQUEUE	4		/* event queue */ |
| 184 | #define	DTYPE_MISC	5		/* misc file descriptor type */ |
| 185 | #define	DTYPE_CRYPTO	6		/* crypto */ |
| 186 | #define	DTYPE_MQUEUE	7		/* message queue */ |
| 187 | #define	DTYPE_SEM	8		/* semaphore */ |
| 188 | #define	DTYPE_EVENTFD	9		/* eventfd */ |
| 189 | #define	DTYPE_TIMERFD	10		/* timerfd */ |
| 190 | #define	DTYPE_MEMFD	11		/* memfd */ |
| 191 | |
| 192 | #define DTYPE_NAMES	\ |
| 193 | "0", "file", "socket", "pipe", "kqueue", "misc", "crypto", "mqueue", \ |
| 194 | "semaphore", "eventfd", "timerfd", "memfd" |
| 195 | |
| 196 | #ifdef _KERNEL |
| 197 | |
| 198 | /* |
| 199 | * Flags for fo_read and fo_write and do_fileread/write/v |
| 200 | */ |
| 201 | #define	FOF_UPDATE_OFFSET	0x0001	/* update the file offset */ |
| 202 | #define	FOF_IOV_SYSSPACE	0x0100	/* iov structure in kernel memory */ |
| 203 | |
| 204 | LIST_HEAD(filelist, file); |
| 205 | extern struct filelist	filehead;	/* head of list of open files */ |
| 206 | extern u_int		maxfiles;	/* kernel limit on # of open files */ |
| 207 | |
| 208 | extern const struct fileops vnops;	/* vnode operations for files */ |
| 209 | |
| 210 | int	dofileread(int, struct file *, void *, size_t, |
| 211 | 	 off_t *, int, register_t *); |
| 212 | int	dofilewrite(int, struct file *, const void *, |
| 213 | 	 size_t, off_t *, int, register_t *); |
| 214 | |
| 215 | int	do_filereadv(int, const struct iovec *, int, off_t *, |
| 216 | 	 int, register_t *); |
| 217 | int	do_filewritev(int, const struct iovec *, int, off_t *, |
| 218 | 	 int, register_t *); |
| 219 | |
| 220 | int	fsetown(pid_t *, u_long, const void *); |
| 221 | int	fgetown(pid_t, u_long, void *); |
| 222 | void	fownsignal(pid_t, int, int, int, void *); |
| 223 | |
| 224 | /* Commonly used fileops */ |
| 225 | int	fnullop_fcntl(struct file *, u_int, void *); |
| 226 | int	fnullop_poll(struct file *, int); |
| 227 | int	fnullop_kqfilter(struct file *, struct knote *); |
| 228 | int	fbadop_read(struct file *, off_t *, struct uio *, kauth_cred_t, int); |
| 229 | int	fbadop_write(struct file *, off_t *, struct uio *, kauth_cred_t, int); |
| 230 | int	fbadop_ioctl(struct file *, u_long, void *); |
| 231 | int	fbadop_close(struct file *); |
| 232 | int	fbadop_stat(struct file *, struct stat *); |
| 233 | void	fnullop_restart(struct file *); |
| 234 | |
| 235 | #endif /* _KERNEL */ |
| 236 | |
| 237 | #endif /* _SYS_FILE_H_ */ |