Project

General

Profile

Statistics
| Revision:

root / lab4 / .minix-src / include / sys / file.h @ 13

History | View | Annotate | Download (7.71 KB)

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