The Hierarchical File System [ COMMUNICATOR 3000 MPE/iX Release 5.0 (Core Software Release X.50.20) ] MPE/iX Communicators
COMMUNICATOR 3000 MPE/iX Release 5.0 (Core Software Release X.50.20)
The Hierarchical File System
by Craig Fairchild and Rajesh Lalwani
Commercial Systems Division
Overview
This version of MPE/iX provides hierarchical directory structure. Now
you can create hierarchical directories and place other hierarchical
directories and files under them. MPE/iX 5.0 supports several new file
and record types including the byte stream record type, and pipes, FIFOs,
symbolic link and device link file types. In addition, filenames can
contain some special characters and can be as long as 255 characters.
This article describes these new 5.0 hierarchical file system (HFS)
features.
Hierarchical Directory Structure
The MPE operating system was originally designed primarily for use in a
department setting. All the users in a particular department are
typically grouped together and placed in one account. Similarly, an
account, such as PAYROLL, could organize its files in groups such as
JAN92, FEB92, and so on. In this model, the directory tree consists of
one or more accounts, with each account containing one or more groups.
Finally, each group has zero or more files in it. Hence, this
file.group.account structure can be looked at as a 3-level hierarchical
structure. The first level has account entries, the second level group
entries, and the third level the actual files. POSIX, however, has an
expanded version of MPE hierarchy. The POSIX directory structure has a
root directory, which is represented by a slash (/). The root directory
may have files and directories under it. The directories, in turn, have
files and directories under them. MPE/iX has integrated the MPE and
POSIX concepts resulting in the new HFS. A typical MPE/iX directory could
look like:
/
|
+--------------------------+--------------------------+
| | |
PAYROLL DEVELOP users
| | |
+------+------+ +------+------+-----+------+ +--------+--+
| | | | | | | |
JAN92 FEB92 MPE dir file PX bruna jeff
| | |
+--+--+ +------+------+-----+ +---+---+
| | | | | | | |
HOURS TAXINFO ledger payable data PRGFILE bin addr_bk
| |
+--+---+ +---+-----+
| | | |
main.c Makefile my_ls down_load
On MPE/iX, the root directory may contain files, directories, and
accounts. For most purposes, accounts and groups are treated as
directories but there are differences. For example, groups and accounts
cannot be purged by the PURGEDIR command. Also, groups and accounts
contain some accounting information associated with them which is not the
case with HFS directories.
Like any MPE system, the accounts contain groups. The groups can, in
turn, contain files or directories. In Figure 1, three different flavors
of the integration of MPE and POSIX concepts can be seen. PAYROLL
account has not used any of the new features of POSIX. The account
PAYROLL contains two groups JAN92 and FEB92. The group FEB92 contains
just two files HOURS and TAXINFO. Notice that the files in the group
FEB92 even have valid MPE names. It seems a person familiar with UNIX
has created the directory users under the root directory. This person
has placed two directories, bruna and jeff under users. The directory
jeff has a simple file addr_bk and a directory bin under it. The
directory bin has two script files my_ls and down_load.
The person using the DEVELOP account has really used both MPE and POSIX
concepts. The account DEVELOP has two groups MPE and PX, as well as a
file and a directory. This account is apparently used by an application
developer. There are two directories under the group PX, ledger and
payable, probably for keeping source and make files related to the two
modules of the accounting package. The whole application, after
compilation and linking, has been kept in the file PRGFILE. Apparently,
this package keeps the data in the file data.
Here are the highlights of the MPE/iX directory structure:
* The root directory (represented by a slash /) can have accounts,
directories, or files under it.
* Accounts may have groups, directories, or files under them.
* Groups may have files or directories under them.
* Directories may have files or directories under them.
* Special directories "." and ".." refer to the directory itself,
and the parent of the directory, respectively. The ".." entry of
root (/) is defined to be root (/).
* Only accounts and groups must have valid MPE names. All others
objects can use the portable HFS character set that consists of
A-Z, a-z, 0-9, and three special characters ., _, and -. No name
can start with a hyphen (-), but may start with any other
character. For example, _a_file and 123 are valid HFS syntax
filenames. Also note that these names are case sensitive; AFILE,
Afile, and afile are all unique filenames and can exist at the
same time.
* All names directly below the root, account, and group directories
can be at most 16 characters in length (except account and group
names that must be valid MPE names). All other names can be up to
255 characters long.
* A pathname may be up to 1023 characters long. This implies
a maximum directory depth of 511 levels (for example,
/a/a/a/a/a/a/a/a...). The system does not prevent the creation of
objects whose absolute pathname would exceed 1023 characters, but
may treat these objects in a degraded manner. For example, STORE
will report an error when attempting to access an object whose
absolute pathname is greater than 1023 characters. These objects
can be removed from the system by using the PURGE command and a
relative pathname.
* All file types (except CIR, RIO, and CM KSAM) may be created
anywhere in the HFS directory. Once opened, access to these files
is exactly the same as if they lived in MPE groups. There are no
HFS files, only HFS names.
Current Working Directory
In traditional MPE, the logon group is used to complete unqualified
names. This allows you to type the shorthand name CATALOG rather than
the full CATALOG.PUB.SYS. The logon group was also used as a security
mechanism and for the location to log connect and CPU utilization
information. In release 5.0, the dual function of the logon group has
been separated into two parts; the current working directory (CWD) and
the logon group. The logon group is still used to define group user (GU)
access, and as the accounting point for connect time and CPU utilization.
However, now all name qualification is done based on the CWD.
The CWD is initialized to be the same value as the logon group when you
logon. Unless the CWD is explicitly changed by you (with the CHDIR
command) it will be impossible to tell any difference in behavior in 5.0
and 4.0 systems. The CHDIR command allows you to place the CWD to any
directory that you can access. This means that if you log onto the
PAYROLL account, you can CHDIR /SYS/PUB to set the CWD to the PUB.SYS
group. user can then refer to CATALOG.PUB.SYS as simply CATALOG.
NOTE The CWD does not have any impact on security. It is used as a
naming shorthand only and is not used to determine GU access (which
is still determined by the logon group).
In HFS terminology, a pathname is called absolute if it starts from the
root and specifies all levels until the target object. An example of an
absolute pathname is /SYS/PUB/CATALOG. A pathname can also be relative,
which means that it does not start at the root, but rather from the CWD.
Examples of relative names include CATALOG, ./CATALOG, and sys/notes. In
each of these examples the name was qualified with the CWD location. If
our CWD was /SYS/PUB, then these relative names would be equivalent to
/SYS/PUB/CATALOG, /SYS/PUB/CATALOG (the dot directory refers to the
directory itself, which in this case is the CWD), and /SYS/PUB/sys/notes.
One other property of the CWD that is different from the logon group is
that the CWD is process local. The logon group of a session is identical
for all processes in that session. However, it is possible for each
process in a session to have different CWDs. This means that if a
program is executed and that program changes the CWD to some location, no
other process is affected by that change. If you were to break out of
the program, you would find that the CI's CWD was the same as when the
program was first run.
Multiple Syntax Support
We just saw where the objects such as groups, accounts, files, and
directories can lie within the MPE/iX directory structure. Let us now
see how we can refer to them. MPE/iX has been designed so that the
existing interfaces (such as intrinsics and CI commands) can refer to all
the objects in the directory without changing the way they refer to the
MPE objects such as files in groups. Also, POSIX interfaces such as
POSIX.1 functions and POSIX.2 commands are able to refer to MPE objects
such as accounts and groups and files within them. Conceptually, there
are three name syntaxes: MPE-only, MPE-escape, and HFS.
MPE-only Syntax.
The familiar MPE objects (e.g., files in groups) can be referred
to by using any of the following forms; FILE, FILE.GROUP, or
FILE.GROUP.ACCOUNT. When the system processes MPE-only names, it first
starts by upshifting the name since all MPE names are uppercase only. It
then qualifies the name. When the filename is fully unqualified (say,
FILE), it is qualified with the CWD. If the CWD is not in an MPE group,
an error will result because the MPE-only syntax requires the name to be
MPE syntax expressible. In the second case when the filename is, say
FILE.GROUP the name is qualified to the logon account regardless of the
location of the CWD. Finally, in the third case when the filename is say,
FILE.GROUP.ACCOUNT, the MPE name server refers to the file FILE in group
GROUP in account ACCOUNT, regardless of where the CWD is and what the
logon account is, which is the traditional behavior that would be
expected.
HFS Syntax.
All objects on the sytem, even MPE objects such as accounts, groups, and
files under them can be refered to by the HFS name server. For naming
purposes, the accounts and groups can be treated as directories. Hence,
the file PRGFILE.PX.DEVELOP can be refered to as /DEVELOP/PX/PRGFILE.
When the system processes HFS syntax names, it performs no upshifting
since HFS syntax names are case sensitive. /develop/px/prgfile is NOT
the same file as /DEVELOP/PX/PRGFILE. If the name is relative, then the
system will start its search from the CWD. If the name is absolute, the
path will be searched from the root.
Because the HFS syntax is defined by the POSIX.1 standard, extensions
such as the ability to specify lockwords are not possible when specifying
an HFS syntax name. If the file TAXINFO.FEB92.PAYROLL had a lockword on
it, any attempt to access the file specifying an HFS syntax name will
result in an error. This also means that no prompting of the name will
be done for interactive users when specifying a lockworded file with an
HFS name.
The HFS name syntax is not directly available to the CI commands or any
intrinsic (except HPFOPEN). The MPE-escaped syntax allows the CI and
intrinsics to use the HFS syntax (see below). The POSIX.2 shell
(SH.HPBIN.SYS) accepts only HFS syntax filenames, as well as all of the
POSIX.1 functions.
MPE-escaped Syntax.
The MPE-escaped syntax is the default syntax used by the CI and the file
system. It is a hybrid of MPE-only and HFS syntax that allows
compatibility with the traditional MPE-only syntax as well as the
flexibility of the new HFS syntax. By default all MPE-escaped syntax
names are assumed to be MPE syntax and are treated that way. The names
will be upshifted, and then qualified in the same manner as MPE-only
syntax. The only difference, in this case, is that is legal for an
unqualified filename to be in a CWD that is not a group. This allows a
user to open a file TEXT in the CWD, regardless of where that CWD is.
The main difference between MPE-only and MPE-escaped syntax is in the
ability to switch, or escape, to HFS syntax. If the first character in
an MPE-escaped name is either a dot (.) or a slash (/), then the system
will assume that the name is an HFS syntax name. This can be done since
both dot and slash are invalid first characters in an MPE syntax name.
When an MPE-escaped name is escaped into the HFS syntax, the system
processes the name according to the HFS syntax rules. No upshifting is
done to preserve the case sensitivity, and the special characters dot
(.), dash (-), and underscore (_) are valid to be in the name as well.
An example of using the MPE-escaped syntax would be in purging the file
/DEVELOP/PX/data. Since the data file is in lower case, an MPE syntax
name cannot name the file. If our CWD is /DEVELOP/PX, then either of
these two commands would have the same effect:
:PURGE ./data
or
:PURGE /DEVELOP/PX/data
Note that the use of the leading dot in the example above is only
necessary to escape the name into the HFS syntax. If you ran the POSIX.2
shell, which uses HFS syntax - not MPE-escaped syntax like the CI, you
would not need to provide the leading "./" characters.
Creating/Purging Hierarchical Directories
Hierarchical directories can be created by the intrinsic HPFOPEN, CI
command NEWDIR (refer to the article "New CI Commands" in this
Communicator) or by POSIX.1 and POSIX.2 interfaces.
The disk space used by hierarchical directories that are somewhere below
an MPE group (like ledger and the files main.c and Makefile), does add up
to the group and account that they are below. However, for directories
that are not below an MPE group (like users or jeff), system managers
cannot put a limit on the disk space that they can take up. However,
only users with SM capability can create a directory directly below the
root directory. Also, a new CI command DISKUSE can be used to see the
disk space used by various directories.
A hierarchical directory cannot be purged unless it is empty. A
directory is considered empty when it only has the dot (.) and dot-dot
(..) entries in it. A new CI command PURGEDIR has an option ;TREE that
will purge the files/directories under the directory recursively and
finally purge the requested directory.
New File Types
This version of MPE/iX provides some new file types. Here is a brief
definition of them. Further information can be obtained from the POSIX
Reference from IEEE or the MPE/iX manual set. Since these interfaces are
based on a commonly used standard, many textbooks are available that
contain a detailed discussion of their use.
Pipes.
A pipe consists of two file descriptors connected such that data written
to one can be read from the other in a first-in-first-out manner.
FIFOs.
A FIFO is a named pipe. Because a FIFO has a directory name, it can be
used by non-related processes to perform interprocess communication.
Symbolic Links.
A symbolic link allows for a directory entry to substitute a different
directory name to search for. This is similar to having a file equation
(for example, :FILE FILE1=FILE2) that lives permanently. In the example
just given any reference to the name "FILE1" actually opens the file
"FILE2". A symbolic link performs the same function.
Device Links.
A device link associates a directory entry with a logical device number.
It is conceptually similar to issuing a file equation such as :FILE
TAPE;DEV=7. Whenever the device link file is opened, the open is
actually performed on the logical device associated with the device link.
Byte-Stream Files.
With MPE/iX Release 4.5 and subsequent releases, MPE/iX has a new record
type: byte-stream. Byte-stream files are simply a sequence (stream) of
bytes, hence the name byte-stream. The term byte-stream file is
frequently used when talking about files with the byte-stream record
type, even though they are not a new file type. Byte-stream files do not
have any record structure associated with them. One can build a
byte-stream file as follows:
BUILD filename;rec=,,B;disc=100000
Notice that you do not have to specify the record size. This is because
byte-stream files have a record size of 1 byte. B means byte-stream in
the same way as F means Fixed length record file. Also, since a
byte-stream file is implemented with record length of one byte, disc=
parameter would indeed mean the number of bytes in the file.
By convention, applications use the linefeed character (ASCII 10) to
separate records in byte-stream files. Byte-stream files also allow
reading and writing of data in arbitrary chunks. In order for an
application to read logical records, it must read a chunk into a buffer
and scan for the linefeed record separator. This buffering can be
complicated and can also be handled for the application by C Library
routines. Most traditional applications, however, are not written in C
and would not operate correctly with true byte-stream access.
So that the current applications can work correctly with byte-stream
files, intrinsics such as FOPEN and HPFOPEN will bind a Variable Record
Emulator type manager with a byte-stream file by default. In such a case
the byte-stream file behaves like a variable record file with the
linefeed character acting as the end of the record marker. If the
application wants to use the file as a byte-stream file, it needs to
specify HPFOPEN option 77 as 2 while calling HPFOPEN.
Miscellaneous
* With this release of MPE/iX, users with SM capability can create
and rename files across account boundaries
* You no longer have to be the creator of a file in order to :RENAME
it. If you have read access to the file, can purge the old file,
and can create the new file, then you can :RENAME the file.
* The file label will have several new fields such as file_group,
state_chg_time, hd_link_count. Also it is possible that the
file_name field will be empty for some files because the filenames
can now be 255 characters in length. Finally, the creator field
can contain a fully qualified name of the creator because the
files can now be created by users from a different account.
MPE/iX Communicators