source: rtems-libbsd/freebsd/sys/sys/file.h @ e599318

4.1155-freebsd-126-freebsd-12freebsd-9.3
Last change on this file since e599318 was e599318, checked in by Sebastian Huber <sebastian.huber@…>, on 10/09/13 at 20:52:54

Update files to match FreeBSD layout

Add compatibility with Newlib header files. Some FreeBSD header files
are mapped by the translation script:

o rtems/bsd/sys/_types.h
o rtems/bsd/sys/errno.h
o rtems/bsd/sys/lock.h
o rtems/bsd/sys/param.h
o rtems/bsd/sys/resource.h
o rtems/bsd/sys/time.h
o rtems/bsd/sys/timespec.h
o rtems/bsd/sys/types.h
o rtems/bsd/sys/unistd.h

It is now possible to include <sys/socket.h> directly for example.

Generate one Makefile which builds everything including tests.

  • Property mode set to 100644
File size: 8.7 KB
Line 
1/*-
2 * Copyright (c) 1982, 1986, 1989, 1993
3 *      The Regents of the University of California.  All rights reserved.
4 *
5 * Redistribution and use in source and binary forms, with or without
6 * modification, are permitted provided that the following conditions
7 * are met:
8 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 * 4. Neither the name of the University nor the names of its contributors
14 *    may be used to endorse or promote products derived from this software
15 *    without specific prior written permission.
16 *
17 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
20 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
27 * SUCH DAMAGE.
28 *
29 *      @(#)file.h      8.3 (Berkeley) 1/9/95
30 * $FreeBSD$
31 */
32
33#ifndef _SYS_FILE_H_
34#define _SYS_FILE_H_
35
36#ifndef _KERNEL
37#include <rtems/bsd/sys/types.h> /* XXX */
38#include <sys/fcntl.h>
39#include <rtems/bsd/sys/unistd.h>
40#else
41#include <sys/queue.h>
42#include <sys/refcount.h>
43#include <sys/_lock.h>
44#include <sys/_mutex.h>
45
46struct stat;
47struct thread;
48struct uio;
49struct knote;
50struct vnode;
51struct socket;
52
53
54#endif /* _KERNEL */
55
56#define DTYPE_VNODE     1       /* file */
57#define DTYPE_SOCKET    2       /* communications endpoint */
58#define DTYPE_PIPE      3       /* pipe */
59#define DTYPE_FIFO      4       /* fifo (named pipe) */
60#define DTYPE_KQUEUE    5       /* event queue */
61#define DTYPE_CRYPTO    6       /* crypto */
62#define DTYPE_MQUEUE    7       /* posix message queue */
63#define DTYPE_SHM       8       /* swap-backed shared memory */
64#define DTYPE_SEM       9       /* posix semaphore */
65#define DTYPE_PTS       10      /* pseudo teletype master device */
66
67#ifdef _KERNEL
68
69struct file;
70struct ucred;
71
72typedef int fo_rdwr_t(struct file *fp, struct uio *uio,
73                    struct ucred *active_cred, int flags,
74                    struct thread *td);
75#define FOF_OFFSET      1       /* Use the offset in uio argument */
76typedef int fo_truncate_t(struct file *fp, off_t length,
77                    struct ucred *active_cred, struct thread *td);
78typedef int fo_ioctl_t(struct file *fp, u_long com, void *data,
79                    struct ucred *active_cred, struct thread *td);
80typedef int fo_poll_t(struct file *fp, int events,
81                    struct ucred *active_cred, struct thread *td);
82typedef int fo_kqfilter_t(struct file *fp, struct knote *kn);
83typedef int fo_stat_t(struct file *fp, struct stat *sb,
84                    struct ucred *active_cred, struct thread *td);
85typedef int fo_close_t(struct file *fp, struct thread *td);
86typedef int fo_flags_t;
87
88struct fileops {
89        fo_rdwr_t       *fo_read;
90        fo_rdwr_t       *fo_write;
91        fo_truncate_t   *fo_truncate;
92        fo_ioctl_t      *fo_ioctl;
93        fo_poll_t       *fo_poll;
94        fo_kqfilter_t   *fo_kqfilter;
95        fo_stat_t       *fo_stat;
96        fo_close_t      *fo_close;
97        fo_flags_t      fo_flags;       /* DFLAG_* below */
98};
99
100#define DFLAG_PASSABLE  0x01    /* may be passed via unix sockets. */
101#define DFLAG_SEEKABLE  0x02    /* seekable / nonsequential */
102#endif /* _KERNEL */
103
104#if defined(_KERNEL) || defined(_WANT_FILE)
105/*
106 * Kernel descriptor table.
107 * One entry for each open kernel vnode and socket.
108 *
109 * Below is the list of locks that protects members in struct file.
110 *
111 * (f) protected with mtx_lock(mtx_pool_find(fp))
112 * (d) cdevpriv_mtx
113 * none not locked
114 */
115
116struct file {
117        void            *f_data;        /* file descriptor specific data */
118        struct fileops  *f_ops;         /* File operations */
119        struct ucred    *f_cred;        /* associated credentials. */
120        struct vnode    *f_vnode;       /* NULL or applicable vnode */
121        short           f_type;         /* descriptor type */
122        short           f_vnread_flags; /* (f) Sleep lock for f_offset */
123        volatile u_int  f_flag;         /* see fcntl.h */
124        volatile u_int  f_count;        /* reference count */
125        /*
126         *  DTYPE_VNODE specific fields.
127         */
128        int             f_seqcount;     /* Count of sequential accesses. */
129        off_t           f_nextoff;      /* next expected read/write offset. */
130        struct cdev_privdata *f_cdevpriv; /* (d) Private data for the cdev. */
131        /*
132         *  DFLAG_SEEKABLE specific fields
133         */
134        off_t           f_offset;
135        /*
136         * Mandatory Access control information.
137         */
138        void            *f_label;       /* Place-holder for MAC label. */
139};
140
141#define FOFFSET_LOCKED       0x1
142#define FOFFSET_LOCK_WAITING 0x2                 
143
144#endif /* _KERNEL || _WANT_FILE */
145
146/*
147 * Userland version of struct file, for sysctl
148 */
149struct xfile {
150        size_t  xf_size;        /* size of struct xfile */
151        pid_t   xf_pid;         /* owning process */
152        uid_t   xf_uid;         /* effective uid of owning process */
153        int     xf_fd;          /* descriptor number */
154        void    *xf_file;       /* address of struct file */
155        short   xf_type;        /* descriptor type */
156        int     xf_count;       /* reference count */
157        int     xf_msgcount;    /* references from message queue */
158        off_t   xf_offset;      /* file offset */
159        void    *xf_data;       /* file descriptor specific data */
160        void    *xf_vnode;      /* vnode pointer */
161        u_int   xf_flag;        /* flags (see fcntl.h) */
162};
163
164#ifdef _KERNEL
165
166#ifdef MALLOC_DECLARE
167MALLOC_DECLARE(M_FILE);
168#endif
169
170extern struct fileops vnops;
171extern struct fileops badfileops;
172extern struct fileops socketops;
173extern int maxfiles;            /* kernel limit on number of open files */
174extern int maxfilesperproc;     /* per process limit on number of open files */
175extern volatile int openfiles;  /* actual number of open files */
176
177int fget(struct thread *td, int fd, struct file **fpp);
178int fget_read(struct thread *td, int fd, struct file **fpp);
179int fget_write(struct thread *td, int fd, struct file **fpp);
180int _fdrop(struct file *fp, struct thread *td);
181
182/*
183 * The socket operations are used a couple of places.
184 * XXX: This is wrong, they should go through the operations vector for
185 * XXX: sockets instead of going directly for the individual functions. /phk
186 */
187fo_rdwr_t       soo_read;
188fo_rdwr_t       soo_write;
189fo_truncate_t   soo_truncate;
190fo_ioctl_t      soo_ioctl;
191fo_poll_t       soo_poll;
192fo_kqfilter_t   soo_kqfilter;
193fo_stat_t       soo_stat;
194fo_close_t      soo_close;
195
196void finit(struct file *, u_int, short, void *, struct fileops *);
197int fgetvp(struct thread *td, int fd, struct vnode **vpp);
198int fgetvp_read(struct thread *td, int fd, struct vnode **vpp);
199int fgetvp_write(struct thread *td, int fd, struct vnode **vpp);
200
201int fgetsock(struct thread *td, int fd, struct socket **spp, u_int *fflagp);
202void fputsock(struct socket *sp);
203
204#define fhold(fp)                                                       \
205        (refcount_acquire(&(fp)->f_count))
206#define fdrop(fp, td)                                                   \
207        (refcount_release(&(fp)->f_count) ? _fdrop((fp), (td)) : 0)
208
209static __inline fo_rdwr_t       fo_read;
210static __inline fo_rdwr_t       fo_write;
211static __inline fo_truncate_t   fo_truncate;
212static __inline fo_ioctl_t      fo_ioctl;
213static __inline fo_poll_t       fo_poll;
214static __inline fo_kqfilter_t   fo_kqfilter;
215static __inline fo_stat_t       fo_stat;
216static __inline fo_close_t      fo_close;
217
218static __inline int
219fo_read(fp, uio, active_cred, flags, td)
220        struct file *fp;
221        struct uio *uio;
222        struct ucred *active_cred;
223        int flags;
224        struct thread *td;
225{
226
227        return ((*fp->f_ops->fo_read)(fp, uio, active_cred, flags, td));
228}
229
230static __inline int
231fo_write(fp, uio, active_cred, flags, td)
232        struct file *fp;
233        struct uio *uio;
234        struct ucred *active_cred;
235        int flags;
236        struct thread *td;
237{
238
239        return ((*fp->f_ops->fo_write)(fp, uio, active_cred, flags, td));
240}
241
242static __inline int
243fo_truncate(fp, length, active_cred, td)
244        struct file *fp;
245        off_t length;
246        struct ucred *active_cred;
247        struct thread *td;
248{
249
250        return ((*fp->f_ops->fo_truncate)(fp, length, active_cred, td));
251}
252
253static __inline int
254fo_ioctl(fp, com, data, active_cred, td)
255        struct file *fp;
256        u_long com;
257        void *data;
258        struct ucred *active_cred;
259        struct thread *td;
260{
261
262        return ((*fp->f_ops->fo_ioctl)(fp, com, data, active_cred, td));
263}
264
265static __inline int
266fo_poll(fp, events, active_cred, td)
267        struct file *fp;
268        int events;
269        struct ucred *active_cred;
270        struct thread *td;
271{
272
273        return ((*fp->f_ops->fo_poll)(fp, events, active_cred, td));
274}
275
276static __inline int
277fo_stat(fp, sb, active_cred, td)
278        struct file *fp;
279        struct stat *sb;
280        struct ucred *active_cred;
281        struct thread *td;
282{
283
284        return ((*fp->f_ops->fo_stat)(fp, sb, active_cred, td));
285}
286
287static __inline int
288fo_close(fp, td)
289        struct file *fp;
290        struct thread *td;
291{
292
293        return ((*fp->f_ops->fo_close)(fp, td));
294}
295
296static __inline int
297fo_kqfilter(fp, kn)
298        struct file *fp;
299        struct knote *kn;
300{
301
302        return ((*fp->f_ops->fo_kqfilter)(fp, kn));
303}
304
305#endif /* _KERNEL */
306
307#endif /* !SYS_FILE_H */
Note: See TracBrowser for help on using the repository browser.