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_ */ 238