// IFSFiles.decl -- declarations for IFS file structures
// This is an extension to AltoFileSys.d
// Copyright Xerox Corporation 1979, 1981, 1982
// Last modified May 11, 1982 10:09 AM by Taft
get "AltoFileSys.d"
// The first few structures parallel the ones in the standard
// Alto file system, but assign meaning to some previously unused
// bits and fields which are marked with "*".
//----------------------------------------------------------------------------
structure ISN: // IFS serial number
//----------------------------------------------------------------------------
[
word1 word =
[
directory bit // file is a directory (SysDir or IFS.dir)
random bit // not used in IFS
nolog bit // not used in IFS
archived bit //*file is archived
part1 bit 12
]
word2 word = part2 word
]
//----------------------------------------------------------------------------
structure IDA: // IFS virtual disk address
//----------------------------------------------------------------------------
[
blank byte
unit byte //*logical unit number
page word // virtual page number on unit
]
//----------------------------------------------------------------------------
structure IFP: // IFS file pointer
//----------------------------------------------------------------------------
[
serialNumber @ISN
version word // not used, always 1
da word 2 = @IDA // virtual disk address
]
// structures unique to the IFS
manifest
[
maxPathNameChars = 99 // max length of pathname in chars
lenPathName = (maxPathNameChars+2) rshift 1
maxDirNameChars = 39 // max length of directory or user name
nGroups = 62 // number of protection groups
]
//----------------------------------------------------------------------------
structure DirName: // directory name string
//----------------------------------------------------------------------------
[
length byte
char↑1,maxDirNameChars byte
]
manifest lenDirName = size DirName/16
//----------------------------------------------------------------------------
structure Protection: // protection descriptor
//----------------------------------------------------------------------------
[
group↑0,nGroups-1 bit // group access or membership
owner bit // owner access
world bit // world access
]
manifest lenProtection = size Protection/16
//----------------------------------------------------------------------------
structure FileProt: // file protection
//----------------------------------------------------------------------------
[
readProt @Protection // read protection
writeProt @Protection // write protection
appendProt @Protection // append protection
]
manifest lenFileProt = size FileProt/16
//----------------------------------------------------------------------------
structure InhProps: // file properties inherited from old versions
//----------------------------------------------------------------------------
[
fileProt word lenFileProt = @FileProt
]
manifest lenInhProps = size InhProps/16
//----------------------------------------------------------------------------
structure ILDFlags: // IFS leader page flags
//----------------------------------------------------------------------------
[
undeletable bit // file is undeletable even by wheels
noBackup bit // file should not be backed up
damaged bit // file is damaged (set by IFSScavenger)
blank bit 13
]
//----------------------------------------------------------------------------
structure ILD: // IFS leader page
//----------------------------------------------------------------------------
[
@LD // first 256 words is standard leader page
pathName word lenPathName // complete IFS pathname
inhProps word lenInhProps = @InhProps
author @DirName // user name of last writer
backedUp @TIME // date and time of last backup
type word // ftText, ftBinary, ftUnspecified
byteSize word
flags word = @ILDFlags
checksum word // software checksum over data; 0 => none;
// is Pup checksum +1.
]
compileif (size ILD/16) gr 512 then
[ Barf("ILD too large") ] // Leaf uses other 512 words for file map
manifest
[
// file types
ftUnspecified = 0
ftText = 1
ftBinary = 2
]
//----------------------------------------------------------------------------
structure DR: // IFS directory record
//----------------------------------------------------------------------------
[
header word =
[
type bit 6 // entry type
length bit 10 // entry length in words
]
fp @IFP // file pointer
pathName @STRING // complete IFS pathname
// DIF entries have a DIFRec after the name (see below)
]
manifest lenDRHeader = offset DR.pathName/16
//----------------------------------------------------------------------------
structure DIFRec: // additional info in entries for DIFs
//----------------------------------------------------------------------------
[
createProt @Protection // create protection
inhProps word lenInhProps = @InhProps
diskPageUsage↑0,1 word // number of disk pages used
diskPageLimit↑0,1 word // number of disk pages permitted
]
manifest lenDIFRec = size DIFRec/16
manifest
[
// types of directory entries
drTypeNormal = 1 // normal file
drTypeDIF = 2 // directory information file
// constants for DR header validity check.
// the following two must be the next higher power of 2 minus one.
// ***If this is changed, IfsDirKey.asm must be changed also.
maxDRType = 3 // maximum value of type field
maxDRLength = 127 // maximum value of length field
drHeaderMask = #171600 // mask of bits that should be zero in DR header
]
//----------------------------------------------------------------------------
structure Capabilities: // user capabilities
//----------------------------------------------------------------------------
[
wheel bit // allowed to do anything
mail bit // allowed to receive mail
blank bit 14
]
//----------------------------------------------------------------------------
structure DIF: // directory information file (page 1)
//----------------------------------------------------------------------------
[
// directory properties
@DIFRec // truth copy of stuff in directory entry
connectProt @Protection // connect protection
owner @DirName // name of directory owner (if files-only)
miscDirAttributes word =
[
filesOnly bit // files-only directory
blank bit 13
validGrapevineRName bit // Grapevine knows about this name
nonexistentDIF bit // no local DIF exists. By definition, this cannot
// be true in a DIF file, only in the cache.
]
// user properties
password word 9 // encrypted password (cached if using Grapevine)
userGroups @Protection // user group membership (cached if using Grapevine)
capabilities @Capabilities
ownedGroups @Protection // groups owned by this user
defaultPrinter @DirName // name of default printing server
timeLastValid @TIME // time of most recent Grapevine validity check
hintNotUserGroups @Protection // groups user is believed not to be in
]
manifest lenDIF = size DIF/16
manifest minLenDIF = offset DIF.ownedGroups/16 // for old DIF
//----------------------------------------------------------------------------
structure UserInfo: // Passed to file operations
//----------------------------------------------------------------------------
[
userName word // -> login directory name
connName word // -> connected directory name
capabilities @Capabilities
userGroups @Protection
defaultDir word // -> default directory name (0 if none)
]
manifest lenUserInfo = size UserInfo/16
//----------------------------------------------------------------------------
structure Home: // home block written as file IFS.Home on all packs
//----------------------------------------------------------------------------
[
type word // what kind of IFS this is
numUnits word // number of units in file system
thisUnit word // logical unit number of this disk
created @TIME // creation date and time of file system
id @DirName // file system ID (for OpenFileSys)
name @STRING // name of this file system
]
manifest lenHome = size Home/16
manifest
[
// IFS types
ifsTypePrimary = 1 // primary file system (swap area, etc.)
ifsTypeBackup = 2 // backup file system
ifsTypeAuxiliary = 3 // auxiliary (non-backup) file system
]