fsiface.hh
//*************************************************************************
// MODULE : Process File System Support Object. *
// AUTHOR : Ron Chernich *
// PURPOSE: Encapsulates how Exec will interface to the file system, *
// presenting a FS wrapper api which is file system independent *
// HISTORY: *
// 30-AUG-94 First MS (Visual C++ 1.5) implementation. *
//*************************************************************************
#ifndef __FS_IFACE__
#define __FS_IFACE__
#include "cpmfs.hh"
///////////////////
// First, an arbitrary fixed limit on files per process and state
// values associated with each valid file instance..
//
#define MAX_FILES 8
#define FS_EOFmark 0x1a
/////////////////
// This class, which facilitates "high level" disk services on behalf
// of a single process through the "low level" file system primitives,
// runs as a "Finite State Automaton/Machine". The following enumeration
// defines the states; the comments give the events causing the state
// change. See the Tech Docs for an actual Finite State Diagram...
//
enum FSM {
FSM_Zombie, // the living dead state (can't happen)
FSM_Assigned, // Assign ok
FSM_Opening, // Open message sent
FSM_Creating, // Creat message sent
FSM_DiskFull, // Creat failed due full disk or directory
FSM_BufferMT, // Open/Creat 0k received, or read/write emptied buf
FSM_Reading, // Read message posted
FSM_DataAvailable, // Read ok received, data in buffer
FSM_BuffAvailable, // Write accepted and buffered for later
FSM_Writing, // Write message posted to flush buffer
FSM_Closing, // Close issued when nWriteCnt > 0
FSM_Closed, // Close (buffer flush and dir update) received
FSM_EOF, // after "Reading" when at End Of File
FSM_DiskError, // from reading/writing/closing - fatal error
FSM_Flushing, // write forced by close
FSM_Deleting, // "real" delete message posted from "Assigned"
FSM_NotExist, // delete fails from "deleting" (Purging ignores)
FSM_Exit // all over (trailing comma ok with new ANSI std)
};
////////////
// This structure extends the basic File Control Block. Each file
// to be maintained on behalf of the process requires one of these..
//
typedef struct xfcb_tag {
FCB Fcb; // FS File Control Block struct
FSM mState; // current FSM state for this file
UINT16 ndx; // deblocking I/O buffer index
UINT16 nErrCnt; // count of hard errors (one usually aborts)
UINT16 nReadCnt; // total file reads,
UINT16 nWriteCnt; // and writes (flush on close when non-zero)
char *pszTemp; // buffer write overflow holder
} XFCB, *PXFCB;
/////////////
// Everything a PID needs to know about the interface to any file system..
//
class FsIface {
private:
Knl *pTx; // copy of Exec Message dispatcher
UINT16 uID; // copy of Exec unique identifier
UINT16 uMagic; // "magic" number to offset array base
PXFCB pXfcb[MAX_FILES]; // files per process
BOOL ExpandName (char*, char*, UINT16); // expand name with wild card
inline UINT16 Idx (HANDLE h) { return (UINT16)h - uMagic; }
public:
FsIface (UINT16, Knl*);
~FsIface (void);
UINT16 IsEof (HANDLE); // check for End of File
UINT16 Open (HANDLE, UINT16 = FS_Ok); // open existing file
UINT16 Close (HANDLE, UINT16 = FS_Ok); // close and maybe flush
UINT16 Delete (HANDLE, UINT16 = FS_Ok); // delete if exists
UINT16 Creat (HANDLE, UINT16 = FS_Ok); // create new
UINT16 CloseAll (UINT16 = FS_Ok); // close and flush all
UINT16 Read (HANDLE, char&, UINT16 = FS_Ok); // read a char
UINT16 Read (HANDLE, char*, UINT16 = FS_Ok); // read delimited string
UINT16 Write (HANDLE, char, UINT16 = FS_Ok); // write single char
UINT16 Write (HANDLE, char*,UINT16 = FS_Ok); // write null terminated
UINT16 Stat (HANDLE, UINT16 = FS_Ok); // get (open) file size
UINT16 FindFirst (HANDLE, UINT16 = FS_Ok); // locate first by template
UINT16 FindNext (HANDLE, UINT16 = FS_Ok); // repeat for next match
UINT16 Allocate (HANDLE&, char*); // ask for a new XFCB
};
#endif
/********************************** eof **********************************/