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