4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/** @file
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync The EFI kernel's interpretation of a "file".
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This program and the accompanying materials are licensed and made available
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync under the terms and conditions of the BSD License which accompanies this
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync distribution. The full text of the license may be found at
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync http://opensource.org/licenses/bsd-license.php.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Copyright (c) 1982, 1986, 1989, 1993
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The Regents of the University of California. All rights reserved.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Redistribution and use in source and binary forms, with or without
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * modification, are permitted provided that the following conditions
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * are met:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 1. Redistributions of source code must retain the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 2. Redistributions in binary form must reproduce the above copyright
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * notice, this list of conditions and the following disclaimer in the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * documentation and/or other materials provided with the distribution.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 3. Neither the name of the University nor the names of its contributors
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * may be used to endorse or promote products derived from this software
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * without specific prior written permission.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * SUCH DAMAGE.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * file.h 8.3 (Berkeley) 1/9/95
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync NetBSD: file.h,v 1.56 2006/05/14 21:38:18 elad Exp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync**/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifndef _PIF_KFILE_H_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define _PIF_KFILE_H_
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Uefi.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/SimpleTextOut.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <Protocol/SimpleFileSystem.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <wchar.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <stdarg.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <sys/fcntl.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include <sys/unistd.h>
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct stat;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct fileops;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct _Device_Node;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* The number of "special" character stream devices.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync These include:
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync stdin, stdout, stderr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define NUM_SPECIAL 3
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Organization of the f_iflags member of the __filedes structure. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DTYPE_MASK 0x00000007 ///< Device Type
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DTYPE_VNODE 1 /* file */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DTYPE_SOCKET 2 /* communications endpoint */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DTYPE_PIPE 3 /* pipe */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DTYPE_KQUEUE 4 /* event queue */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DTYPE_MISC 5 /* misc file descriptor type */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DTYPE_CRYPTO 6 /* crypto */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define DTYPE_NAMES "0", "file", "socket", "pipe", "kqueue", "misc", "crypto"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FIF_WANTCLOSE 0x10000000 /* a close is waiting for usecount */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FIF_DELCLOSE 0x20000000 /* Delete on close. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FIF_LARVAL 0x80000000 /* not fully constructed; don't use */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync This structure must be a multiple of 8 bytes in length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct __filedes {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync off_t f_offset; /* current position in file */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const struct fileops *f_ops;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void *devdata; /* Device-specific data */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int Oflags; // From the open call
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int Omode; // From the open call
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int RefCount; // Reference count of opens
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 f_flag; /* see fcntl.h */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 f_iflags; // In use if non-zero
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 MyFD; // Which FD this is.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 Reserved_1; // Force this structure to be a multiple of 8-bytes in length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct fileops {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* These functions must always be implemented. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (EFIAPI *fo_close) (struct __filedes *filp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ssize_t (EFIAPI *fo_read) (struct __filedes *filp, off_t *Offset, size_t Len, void *Buf);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ssize_t (EFIAPI *fo_write) (struct __filedes *filp, off_t *Offset, size_t Len, const void *Buf);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Call the fnullop_* version of these functions if not implemented by the device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (EFIAPI *fo_fcntl) (struct __filedes *filp, UINT32 Cmd, void *p3, void *p4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync short (EFIAPI *fo_poll) (struct __filedes *filp, short Events);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (EFIAPI *fo_flush) (struct __filedes *filp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Call the fbadop_* version of these functions if not implemented by the device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (EFIAPI *fo_stat) (struct __filedes *filp, struct stat *StatBuf, void *Buf);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (EFIAPI *fo_ioctl) (struct __filedes *filp, ULONGN Cmd, va_list argp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (EFIAPI *fo_delete) (struct __filedes *filp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (EFIAPI *fo_rmdir) (struct __filedes *filp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (EFIAPI *fo_mkdir) (const char *path, __mode_t perms);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (EFIAPI *fo_rename) (const char *from, const char *to);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Use a NULL if this function has not been implemented by the device. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync off_t (EFIAPI *fo_lseek) (struct __filedes *filp, off_t, int);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* A generic instance structure which is valid for
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for all device instance structures.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync All device instance structures MUST be a multiple of 8-bytes in length.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef struct {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 Cookie; ///< Special value identifying this as a valid Instance
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 InstanceNum; ///< Which instance is this? Zero-based.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE Dev; ///< Pointer to either Input or Output Protocol.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct _Device_Node *Parent; ///< Points to the parent Device Node.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct fileops Abstraction; ///< Pointers to functions implementing this device's abstraction.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINTN Reserved_1; // Force this to always be a multiple of 8-bytes in length
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} GenericInstance;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Type of all Device-specific handler's open routines. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (EFIAPI *FO_OPEN) (struct _Device_Node *This, struct __filedes *FD,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int Instance, wchar_t *Path, wchar_t *MPath);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FILE_IS_USABLE(fp) (((fp)->f_iflags & \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (FIF_WANTCLOSE|FIF_LARVAL)) == 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FILE_SET_MATURE(fp) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncdo { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (fp)->f_iflags &= ~FIF_LARVAL; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} while (/*CONSTCOND*/0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Flags for fo_read and fo_write.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FOF_UPDATE_OFFSET 0x01 /* update the file offset */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync__BEGIN_DECLS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint fdcreate (CHAR16 *, UINT32, UINT32, BOOLEAN, VOID *, const struct fileops *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Commonly used fileops
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fnullop_* Does nothing and returns success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fbadop_* Does nothing and returns EPERM
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint EFIAPI fnullop_fcntl (struct __filedes *filp, UINT32 Cmd, void *p3, void *p4);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncshort EFIAPI fnullop_poll (struct __filedes *filp, short Events);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint EFIAPI fnullop_flush (struct __filedes *filp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint EFIAPI fbadop_stat (struct __filedes *filp, struct stat *StatBuf, void *Buf);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint EFIAPI fbadop_ioctl (struct __filedes *filp, ULONGN Cmd, va_list argp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint EFIAPI fbadop_delete (struct __filedes *filp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint EFIAPI fbadop_rmdir (struct __filedes *filp);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint EFIAPI fbadop_mkdir (const char *path, __mode_t perms);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint EFIAPI fbadop_rename (const char *from, const char *to);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync__END_DECLS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* From the original file... */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if 0
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//struct proc;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//struct lwp;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//struct uio;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//struct iovec;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//struct knote;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//LIST_HEAD(filelist, file);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//extern struct filelist filehead; /* head of list of open files */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//extern int maxfiles; /* kernel limit on # of open files */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//extern int nfiles; /* actual number of open files */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//extern const struct fileops vnops; /* vnode operations for files */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct fileops {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (*fo_read) (struct file *, off_t *, struct uio *, kauth_cred_t, int);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (*fo_write) (struct file *, off_t *, struct uio *, kauth_cred_t, int);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (*fo_ioctl) (struct file *, u_long, void *, struct lwp *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (*fo_fcntl) (struct file *, u_int, void *, struct lwp *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (*fo_poll) (struct file *, int, struct lwp *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (*fo_stat) (struct file *, struct stat *, struct lwp *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int (*fo_close) (struct file *, struct lwp *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Kernel descriptor table.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * One entry for each open kernel vnode and socket.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstruct file {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync LIST_ENTRY(file) f_list; /* list of active files */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void *f_data; /* descriptor data, e.g. vnode/socket */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync const struct fileops *f_ops;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync void *f_DevDesc; /* Device Descriptor pointer */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_FILE_HANDLE FileHandle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync EFI_HANDLE Handle;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync off_t f_offset; /* current position in file */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int f_flag; /* see fcntl.h */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT32 f_iflags; /* internal flags; FIF_* */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int f_advice; /* access pattern hint; UVM_ADV_* */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int f_type; /* descriptor type */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int f_usecount; /* number active users */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync u_int f_count; /* reference count */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync u_int f_msgcount; /* references from message queue */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// kauth_cred_t f_cred; /* creds associated with descriptor */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync struct simplelock f_slock;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync UINT16 MyFD; /* Which FD this is. */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync};
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DIAGNOSTIC
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FILE_USE_CHECK(fp, str) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((fp)->f_usecount < 0) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync panic(str); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} while (/* CONSTCOND */ 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FILE_USE_CHECK(fp, str) /* nothing */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * FILE_USE() must be called with the file lock held.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * (Typical usage is: `fp = fd_getfile(..); FILE_USE(fp);'
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * and fd_getfile() returns the file locked)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * fp is a pointer to a __filedes structure.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FILE_USE(fp) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (fp)->f_usecount++; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FILE_USE_CHECK((fp), "f_usecount overflow"); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync simple_unlock(&(fp)->f_slock); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (/* CONSTCOND */ 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FILE_UNUSE_WLOCK(fp, l, havelock) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync do { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (!(havelock)) \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync simple_lock(&(fp)->f_slock); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ((fp)->f_iflags & FIF_WANTCLOSE) { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync simple_unlock(&(fp)->f_slock); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* Will drop usecount */ \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (void) closef((fp), (l)); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync break; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } else { \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (fp)->f_usecount--; \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync FILE_USE_CHECK((fp), "f_usecount underflow"); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync simple_unlock(&(fp)->f_slock); \
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync } while (/* CONSTCOND */ 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FILE_UNUSE(fp, l) FILE_UNUSE_WLOCK(fp, l, 0)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define FILE_UNUSE_HAVELOCK(fp, l) FILE_UNUSE_WLOCK(fp, l, 1)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync__BEGIN_DECLS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int dofileread (struct lwp *, int, struct file *, void *, size_t, off_t *, int, register_t *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int dofilewrite (struct lwp *, int, struct file *, const void *, size_t, off_t *, int, register_t *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int dofilereadv (struct lwp *, int, struct file *, const struct iovec *, int, off_t *, int, register_t *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int dofilewritev(struct lwp *, int, struct file *, const struct iovec *, int, off_t *, int, register_t *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int fsetown (struct proc *, pid_t *, int, const void *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int fgetown (struct proc *, pid_t, int, void *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//void fownsignal (pid_t, int, int, int, void *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int fdclone (struct lwp *, struct file *, int, int, const struct fileops *, void *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* Commonly used fileops
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fnullop_* Does nothing and returns success.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync fbadop_* Does nothing and returns EPERM
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int fnullop_fcntl (struct file *, u_int, void *, struct lwp *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int fnullop_poll (struct file *, int, struct lwp *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int fnullop_kqfilter(struct file *, struct knote *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int fbadop_stat (struct file *, struct stat *, struct lwp *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//int fbadop_ioctl (struct file *, u_long, void *, struct lwp *);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync__END_DECLS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif /* _PIF_KFILE_H_ */