os/ossrv/genericopenlibs/openenvcore/include/sys/file.h
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
     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  * ©  Portions Copyright (c) 2007 Nokia Corporation and/or its subsidiary(-ies). All rights reserved.
    29  *	@(#)file.h	8.3 (Berkeley) 1/9/95
    30  * $FreeBSD: src/sys/sys/file.h,v 1.70 2005/02/10 12:27:58 phk Exp $
    31  */
    32 
    33 #ifndef _SYS_FILE_H_
    34 #define	_SYS_FILE_H_
    35 
    36 #ifndef _KERNEL
    37 #include <sys/types.h> /* XXX */
    38 #include <sys/fcntl.h>
    39 #include <sys/unistd.h>
    40 #else
    41 #include <sys/queue.h>
    42 #include <sys/_lock.h>
    43 #include <sys/_mutex.h>
    44 
    45 struct stat;
    46 struct thread;
    47 struct uio;
    48 struct knote;
    49 struct vnode;
    50 struct socket;
    51 
    52 
    53 #endif /* _KERNEL */
    54 
    55 #define	DTYPE_VNODE	1	/* file */
    56 #define	DTYPE_SOCKET	2	/* communications endpoint */
    57 #define	DTYPE_PIPE	3	/* pipe */
    58 #define	DTYPE_FIFO	4	/* fifo (named pipe) */
    59 #define	DTYPE_KQUEUE	5	/* event queue */
    60 #define	DTYPE_CRYPTO	6	/* crypto */
    61 
    62 #ifdef _KERNEL
    63 
    64 struct file;
    65 struct ucred;
    66 
    67 typedef int fo_rdwr_t(struct file *fp, struct uio *uio,
    68 		    struct ucred *active_cred, int flags,
    69 		    struct thread *td);
    70 #define	FOF_OFFSET	1	/* Use the offset in uio argument */
    71 typedef	int fo_ioctl_t(struct file *fp, u_long com, void *data,
    72 		    struct ucred *active_cred, struct thread *td);
    73 typedef	int fo_poll_t(struct file *fp, int events,
    74 		    struct ucred *active_cred, struct thread *td);
    75 typedef	int fo_kqfilter_t(struct file *fp, struct knote *kn);
    76 typedef	int fo_stat_t(struct file *fp, struct stat *sb,
    77 		    struct ucred *active_cred, struct thread *td);
    78 typedef	int fo_close_t(struct file *fp, struct thread *td);
    79 typedef	int fo_flags_t;
    80 
    81 struct fileops {
    82 	fo_rdwr_t	*fo_read;
    83 	fo_rdwr_t	*fo_write;
    84 	fo_ioctl_t	*fo_ioctl;
    85 	fo_poll_t	*fo_poll;
    86 	fo_kqfilter_t	*fo_kqfilter;
    87 	fo_stat_t	*fo_stat;
    88 	fo_close_t	*fo_close;
    89 	fo_flags_t	fo_flags;	/* DFLAG_* below */
    90 };
    91 
    92 #define DFLAG_PASSABLE	0x01	/* may be passed via unix sockets. */
    93 #define DFLAG_SEEKABLE	0x02	/* seekable / nonsequential */
    94 
    95 /*
    96  * Kernel descriptor table.
    97  * One entry for each open kernel vnode and socket.
    98  *
    99  * Below is the list of locks that protects members in struct file.
   100  *
   101  * (fl)	filelist_lock
   102  * (f)	f_mtx in struct file
   103  * none	not locked
   104  */
   105 
   106 struct file {
   107 	LIST_ENTRY(file) f_list;/* (fl) list of active files */
   108 	short	f_type;		/* descriptor type */
   109 	void	*f_data;	/* file descriptor specific data */
   110 	u_int	f_flag;		/* see fcntl.h */
   111 	struct mtx	*f_mtxp;	/* mutex to protect data */
   112 	struct fileops *f_ops;	/* File operations */
   113 	struct	ucred *f_cred;	/* credentials associated with descriptor */
   114 	int	f_count;	/* (f) reference count */
   115 	struct vnode *f_vnode;	/* NULL or applicable vnode */
   116 
   117 	/* DFLAG_SEEKABLE specific fields */
   118 	off_t	f_offset;
   119 
   120 	/* DTYPE_SOCKET specific fields */
   121 	short	f_gcflag;	/* used by thread doing fd garbage collection */
   122 #define	FMARK		0x1	/* mark during gc() */
   123 #define	FDEFER		0x2	/* defer for next gc pass */
   124 	int	f_msgcount;	/* (f) references from message queue */
   125 
   126 	/* DTYPE_VNODE specific fields */
   127 	int	f_seqcount;	/*
   128 				 * count of sequential accesses -- cleared
   129 				 * by most seek operations.
   130 				 */
   131 	off_t	f_nextoff;	/*
   132 				 * offset of next expected read or write
   133 				 */
   134 	void	*f_label;	/* Place-holder for struct label pointer. */
   135 };
   136 
   137 #endif /* _KERNEL */
   138 
   139 /*
   140  * Userland version of struct file, for sysctl
   141  */
   142 struct xfile {
   143 	size_t	xf_size;	/* size of struct xfile */
   144 	pid_t	xf_pid;		/* owning process */
   145 	uid_t	xf_uid;		/* effective uid of owning process */
   146 	int	xf_fd;		/* descriptor number */
   147 	void	*xf_file;	/* address of struct file */
   148 	short	xf_type;	/* descriptor type */
   149 	int	xf_count;	/* reference count */
   150 	int	xf_msgcount;	/* references from message queue */
   151 	off_t	xf_offset;	/* file offset */
   152 	void	*xf_data;	/* file descriptor specific data */
   153 	void	*xf_vnode;	/* vnode pointer */
   154 	u_int	xf_flag;	/* flags (see fcntl.h) */
   155 };
   156 
   157 #ifdef _KERNEL
   158 extern struct filelist filehead; /* (fl) head of list of open files */
   159 extern struct fileops vnops;
   160 extern struct fileops badfileops;
   161 extern struct fileops socketops;
   162 extern int maxfiles;		/* kernel limit on number of open files */
   163 extern int maxfilesperproc;	/* per process limit on number of open files */
   164 extern int openfiles;		/* (fl) actual number of open files */
   165 extern struct sx filelist_lock; /* sx to protect filelist and openfiles */
   166 
   167 /*
   168  * The socket operations are used a couple of places.
   169  * XXX: This is wrong, they should go through the operations vector for
   170  * XXX: sockets instead of going directly for the individual functions. /phk
   171  */
   172 fo_rdwr_t	soo_read;
   173 fo_rdwr_t	soo_write;
   174 fo_ioctl_t	soo_ioctl;
   175 fo_poll_t	soo_poll;
   176 fo_kqfilter_t	soo_kqfilter;
   177 fo_stat_t	soo_stat;
   178 fo_close_t	soo_close;
   179 
   180 /* Lock a file. */
   181 #define	FILE_LOCK(f)	mtx_lock((f)->f_mtxp)
   182 #define	FILE_UNLOCK(f)	mtx_unlock((f)->f_mtxp)
   183 #define	FILE_LOCKED(f)	mtx_owned((f)->f_mtxp)
   184 #define	FILE_LOCK_ASSERT(f, type) mtx_assert((f)->f_mtxp, (type))
   185 
   186 #define	fhold_locked(fp)						\
   187 	do {								\
   188 		FILE_LOCK_ASSERT(fp, MA_OWNED);				\
   189 		(fp)->f_count++;					\
   190 	} while (0)
   191 
   192 #define	fhold(fp)							\
   193 	do {								\
   194 		FILE_LOCK(fp);						\
   195 		(fp)->f_count++;					\
   196 		FILE_UNLOCK(fp);					\
   197 	} while (0)
   198 
   199 static __inline fo_rdwr_t	fo_read;
   200 static __inline fo_rdwr_t	fo_write;
   201 static __inline fo_ioctl_t	fo_ioctl;
   202 static __inline fo_poll_t	fo_poll;
   203 static __inline fo_kqfilter_t	fo_kqfilter;
   204 static __inline fo_stat_t	fo_stat;
   205 static __inline fo_close_t	fo_close;
   206 
   207 static __inline int
   208 fo_read(fp, uio, active_cred, flags, td)
   209 	struct file *fp;
   210 	struct uio *uio;
   211 	struct ucred *active_cred;
   212 	int flags;
   213 	struct thread *td;
   214 {
   215 
   216 	return ((*fp->f_ops->fo_read)(fp, uio, active_cred, flags, td));
   217 }
   218 
   219 static __inline int
   220 fo_write(fp, uio, active_cred, flags, td)
   221 	struct file *fp;
   222 	struct uio *uio;
   223 	struct ucred *active_cred;
   224 	int flags;
   225 	struct thread *td;
   226 {
   227 
   228 	return ((*fp->f_ops->fo_write)(fp, uio, active_cred, flags, td));
   229 }
   230 
   231 static __inline int
   232 fo_ioctl(fp, com, data, active_cred, td)
   233 	struct file *fp;
   234 	u_long com;
   235 	void *data;
   236 	struct ucred *active_cred;
   237 	struct thread *td;
   238 {
   239 
   240 	return ((*fp->f_ops->fo_ioctl)(fp, com, data, active_cred, td));
   241 }
   242 
   243 static __inline int
   244 fo_poll(fp, events, active_cred, td)
   245 	struct file *fp;
   246 	int events;
   247 	struct ucred *active_cred;
   248 	struct thread *td;
   249 {
   250 
   251 	return ((*fp->f_ops->fo_poll)(fp, events, active_cred, td));
   252 }
   253 
   254 static __inline int
   255 fo_stat(fp, sb, active_cred, td)
   256 	struct file *fp;
   257 	struct stat *sb;
   258 	struct ucred *active_cred;
   259 	struct thread *td;
   260 {
   261 
   262 	return ((*fp->f_ops->fo_stat)(fp, sb, active_cred, td));
   263 }
   264 
   265 static __inline int
   266 fo_close(fp, td)
   267 	struct file *fp;
   268 	struct thread *td;
   269 {
   270 
   271 	return ((*fp->f_ops->fo_close)(fp, td));
   272 }
   273 
   274 static __inline int
   275 fo_kqfilter(fp, kn)
   276 	struct file *fp;
   277 	struct knote *kn;
   278 {
   279 
   280 	return ((*fp->f_ops->fo_kqfilter)(fp, kn));
   281 }
   282 
   283 #endif /* _KERNEL */
   284 
   285 #endif /* !SYS_FILE_H */