#if !defined(__sys_file_h)
#define __sys_file_h

#if !defined(_NO_IDENTS) && defined(_HEAD_IDENTS)
# pragma ident "@(#)head:sys/file.h	1.23 92/12/18 {Apple version 3.0 90/11/29 11:37:56}"
#endif

/*
 * Copyright 1987-91 Apple Computer, Inc.
 * All Rights Reserved.
 *
 * THIS IS UNPUBLISHED PROPRIETARY SOURCE CODE OF APPLE COMPUTER, INC.
 * The copyright notice above does not evidence any actual or
 * intended publication of such source code.
 */

/* Copyright 1984-85 AT&T */
/* Copyright 1980-87 The Regents of the University of California */

#if !defined(__sys_types_h)
# if defined(__MPW_C__)
#   include "/:usr:include:sys:types.h"
# else
#   include <sys/types.h>
# endif
#endif 

/*
 * Descriptor table entry.
 * One for each kernel object.
 */
struct	file {
	struct	file	*f_freel;	/* free list */
	struct	file	*f_activef;	/* active list forward */
	struct	file	*f_activeb;	/* active list backwards */
	int	f_flag;		/* see below */
	short	f_type;		/* descriptor type */
	short	f_count;	/* reference count */
	short	f_asiocnt;	/* outstanding asio's on this file */
	short	f_msgcount;	/* references from message queue */
	struct	fileops {
		int	(*fo_rw)();
		int	(*fo_ioctl)();
		int	(*fo_select)();
		int	(*fo_close)();
		int	(*fo_stat)();
		int     (*fo_setxinfo)();
	} *f_ops;
	caddr_t	f_data;		/* ptr to file specific struct (vnode/socket) */
	off_t	f_offset;
	struct	ucred *f_cred;	/* credentials of user who opened file */
};

#ifdef KERNEL
  extern int GNOFILE;			/* size of global file table(s) */
  extern struct file *file_freel;	/* file table free list */
  extern struct file *file_activel;	/* file table active list */

  struct file *getf();
  struct file *falloc();
#endif /* KERNEL */

/*
 * flags- also for fcntl call.
 */
#define	FOPEN		(-1)
#define	FREAD		0x00000001	/* descriptor read/receive'able */
#define	FWRITE		0x00000002	/* descriptor write/send'able */
#define	FNDELAY		0x00000004	/* no delay */
#define	FAPPEND		0x00000008	/* append on each write */

#define	FSHLOCK		0x00000010	/* shared lock present */
#define	FEXLOCK		0x00000020	/* exclusive lock present */
#define	FASYNC		0x00000040	/* signal pgrp when data ready */
#define	FSYNC		0x00000080	/* sychronous writes */

/* open only modes */
#define	FCREAT		0x00000100	/* create if nonexistent */
#define	FTRUNC		0x00000200	/* truncate to zero length */
#define	FEXCL		0x00000400	/* error if already created */

#define	FKERNEL		0x00000800	/* kernel is doing open */
#define FMARK	        0x00001000	/* mark during gc */
#define FDEFER	        0x00002000	/* defer for next gc pass */
#define FNONBLOCK       0x00004000	/* no delay POSIX style */
#define	FNOCTTY         0x00008000	/* don't assign controlling tty */
#define	FGETCTTY        0x00010000	/* force controlling tty assignment */
#if SEC_BASE
#define FSTOPIO         0x00020000      /* no further I/O operations */
#endif
#define FASIOSLP	0x00040000	/* waiting for asio in closef() */
#define FNOHUP          0x20000000      /* don't hang up on close */
#define FLOCKOUT        0x40000000      /* exclusive use only */
#define FGLOBAL         0x80000000      /* force allocation from the global table */

/* bits to save after open */
#define FMASK		(FREAD | FWRITE | FNDELAY | FNONBLOCK | FAPPEND | FASYNC | FNOCTTY | FGETCTTY | FSYNC | FGLOBAL)

#if SEC_BASE
#define FCNTLCANT       (FREAD | FWRITE | FSHLOCK | FEXLOCK | FCREAT | FTRUNC | FEXCL | FKERNEL | FMARK | FDEFER | FNOCTTY | FGETCTTY | FSTOPIO)
#else
#define	FCNTLCANT	(FREAD | FWRITE | FSHLOCK | FEXLOCK | FCREAT | FTRUNC | FEXCL | FKERNEL | FMARK | FDEFER | FNOCTTY | FGETCTTY)
#endif

#ifndef	F_DUPFD
/* fcntl(2) requests--from <fcntl.h> */
#define	F_DUPFD		0	/* Duplicate fildes */
#define	F_GETFD		1	/* Get fildes flags */
#define	F_SETFD		2	/* Set fildes flags */
#define	F_GETFL		3	/* Get file flags */
#define	F_SETFL		4	/* Set file flags */
#define	F_GETLK		5	/* Get file lock */
#define	F_SETLK		6	/* Set file lock */
#define	F_SETLKW	7	/* Set file lock and wait */
#define	F_GETOWN	8	/* Get owner */
#define	F_SETOWN	9	/* Set owner */
#endif

/*
 * User definitions.
 */

/*
 * Open call.
 */

#ifndef __fcntl_h	/* most are defined in fcntl.h already */
#define	O_RDONLY	000		/* open for reading */
#define	O_WRONLY	001		/* open for writing */
#define	O_RDWR		002		/* open for read & write */
#define	O_NDELAY	FNDELAY		/* non-blocking open */
#define O_NONBLOCK	FNONBLOCK	/* non-blocking posix style */
#define	O_APPEND	FAPPEND		/* append on each write */
#define	O_CREAT		FCREAT		/* open with file create */
#define	O_TRUNC		FTRUNC		/* open with truncation */
#define	O_EXCL		FEXCL		/* error on create if file exists */
#define	O_NOCTTY	FNOCTTY		/* don't assign controlling tty */
#define	O_GETCTTY	FGETCTTY	/* force controlling tty assignment */
#define O_GLOBAL        FGLOBAL         /* force allocation from the global table */
#define O_SYNC		FSYNC        	/* synchronous writes */
#endif	/* !__fcntl_h */
#define O_NOHUP         FNOHUP   	/* don't hang up on close */
#define O_LOCKOUT	FLOCKOUT        /* exclusive use only */


/*
 * Flock call.
 */
#define	LOCK_SH		1	/* shared lock */
#define	LOCK_EX		2	/* exclusive lock */
#define	LOCK_NB		4	/* don't block when locking */
#define	LOCK_UN		8	/* unlock */

/*
 * Access call.
 */
#define	F_OK		0	/* does file exist */
#define	X_OK		1	/* is it executable by caller */
#define	W_OK		2	/* writable by caller */
#define	R_OK		4	/* readable by caller */

/*
 * Lseek call.
 */
#define	L_SET		0	/* absolute offset */
#define	L_INCR		1	/* relative to current offset */
#define	L_XTND		2	/* relative to end of file */

#ifdef KERNEL
# define DTYPE_VNODE	1	/* file */
# define DTYPE_SOCKET	2	/* communications endpoint */
#endif

#endif /* __sys_file_h */