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