POSIX System Management with VESOFT's MPEX
                           By Paul Taffel, VESOFT
         Presented at SCRUG (Southern California Regional User Group)
                       1995 Meeting, Irvine, CA, USA
                  Published by INTERACT Magazine, Oct 1995.


Introduction
------------

As anyone brave enough to venture inside the MPE/iX 5.0 push release
Communicator will realize, the incorporation of Posix compliant features to
MPE/iX, and the corresponding file system changes required to support them,
have resulted in the addition of many useful features to the MPE we all know
and love.  HP has done a spectacular job in integrating Posix enhancements
into MPE, without requiring that System Managers necessarily learn new
management techniques.  However, in the VESOFT tradition, we thought we
could simplify a number of aspects of Posix system management, while at the
same time adding new capabilities, above and beyond those provided by HP.


What this paper covers
----------------------

This paper summarizes Posix-related enhancements present in the 25. release
of VESOFT's MPEX system utility product.  It's not an introduction to Posix,
however, so if you're new to Posix, open up your 5.0 Communicator,
and start reading.

For those of you who've already read up on Posix, we've got something for
you too (yes, even if you've studied the new features list or on-line
documentation that comes with MPEX version 25.). That's because this paper
also makes reference to a number of features of MPEX version 25. that have
not yet been included in the official MPEX documentation.

Rather than launch into detailed explanations of Posix features, I'll
briefly describe the significant file system changes, and then show the MPEX
enhancements that allow you to work with them.  I've tried to incorporate
many "How can I..." problems with their MPEX solutions.  The paper also
contains Appendixes which summarize the enhanced MPEX command syntax
used to implement these solutions.

To simplify further references to MPE/iX within this paper, all references
to 'MPE' should be interpreted as meaning 'any Posix release of MPE/iX'.


What this paper does not cover
------------------------------

Version 25. of MPEX contains many, many enhancements that are not covered in
this paper.  If you'd like to learn more about the new features, just type
%HELP NEWS from inside MPEX version 25.  If you don't have it, call up
VESOFT and ask for a copy of the latest release.


Feedback
--------

We at VESOFT really encourage you to contact us with your favorite "I'd like
to do this but I can't" problem.  MPEX has evolved largely as a result of
the continued suggestions of our many thousands of users, and we hope to
continue this process as long as you continue to come up with new problems.

We'd like to thank the many users who've taken the time to formulate and
request new features.  Many of the changes you'll see in version 25. are
there as a direct result of your input.

You can contact VESOFT by phone at (310) 282-0420, or by fax at
(310) 785-9566, or feel free to email me directly at ptaffel@io.com.


Section 1: Overview of Posix file system changes
------------------------------------------------

A significant number of file system changes were made in order to add Posix
compliance to MPE.  This section briefly summarizes these changes.


Hierarchical File System supported
----------------------------------

Perhaps the most significant change involved the migration from MPE's
traditional Account, Group and File oriented file system into a Posix-
compliant Hierarchical File System (HFS).

MPE Accounts are now special files located directly beneath the directory's
root file, and MPE Groups are in turn special files located beneath these
Account files.  Directory files may now be built, and other files (including
other directories) may be placed inside these directories, as well as
beneath MPE Groups (as before), directly beneath MPE Accounts, or even
directly beneath the directory root file.


Removal of 8-character Filename limit
-------------------------------------

Although MPE Groups and Accounts may still only contain up to 8 alphanumeric
upper-case characters, files and directories may now be built with filenames
up to 255 characters long, and may contain upper- and lower-case characters,
as well as '.', '-' and '_' characters.

File names cannot start with the '-' character, and files built directly
beneath an MPE Account or Group, or the directory root file, are limited
to 16 characters in length.


File Creator now fully qualified
--------------------------------

A new file label attribute (OWNER) has superseded the CREATOR field
previously supported.  Before Posix, the file system only tracked the name
of the MPE User who created a file, but as MPE now allows SM capability
users to create files cross-Account, this is no longer adequate as a means
of uniquely identifying who built, and thus owns, a file.  For example, if a
file's creator is marked simply as MANAGER, how do you know if it was
created by MANAGER.SYS, MANAGER.VESOFT, etc?  The OWNER tracks the fully-
qualified MPE 'User.Account' name of the user who built a file, but it may
also subsequently be changed.

The fully-qualified file Owner is displayed by MPE's :LISTF ,-3 command, and
by MPEX's %LISTF ,-3 and %LISTF ,POSIX commands.  MPEX allows you to select
files based on this field by using the OWNER file attribute, or by the UID
numeric equivalent (see next section).

For compatibility reasons, within MPEX you can continue to select files
based on their Creator name.  When you select based on Creator name, MPEX
now selects based on the first part of the fully-qualified Owner field.

MPE allows a file's Owner attribute to be changed using the new MPE :ALTFILE
command.  MPEX's %ALTFILE has been enhanced to allow the fully-qualified
Owner of a file (or fileset) to be changed.  See Section 6 for more details.


Numeric UID Number
------------------

In addition to tracking the file's OWNER as a string containing the MPE
'User.Account' name, the file system also maintains an integer equivalent,
the UID number.  This UID is automatically assigned, one for every MPE User
on the system, but you can control the UID number assigned to new or
existing MPE Users using the ;UID= keyword of MPE's :NEWUSER and :ALTUSER
commands.  Whichever way it has been set up, the UID number associated with
each MPE User must be unique.

MPE allows you to report the UID number assigned to any MPE User via the
;FORMAT=DETAIL keyword of the :LISTUSER command.

The numeric UID associated with a file may be displayed using MPEX's
%LISTF ,-3 command (but only when the filename is specified in HFS-syntax).

The MPE CI doesn't provide commands that display numeric UID information,
but it may be retrieved using the CI's FINFO function, or by using the Posix
shell's ls command.  MPEX allows you to select files based on this field by
using the UID file attribute.

You can convert between numeric UID and the ASCII Owner attributes using
MPEX's HPUID(...) function.  For example,

     %CALC HPUID ('MANAGER.VESOFT')        returns  16155

and  %CALC HPUID (16155)                   returns  'MANAGER.VESOFT'


MPEX's %LISTF ,POSIX provides a one-line summary of a file's Posix related
file attributes, including UID and Owner fields.  For example:

  %LISTF SL.PUB.SYS ,POSIX

displays

  File       Type   UID Owner               GID Group ID  ACD        State
  ---------- ---- ----- ----------------- ----- -------- ---- ------------
  XL         FB       1 MANAGER.SYS           1 SYS              Mon 13:44

See Section 5 for more details.


File Group ID added
-------------------

As files may now (using MPE commands) be built in one MPE Account and then
renamed to another, and as these files remain under the control of the
Account Manager of the Account where they were originally built, a mechanism
was needed for tracking the MPE Account in which the file was built.

Using Posix terminology, the Group ID (GID) or FileGroup attribute defines
the name of the Posix Group that the file belongs to.  Unfortunately, the
nearest equivalent in MPE terminology is the MPE Account in which the file
was built, hence we now have to handle a new file attribute called Group ID
(or FileGroup) that's normally equal to the MPE Account in which the file
was built.

The file Group ID is displayed by MPE's :LISTFILE,-3 command (but not by
:LISTF ,-3), and by MPEX's %LISTF ,-3 and %LISTF ,POSIX commands.  In all cases
the Group ID is only displayed when the filename is specified using HFS
syntax.  MPEX allows you to select files based on this field by using the
GROUPID file attribute, or by the GID numeric equivalent (see next section).

The Group ID attribute may be changed using either the MPE or MPEX ALTFILE
commands.


Numeric GID Number
------------------

In addition to tracking the file's Posix Group ID as a string containing the
MPE Account name, the file system also maintains an integer equivalent, the
GID number.  This GID is automatically assigned, one for every MPE Account
on the system, but you can control the GID number assigned to new MPE
Accounts using the ;GID= keyword of MPE's :NEWACCT command.  Once an MPE
Account has been created, its GID number cannot be changed.  The GID number
assigned to each MPE Account must also be unique.

MPE allows you to report the GID number assigned to any MPE Account via the
;FORMAT=DETAIL keyword of the :LISTACCT command.

The numeric GID associated with a file may be displayed using MPEX's
%LISTF ,-3 command (but only when the filename is specified using HFS
syntax).

The MPE CI doesn't provide commands that display numeric GID information,
but it may be retrieved using the CI's FINFO function, or by using the Posix
shell's ls command.  MPEX allows you to select files based on this field by
using the GID file attribute.

Although MPE's :NEWACCT command supports both ;GID and ;UID keywords, this
can be a source of confusion: the ;GID= keyword refers to the MPE Account,
while the ;UID= keyword, if specified, controls the UID of the Account
Manager User created along with the Account, not of the Account itself.

You can convert between numeric GID and the ASCII Group ID attributes using
MPEX's HPGID(...) function.  For example,

     %CALC HPGID ('HPSPOOL')               returns  102

and  %CALC HPGID (102)                     returns  'HPSPOOL'


Cross-Account File Building and Renaming by SM users
----------------------------------------------------

MPE has finally caught up with MPEX in one area: SM users can now use the
MPE :RENAME command to rename files from one MPE Account to another.
Unfortunately, when this is done, the file system tracks (using the Group ID
file attribute) the MPE Account where the file was originally built, the
original Account Manager of this MPE Account retains control over the file,
and ACDs are automatically added to the file.

This point is worth repeating: whenever SM users rename files cross-Account,
the Account Manager of the MPE Account where a file is renamed to will not
have AM access to the file.

In cases where this behavior is not desired, MPEX allows the Group ID field
to be re-initialized to the new MPE Account name, and ACDs to be removed
automatically.  See Section 7 for more details.

To quickly identify which files within an Account are not under the control
of the Account Manager (and assuming that you're logged on as the Account
Manager), just type

  %LISTF @.@(GROUPID<>ACCOUNT)


An SM user can also :BUILD a file cross-Account, in this case, while the SM
User remains the file's Owner, the Group ID is set to the MPE Account where
the file is built.

MPE's cross-Account :RENAME also retains one irritating aspect: although one
must normally be a file's Creator to rename it, SM users are now allowed to
rename files EXCEPT if the file is protected by a lockword.  As SM users are
perfectly able to circumvent this restriction by copying and purging the
file, MPEX allows SM users to rename files regardless of any lockwords.

As for files located within HFS directories, any user (not only the file's
owner) with appropriate access is allowed to rename the file.


As an example of UID and GID manipulations, consider the scenario where the
following commands are issued by user MANAGER.SYS (inside MPEX):

  %BUILD FILE.PUB.VESOFT
  %LISTF FILE.PUB.VESOFT,POSIX

  ACCOUNT=  VESOFT      GROUP=  PUB

  File       Type   UID Owner               GID Group ID  ACD        State
  ---------- ---- ----- ----------------- ----- -------- ---- ------------
  FILE       FB       1!MANAGER.SYS         256 VESOFT         Today 14:42

the file is located in the VESOFT Account, but is owned by MANAGER.SYS.


Now we rename the file back to PUB.SYS:

  %RENAME file.pub.vesoft, file.pub.sys
  %LISTF FILE.PUB.SYS,POSIX

  ACCOUNT=  SYS         GROUP=  PUB

  File       Type   UID Owner               GID Group ID  ACD        State
  ---------- ---- ----- ----------------- ----- -------- ---- ------------
  FILE       FB       1!MANAGER.SYS         256!VESOFT   Must  Today 14:42

at this point the file, although located in PUB.SYS and owned by
MANAGER.SYS, is controlled by the Account Manager of the VESOFT Account.  We
also see that required ACDs have been assigned to the file.


ACD enhancements
----------------

Until ACDs were added in MPE/iX 3.0 (sorry, I mean MPE/XL), file security
was determined based on the combined File, Group and Account-level access
matrix, with security bypassed if a file was Released, or restricted if a
Lockword was assigned to the file.

When ACDs were first implemented, they allowed an alternate discretionary
security mechanism to be specified: an ACD consisted of a list of Users, and
the access rights that each User was granted.  A 'User' was either an
explicit 'User.Account', or '@.Account', or '@.@'.

Note also that ACDs override the older File, Group and Account access
rights, and that a file's Secure/Release status and Lockword (if any) are
ignored when ACDs have been assigned to the file.

With Posix, the ACD mechanism has been extended to support related Posix
enhancements.  Although full details on ACD changes are beyond the scope of
this paper, the following changes should be noted:

- An ACD entry defining '$OWNER' access may now be defined.  If such an ACD
  entry exists, it is used to determine access to a file for the MPE user
  corresponding to the file's current OWNER field.

  The '$OWNER' entry continues to determine a file's Owner access even if
  the actual Owner attribute is changed.

  If no '$OWNER' entry is defined, the file's Owner has all access rights
  to the file.

- An ACD entry defining '$GROUP' access may now be defined.  If such an ACD
  entry exists, if determines access to users whose GID (MPE Account)
  matches the file's current GroupID field.

  From a Posix perspective, '$GROUP' defines access to a file for members of
  the file's group.  From an MPE perspective, the group corresponds to users
  within the file's MPE Account.

  The '$GROUP' entry continues to determine access to the file for members
  of the file's group, even if the actual Group ID attribute is changed.

- An ACD entry defining '$GROUP_MASK' access may be defined.  If such an ACD
  entry exists, it is used to impose a maximum access for all permissions
  defined via other ACD '$GROUP' and '@.ACCOUNT' type entries, much as the
  file access matrix of an Account imposes access limits on File and Group
  access limits within it.  In other words, '$GROUP_MASK' doesn't confer
  file access, it is used to restrict all ACD definitions other than '@.@'
  and '$OWNER' entries.

  From a Posix perspective (where file security is more simplistically
  specified in terms of Owner, Group and 'Other' access), the '$GROUP_MASK'
  ACD entry allows the Posix shell's chmod command to alter 'Other'
  permissions without wiping out finer security permissions that might have
  been assigned to individual ACD 'User.Account' entries.

- ACDs are REQUIRED for all files whose GIDs do not match the GID of the MPE
  Account in which they exist.  They are also required for all files that
  are not directly beneath an MPE Group.  A new file attribute tracks if
  ACDs are required; if they are then the ALTSEC command may not be used to
  remove the file's ACD specification, only to change it.

  MPEX allows you to select files based on this field using the ACDREQUIRED
  file attribute.  It also allows you to select files having any ACD defined
  via the HASACD file attribute.  MPE provides no CI mechanism for directly
  selecting files based on these attributes.

  For example, to list all files in GROUP.ACCOUNT that are not protected by
  ACDs, just use:

    %LISTF @.GROUP.ACCOUNT (NOT HASACD)

  To show files in PUB.SYS that have ACDs required, use

    %LISTF @.PUB.SYS (ACDREQUIRED)


Automatic ACD assignment
------------------------

As explained above, ACDs are now automatically assigned to files under some
circumstances.  These circumstances correspond to situations in which a file
cannot be protected by the traditional MPE file access matrix, and are
summarized below:

- The file is built elsewhere than directly beneath an MPE Group, or is an
  HFS directory file (not including MPE Group and Account files).

- The file does not currently have ACDs assigned, and it's either renamed
  cross-Account to another MPE Group, or it's renamed to a location beneath
  an HFS directory.  This renaming may be accomplished using either the MPE
  or MPEX RENAME commands (or via the Posix shell's mv command).

- The file does not currently have ACDs assigned, and its Group ID is
  changed using either the MPE or MPEX ALTFILE command (or via the Posix
  shell's chown command).

When ACDs are automatically assigned to an existing file, they are assigned
with the intention of continuing to limit file access as closely as possible
to the file access matrix-based security restrictions that were originally
applied to the file.

For example, consider the following sequence:

  %BUILD TEST.PUB.SYS
  %LISTF TEST.PUB.SYS ,SEC

  FILENAME  CODE     REC  TYPE  READ     APPEND   WRITE    LOCK     EXECUTE

  TEST              128W  FB    ANY      GU       GU       ANY      ANY

  %RENAME TEST.PUB.SYS, TEST.PUB.VESOFT
  %LISTF TEST.PUB.VESOFT ,-2

  FILENAME        ------------ACD ENTRIES--------------

  TEST                $OWNER              : R,W,X,A,L,RACD
                      $GROUP_MASK         : R,X,L,RACD
                      $GROUP              : R,X,L,RACD
                      @.@                 : R,X,L,RACD

The following mapping is used when converting the file's access matrix into
equivalent ACDs (RACD is always granted):

  $OWNER      ... Derived from CR access
  $GROUP      ... Derived from OR'ing AC and ANY access
  $GROUP_MASK ... Derived same way as $GROUP
  @.@         ... Derived from ANY access

Posix compatibility requires that execute ('X') access be restricted under
some circumstances.  Although the details are beyond the scope of this
paper, be aware that 'X' access is subject to some restrictions when '@.@'
would normally be granted execute access.


Removing Automatically-Assigned ACDs
------------------------------------

Once ACDs have been automatically assigned to a file, the problem then
arises as to how to identify such files, and how to remove the ACDs if you
don't want them.

Identifying the files (using MPEX) is easy:

  %LISTF @.@.@(ACDREQUIRED)


For files located in MPE Groups, ACDs are required if the files' Group ID
fields aren't equal to their MPE Account names.  To identify such files, try

  %LISTF @.@.@(ACDREQUIRED),POSIX


To remove the ACDs, one must first modify the file's Group ID attribute to
match the MPE Account in which the file is located, and then remove the ACD
using the ALTSEC command.

Once you've identified which files you want to modify, you can accomplish
the ACD removal using the following MPE commands:

  :ALTFILE <filename> ;GROUPID=<Account>
  :ALTSEC  <filename> ;DELACD

Note that :ALTFILE doesn't accept a fileset, and that :ALTSEC only does when
used with MPE-syntax filenames.  Even if :ALTFILE did accept filesets, you'd
have problems using these commands with a fileset spanning multiple Accounts
because you also have to specify ;GROUPID=<Account> for every file.

Fortunately, MPEX provides a way to accomplish ALL this with one command:

  %ALTFILE @(ACDREQUIRED) ;LOCAL ;DELACD


The %ALTFILE command's ;LOCAL keyword (actually a abbreviated form of
LOCALGROUPID) is equivalent to specifying the following:

  %ALTFILE @(ACDREQUIRED) ;GROUPID=<account> ;DELACD

where <account> is replaced by the file's MPE Account name.

Naturally, you can fix up the file's Owner attribute (and any other file
attributes) at the same time, if needed.

When a file is protected by a required ACD, although the ACD may not be
removed (until the Group ID has been fixed up), the ACD may still be changed
using the ALTSEC ;REPACD keyword (meaning Replace ACD).


Directory ACDs
--------------

When a file is protected via ACDs, the following access may be granted:

     R ... Read access.
     W ... Write access.
     L ... Lock access.
     A ... Append access.
     X ... Execute access.
  NONE ... No access.
  RACD ... Copy or read the ACD permission.


For HFS directory files, the following access may be granted:

    CD ... Create Directory entries access.
    DD ... Delete Directory entries access.
    RD ... Read Directory entries access.
    TD ... Traverse Directory entries access.
  NONE ... No access.
  RACD ... Copy or read the ACD permission.


The Directory access required to perform various file operations are
summarized below (modified rules apply to files located within MPE Groups,
as Groups can't have ACDs assigned to them):

 Build ... User must have TD and CD access to the file's parent directory,
           as well as MPE SF User capability.  For files located within MPE
           Groups this is equivalent to Save access to the Group.

 Purge ... User must have DD access to the file's parent directory.  For
           files located within MPE Groups this is equivalent to Write
           access to the file.  For directories located within MPE Groups
           this is equivalent to SAVE access to the Group.

Rename ... User must have DD access to the file's current parent directory,
           CD access to the file's new parent directory as well as TD access
           to all directories in the old and new paths.


Byte Stream Files
-----------------

Byte stream files are a new file type that stores all data as a stream of
bytes, with no record structure enforced.  Such files may only be processed
sequentially (much the same way as Variable files must be handled), and are
considered (by LISTF) to have a record size of 1 byte.  Internally, the LF
character (ASCII 10) is used to delimit records inside a Byte Stream file,
although this record delimiter is not normally visible.

Byte Stream files may be built using normal MPE commands, for example:

  :FILE bytes ;REC=,,B ;SAVE
  :SHOWME > *bytes

(where 'B' specifies Byte Stream record format) results in the following
:LISTF ,2 output:

  FILENAME  CODE  ------------LOGICAL RECORD-----------  ----SPACE----
                    SIZE  TYP        EOF      LIMIT R/B  SECTORS #X MX

  BYTES               1B  BA         316      10000   1       48  1  *


The 'BA' file type indicates that the file is an ASCII Byte-Stream file, and
EOF indicates the number of bytes in the file.

As Binary files can't be built with odd byte record lengths, attempting to
build a Binary Byte-Stream file results in an ASCII file being created (of
course, as the Binary or ASCII attribute only determines how partially-full
records are padded, the distinction has no meaning when considering one-
byte records).

Although such files don't posses a record-oriented structure, MPE provides
mechanisms (byte-stream emulators) that allow MPE utilities to view byte-
stream files as if they were variable-record length, and also allow Posix
utilities that would otherwise only accept Byte-Stream files to operate
(with some limitations) on fixed- or variable-length MPE files.

MPE provides two utilities (FROMBYTE and TOBYTE in HPBIN.SYS) to convert
between Byte-Stream and fixed-record length files, but these utilities don't
give you the ability to override the record sizes they chose, and force you
to specify Byte-Stream filenames in HFS syntax (see below).


MPEX's %ALTFILE now allows you to easily convert single files or filesets
between Byte-Stream and Fixed or Variable record length files, for example

  %ALTFILE bytes; FIXED; REC=-80

will result in the following LISTF ,2 output:

  FILENAME  CODE  ------------LOGICAL RECORD-----------  ----SPACE----
                    SIZE  TYP        EOF      LIMIT R/B  SECTORS #X MX

  BYTES              80B  FA           7        316   1       16  1  *


While the following command:

  %ALTFILE bytes ;VARIABLE ;REC=128

results in:

  FILENAME  CODE  ------------LOGICAL RECORD-----------  ----SPACE----
                    SIZE  TYP        EOF      LIMIT R/B  SECTORS #X MX

  BYTES             256B  VA           7      10000   1       16  1  *


You can also use MPEX's %ALTFILE ;BYTE to create Byte-Stream files.

The MPEX %PRINT command has been enhanced to handle Byte-Stream files, and
will display both the byte and line position within Byte-Stream files.  You
can use the ;START and ;END keywords, specifying starting and ending record
numbers to display, in addition %PRINT (unlike MPE's :PRINT) even allows you
to specify negative start offsets (in record numbers), for example

  %PRINT bytes ;START=-5

The ISBYTESTREAM attribute may be used within MPEX to select Byte Stream
files.


Symbolic Link Files
-------------------

A symbolic link allows one directory entry to point to another filename.
You can think of this as a permanent file equation: all references to the
Symbolic link file are 'resolved' into references to the target of the
Symbolic Link.  A file may be pointed to by many Symbolic Link files, and
the Target of a Symbolic Link need not necessarily even exist.

Symbolic links are created with the MPE :NEWLINK command, and by the new
fileset-enhanced MPEX %NEWLINK command.

Once a link has been created, all references to the Link file result in the
Link target file being accessed.  It's important to realize that this re-
direction extends to the PURGE command itself (both MPE and MPEX versions).
If you want to remove a link file, you must use the MPE :PURGELINK command,
or the new fileset-enhanced MPEX %PURGELINK equivalent.

Link files are not limited to pointing to ordinary files, you can also
create a link to HFS directories, as well as to MPE Group or Account files,
or even to the directory root itself.  A Link file can also point to another
Link file.

The MPEX %LISTF command has been enhanced to identify the target of a link
file for modes 2, 3, -3 and ID.  Finally, MPEX's ISLINK file attribute may
be used within MPEX to select Link files, and the LINKTARGET file attribute
gives access to a link file's target filename.

See Section 4 for details on restricting the MPEX %PURGE command to ensure
that Link targets outside of a fileset are not inadvertently removed.


MPE Account and Group File Ownership
------------------------------------

Under the MPE/iX 5.0 Push release, MPE Group and Account files cannot have
ACDs assigned to them, so it's still not possible to prevent any user on the
system from using LISTF to inspect the contents of any MPE Group.

One significant change to Group and Account files was made: the file system
now tracks the Owner of an MPE Group and Account, and allows this attribute
to be changed via the ALTFILE command.  The Group ID of an MPE Group or
Account file may not be changed, however.


State-Change Timestamp
----------------------

Posix requires that at least three timestamps be maintained for all files,
identifying when the file data was last accessed, when it was last modified,
and when the file's status last changed.

From the Posix perspective, file status is modified when the file's Owner or
GroupID attributes are altered, when file permissions or link count are
changed and (for directories) when an entry in the directory is added or
removed.

To support these requirements MPE added a new State-Change timestamp for all
files.  This field may be displayed by MPEX's %LISTF ,DATES, -3 and ,POSIX
modes, and is accessible using the STATEDATE, STATETIME and STATEDATETIME
file attributes.  MPEX's %LISTF ,DATES and ,-3 modes also display the
traditional MPE file creation, last access, last modify and last restore
timestamps.

The MPE CI doesn't provide commands that display State-Change information,
but it may be retrieved using the CI's FINFO function.  It can be displayed
using the Posix shell's ls command, when the -c option is specified.

Files built prior to installing Posix on a system may not contain meaningful
information for this field.  For such files, the State-Change timestamp is
reported as January 1, 1970.  MPEX allows these files to be identified using
the STATEZERO attribute.


Section 2: MPEX Source Fileset extensions on a Posix system
-----------------------------------------------------------

As you might have expected, we've enhanced MPEX's fileset syntax to give you
access to files within the enhanced Hierarchical File System (HFS).  MPE's
:LISTFILE and :STORE commands were enhanced to do the same thing, so we made
sure that our extensions are as compatible as possible with MPE's.

The following notes summarize the principle changes made to MPEX's fileset
syntax.  I've used the %LISTF command to illustrate the various syntax
variations; remember that you can use this fileset syntax with any MPEX
command that accepts filesets.

- You can continue to specify files using traditional MPE syntax, as shown
  below:

     %LISTF file
     %LISTF file.group
     %LISTF file.group.account

  where file, group and account may contain the '@', '?' and '#' wildcards.

  Unlike MPE's :LISTF and :LISTFILE commands, MPEX's %LISTF command will now
  show you Posix files that are qualified by an MPE-syntax fileset, even if
  their filenames are not legal MPE syntax names.

  As all MPE-syntax filesets are upshifted (by MPE and MPEX), the only way
  you'll succeed in selecting Posix syntax files that contain lower-case
  characters or other Posix-syntax characters ('-' or '_') is via the '@' or
  '?' wildcard characters (unless you specify the fileset in HFS-syntax, see
  below).

  If you build a Posix-syntax filename containing embedded '.' characters,
  you'll also only be able to display it if you match the '.' characters
  using '@' or '?' wildcards.

  One last point: you can use MPE's :CHDIR command from within MPEX to
  change your Current Working Directory (CWD) to any MPE Group on the system
  (or, indeed, to any HFS directory that you have access to, including MPE
  Account files).  When you do this, MPEX's fileset defaults any unqualified
  Account and Group names to the Account and Group of your CWD, if your CWD
  points to an MPE Group.


- You can specify files by means of a pathname.  A pathname specifies file
  location by defining a list of its parent directories, separated by '/'
  characters.  Pathnames which specify file location relative to the
  directory root are classified as HFS syntax absolute path specifications,
  and have a leading '/' character.

  For example:

    %LISTF SL.PUB.SYS

  may be expressed using an absolute pathname as

    %LISTF /SYS/PUB/SL


  Such path specifications are analogous to fully-qualifying a filename in
  MPE syntax.

  When using HFS syntax, you can directly specify the full set of characters
  that can appear within a Posix-syntax filename, including the '.', '-',
  '_' characters, and lowercase 'a' through 'z'.

  However, HFS syntax file pathnames are case sensitive, so you won't
  qualify the file SL.PUB.SYS if you use the following:

    %LISTF /sys/pub/sl


  The only way to perform case insensitive pattern matches with HFS syntax
  filesets requires the duplicate specification of every caseless character
  inside the '[..]' wild-card operator.  The '[..]' wild-card matches one
  character from a character sequence ([abc]), from a range of characters
  ([a-c]), or from combinations of multiple sequences or ranges ([a-cx-z5]).

  For example, to search for upper- or lower-case 'XYZ' files in PUB.SYS
  using HFS syntax, you'd have to use:

    %LISTF /SYS/PUB/[xX][yY][zZ]


  The '@' wildcard character matches files (or directories) at the level in
  the path where it's specified.  It can't be used to match more than one
  directory level.  For example:

    %LISTF /SYS/@/ABC

  will select all 'ABC' files directly beneath any Group in the SYS Account.
  It will also match files within any HFS directories built directly beneath
  the SYS Account.


  If a path specification ends with a '/', both MPE's :LISTFILE command and
  MPEX interpret this as including all files beneath this point, at any
  level.  This is useful for selecting all files within a given directory,
  without knowing if they're nested deeper within sub-directories.

  But what if you want to find all occurrences of a given file anywhere
  underneath a given directory, without knowing at what level they are?

  The problem with the trailing '/' is that it can't be followed by anything
  else, such as a filename pattern.  What if you want to find all files that
  match a pattern at any level beneath a given directory?

  MPE's :LISTFILE solution is to require you to perform a :LISTFILE of all
  files beneath the specified directory, and then use new syntax (the ;NAME=
  keyword) to filter out everything except the files you want to see.  For
  example, to find all files matching the pattern 'A?Z' at any level beneath
  the SYS Account, you'd use:

    :LISTFILE /SYS/; NAME=A?Z ; FORMAT=6

  unfortunately, :LISTFILE is the only command that supports this extension,
  so if you want to do this with MPE's :STORE or :PURGE, you'd be out of
  luck.


  Within MPEX, the sequence '//' may be used as a special wildcard that's
  interpreted to mean "match any number of directories".  As we allow the
  '//' to appear within a path specification, you can therefore simply use
  the following MPEX command:

    %LISTF /SYS//A?Z ,6


  You can only use the '//' wildcard once within a path specification, and
  it can't be followed by any other '/' characters.

  Of course, this works with every MPEX command that works on a fileset (see
  Appendix A for a full list).


- You can specify filenames relative to your current location (CWD) by
  starting the pathname with a '.' character.  This is equivalent to using
  partially or unqualified filenames in MPE syntax, and having them default
  to your logon Group and Account.

  Path names that start with './' are assumed to be relative to your current
  location (CWD), while path names that start with '../' are assumed to be
  relative to your CWD's parent directory.

  Relative path specification works because every directory effectively
  contains two 'hidden' entries that are not visible using any %LISTF or
  :LISTFILE command, but which are useful when constructing relative HFS
  pathnames:

  .   is a directory entry that points to the directory itself.
  ..  is a directory entry that points to the directory's parent directory.

  You can use multiple '../' elements to 'back-up' to an ancestor directory
  more than one level up relative to your CWD, if desired.


- As the '-' character is legal within an HFS syntax filename (although not
  at the start), if you wish to subtract one HFS fileset from another, you
  must prefix the '-' subtraction operator by a space to remove any
  ambiguity.

  For example, to list all SLs in the SYS Account, excluding any in PUB.SYS,
  you must use the following command:

    %LISTF /SYS/@/SL -/SYS/PUB/@

  This will not work if the space before the '-' is omitted.


- You can use the above syntax variations with any MPEX command that accepts
  filesets.  See Appendix A for a list of all fileset-accepting MPEX
  commands, and Appendix B for a list of all MPEX %LISTF modes.

  This bears repeating, because HP chose to not enhance the MPE :LISTF
  command to allow access to Posix files, instead forcing you to use the
  :LISTFILE command, with its syntax extensions.

  MPEX has always allowed you to combine multiple filesets with multiple
  selection criteria in any of the above commands.  When you use Version 25.
  on a Posix system, you gain the ability to mix Posix and MPE syntax, as
  well as using any of the new Posix file attributes (see Appendix D for a
  complete list), all without having to learn any new commands or syntax.

- MPEX commands that accept filesets also accept indirect files.  MPEX has
  been enhanced to allow MPE and HFS syntax filenames to be specified inside
  indirect files.  MPE's :STORE also accepts mixed-syntax filenames.

- In order to ease migration to Posix, MPE's :STORE was modified after the
  MPE/iX 4.5 release to allow '@.@' type filesets to be used to Store HFS
  files using MPE syntax.

  In particular, Store maps the following MPE syntax filesets to HFS
  'equivalents':

    @.GROUP.ACCOUNT .... mapped to /ACCOUNT/GROUP/
    @.@.ACCOUNT     .... mapped to /ACCOUNT/
    @.@.@           .... mapped to /
    @.@             .... mapped to /logon-account/
    @               .... mapped to /cwd/

  The intention was to allow Posix files to be backed up without requiring
  changes to system backup procedures.  Unfortunately, these changes result
  in some inelegancies.  For example, as the above mappings are only assumed
  when using inclusion (+) filesets, the following command:

    :STORE @.@.@ -@.@.@        is mapped to         :STORE / -@.@.@

  and results in the storing of all HFS named files on the system.


  The mappings are only performed when the fileset specifies '@' in the
  filename part (and not when using anything other than '@'), and are only
  performed by the :STORE and :RESTORE commands (not by :LISTFILE or :PURGE,
  for example).

  MPEX does NOT perform the above mappings.  All source filesets work
  exactly the same way in all MPEX commands, there are no exceptions, and
  all enhancements are available to all MPEX fileset-aware commands.


Section 3: MPEX Target Fileset extensions on a Posix system
-----------------------------------------------------------

Appendix C contains a list of all MPEX commands that operate on both Source
and Target filesets.  Of course, all these commands may be used with single
filenames (using MPE and/or HFS syntax), but our interest here involves how
to use wildcard characters with HFS syntax filesets.

The following MPEX command file can be very useful when investigating the
use of MPEX's Target Filesets: it allows you to experiment with Target
Filesets using MPE and/or HFS syntax, without actually performing any file
operations.  This four-line command file should be typed in and saved as a
fixed or variable unnumbered ASCII file, with no filecode.  I suggest that
you save it as FILESET.CMD22.VESOFT (thus making it available system-wide to
MPEX users), but you can keep it anywhere, using any name.

  PARM CS$source, CS$target
  REPEAT
    ECHO !mpexcurrentfile ==!> ![OBJECTFILE ('!target')]
  FORFILES !source


This command file requires you to supply two filesets: Source and Target
(separated by a comma or semicolon).  It simply displays every qualifying
file in the Source, with the corresponding Target filename that each file is
mapped into.  Either fileset may be specified in MPE or HFS syntax,
independently of each other.

For example:

  %FILESET ?L.pub.sys, /TELESUP/PUB/directory/=

displays

  NL.PUB.SYS ==> /TELESUP/PUB/directory/NL
  SL.PUB.SYS ==> /TELESUP/PUB/directory/SL
  XL.PUB.SYS ==> /TELESUP/PUB/directory/XL

and

  %FILESET /SYS/P@, /A/B/C/=

displays

  /SYS/PCBACKUP ==> /A/B/C/PCBACKUP
  /SYS/PUB ==> /A/B/C/PUB


Using Wildcards with MPE-syntax Target Filesets inside MPEX
-----------------------------------------------------------

When specifying Target filesets in MPE syntax, MPEX has always allowed '@'
and '=' wildcards to be specified.  In the context of an Target Fileset,
the following wildcards are supported:

'=' .... Interpreted as 'replace with the entire corresponding Source
         Fileset element', meaning Filename, Group, Account or Lockword,
         depending on context.

         For example,

           %COPY S@.DEV.AP, B=.DEV.AP

         will copy the file STEST.DEV.AP into the file BSTEST.DEV.AP -- the
         '=' in the Target Fileset is replaced by 'STEST', the entire file
         file portion of the Source file name.

'@' .... Interpreted as 'replace with the part of the corresponding Source
'?'      Fileset element that is matched by the same wildcard character in
'#'      the Source File name.

         For example,

           %COPY S@.DEV.AP, B@.DEV.AP

         will copy the file STEST.DEV.AP into the file BTEST.DEV.AP -- the
         '@' in the Target Fileset is replaced by 'TEST'.


Using Wildcards with HFS-syntax Target filesets inside MPEX
-----------------------------------------------------------

When specifying Target filesets in HFS syntax, MPEX now supports the
following wildcards:

'=' .... Interpreted as 'replace with the entire corresponding Source
         Fileset element', meaning the corresponding portion of the Source
         file name delimited by '/' characters.  The element is matched with
         the Source Fileset element nested at the same level.

         For example,

           %FILESET /SYS/PUB/?L, /=/PUBCOPY/=

         will generate

           /SYS/PUB/NL ==> /SYS/PUBCOPY/NL
           /SYS/PUB/SL ==> /SYS/PUBCOPY/SL
           /SYS/PUB/XL ==> /SYS/PUBCOPY/XL


         and

           %FILESET ?L.pub.sys , /=/PUBCOPY/=

         performs the equivalent operation

           NL.PUB.SYS ==> /SYS/PUBCOPY/NL
           SL.PUB.SYS ==> /SYS/PUBCOPY/SL
           XL.PUB.SYS ==> /SYS/PUBCOPY/XL

'@' .... Interpreted as 'replace with the part of the corresponding Source
'?'      Fileset element that is matched by the same wildcard character in
'#'      the Source file name.  These wildcards may only appear in a Target
         Fileset if they also appear in the Source Fileset.


         For example,

           %FILESET /SYS/PUB/@(CODE='SL'), /@copy/lib

         generates

           /SYS/PUB/SL ==> /SLcopy/lib


         while

           %FILESET /SYS/@UB/?L, /@ub/?l

         generates

           /SYS/PUB/NL ==> /Pub/Nl
           /SYS/PUB/SL ==> /Pub/Sl
           /SYS/PUB/XL ==> /Pub/Xl

'==' ... Interpreted as meaning 'replace with the entire Source Fileset
         path', meaning the Source Fileset up to BUT NOT INCLUDING the final
         element.

         For  example,

           %COPY /A/B/C/D/@, ==/X@    will copy to   /A/B/C/D/X@

         and

           %RENAME /level1/level2/level3/level4/level5/file1, ==/file2

         will rename file1 to file2 within its current directory, without
         having to re-specify the entire path.

'//' ... Interpreted as meaning 'replace with any number of directories and
         subdirectories'.  An '//' may not be followed by another '/',
         meaning that a '//' may only be followed by a wildcarded filename.

         A '//' wildcard may only appear in a Target Fileset if it also
         appears in the Source Fileset.

         For example,

           %FILESET /SYS//NL, /XYZ//=

         generates

           /SYS/HPBIN/NL ==> /XYZ/HPBIN/NL
           /SYS/PUB/NL ==> /XYZ/PUB/NL

If the target of a %COPY or %RENAME operation is a directory, then all files
from the Source Fileset will be copied or renamed into the directory.


Section 4: Using Posix File Attributes within MPEX Extended Filesets
--------------------------------------------------------------------

MPEX allows further selection of files in an MPEX source fileset to be
performed by following the fileset with an '()' delimited fileset expression
using any of a wide selection of file attributes and operators.  We refer to
such a fileset as an 'Extended Fileset'.

Appendix D contains a complete list of all file attributes that are
accessible using MPEX on Posix systems.  This section provides examples of
how useful MPEX can be when working on a Posix system.


- To find a given filename, anywhere on the system:

    %LISTF //filename ,6

  Note: the filename specified is case sensitive.


- To list all MPE Accounts, with their creation dates:

    %LISTF /@(ISACCT) ,DATES


- To list all MPE Groups, with their contents, in a compact format:

    %LISTF /@/@ ,2

  See Section 5 for examples of %LISTF output.


- To list all MPE Accounts and Groups in a compact format:

    %LISTF /@(ISACCT) ,2


- To list all files and directories that lie outside of an MPE Account:

    %LISTF / (ACCOUNT='') ,2 ;NOEXPAND


- To list all files that are not shown by MPE's :LISTF command:

    %LISTF / (ISHIDDEN)


- To list all files within MPE Accounts created by users within other MPE
  Accounts:

    %LISTF @.@.@(OWNER NOT MATCHES '@.'+ACCOUNT),POSIX

  The Owner attribute is a string; we want to select files whose Owner
  doesn't match the pattern '@.ACCOUNT', where 'ACCOUNT' is replaced by each
  file's Account attribute.  We use '@.'+ACCOUNT to construct the required
  pattern for each file.

  An alternate (and simpler) method uses the CREATORACCOUNT attribute,
  which directly returns the Account-part of the Owner attribute:

    %LISTF @.@.@(CREATORACCOUNT<>ACCOUNT),POSIX


- To list all files on system whose Owners are not currently existing MPE
  Users:

    %LISTF / (UID=0 and OWNER<>'0'),POSIX

  UID is an integer attribute, and can be compared to the integer constant
  0.  Owner is a string attribute, and must be compared to the quoted
  string '0'.


- To list all files on system whose Group IDs do not correspond to currently
  existing MPE Accounts:

    %LISTF / (GID=0 and GROUPID<>'0'),POSIX

  GID is an integer attribute, and can be compared to the integer constant
  0.  GroupID is a string attribute, and must be compared to the quoted
  string '0'.


- To list all files on system that have been renamed cross-Account from
  one MPE Account to another:

    %LISTF @.@.@ -@.@.HPSPOOL (GROUPID<>ACCOUNT),POSIX

  HPSPOOL Account files are excluded because they use a special mechanism to
  allow files within the IN and OUT groups to be controlled by users located
  in other Accounts.


- To list all files on system that are owned by users in SYS Account,
  but which lie outside of the SYS Account:

    %LISTF / (OWNER='@.SYS' and GROUPID<>'SYS'),POSIX


- To rename files from one MPE Account to another, but ensure that they are
  not automatically assigned ACDs:

    %RENAME @.@.account1, =.=.account2 ;LOCAL ;DELACD

  This involves altering the file's GROUPID so that they are 'local' to the
  target MPE Account.  It doesn't, however, modify the files' Creators.


- To modify the Account-part of the Owner field so that it's changed to
  the current MPE Account name.

    %ALTFILE @.@.account2 ;CREATOR= =.ACCOUNT2

  If the new Owner names constructed don't actually exist as legal MPE
  users, you'd also need to specify the ;NOCHECK keyword.


- To alter all files within an MPE Account so they no longer have ACDs:

    %ALTFILE @.@.account (HASACD) ;LOCAL; DELACD

  This involves altering their GROUPID so that it matches the file's
  Account.


- To alter all files within an MPE Account so that they're owned by users
  within the MPE Account:

    %ALTFILE @.@.account (OWNER NOT MATCHES '@.'+ACCOUNT) &
                         ;OWNER= =.ACCOUNT ;NOCHECK

  The ;NOCHECK keyword (which requires SM capability) is required in case
  you end up specifying an Owner that does not currently exist as an MPE
  user within the Account.


- To alter all files within an MPE Account whose owners don't currently
  exist so that they're owned by a specific MPE User:

    %ALTFILE @.@.account (UID=0) ;OWNER=MANAGER.ACCOUNT


- To alter all files owned by a particular MPE User so that they're owned by
  another MPE User:

    %ALTFILE @.@.@(OWNER="USER.ACCT") ;CREATOR= USER2.ACCT2

  If the files were built prior to installing Posix, their Owner fields may
  not contain the correct Account names.  In this case you'd need to use the
  following:

    %ALTFILE @.@.@(OWNER MATCHES "USER.@") ;CREATOR= USER2.ACCT2


- To copy all files in an Account to hierarchical directories underneath a
  directory in the logon Group, maintaining all directory levels, and
  automatically creating all required sub-directories:

    %COPY /ACCT1//, ./acct1// ;CREATE

  This copies all files inside the MPE 'ACCT1' Account beneath the directory
  'acct1' in the user's CWD.  Assuming that ACCT contains two MPE Groups,
  each of which contains two files, then if the user is logged on inside
  PUB.USER, the following files will be copied:

    -----Copying /ACCT1                => /USER/PUB/acct1
    -----Copying /ACCT1/GROUP1         => /USER/PUB/acct1/GROUP1
    -----Copying /ACCT1/GROUP1/FILE1   => /USER/PUB/acct1/GROUP1/FILE1
    -----Copying /ACCT1/GROUP1/FILE2   => /USER/PUB/acct1/GROUP1/FILE2
    -----Copying /ACCT1/GROUP2         => /USER/PUB/acct1/GROUP2
    -----Copying /ACCT1/GROUP2/FILE1   => /USER/PUB/acct1/GROUP2/FILE1
    -----Copying /ACCT1/GROUP2/FILE2   => /USER/PUB/acct1/GROUP2/FILE2


- To purge a directory, and all files beneath it:

    %PURGE ./SPLASH/


- To locate all HFS directories, not including MPE Groups and Accounts:

    %LISTF / (ISDIR and NOT ISACCT and NOT ISGROUP) ,6


- To locate all Link files in PUB.SYS that point to a particular file:

    %LISTF @.PUB.SYS (ISLINK and LINKTARGET='/SYS/PUB/STORE') ,2

  or even

    %LISTF @.PUB.SYS (LINKTARGET=FPXIFY ('STORE.PUB.SYS')),2

  The target of a link file may be specified (using the NEWLINK command)
  using either MPE or HFS syntax.  MPEX's LINKTARGET file attribute always
  returns target filenames in HFS syntax, so if you need to match
  LINKTARGET, you must either compare it to an HFS syntax filename, or use
  MPEX's FPXIFY(...) function to convert from MPE to HFS syntax.

  If the Link file was created with a relative HFS-syntax pathname as the
  target filename, then LINKTARGET will return a relative-syntax target
  filename, and the above solution won't necessarily work.


- To remove files in a fileset, but ensure that no Link target files outside
  the fileset are removed (remember that attempts to purge a Link file
  actually remove the Link's target file):

    %PURGELINK @.@.ACCT (ISLINK)
    %PURGE @.@.ACCT

  Although this is the simplest way to ensure that the %PURGE operation
  doesn't remove needed files, the following solution may also be useful:

    %PURGE @.@.ACCT (LINKTARGET='' or LINKTARGET MATCHES FPXIFY('@.@.ACCT'))

  this only attempts to purge Link files whose targets also qualify in the
  %PURGE command's fileset.  It won't remove any Link files themselves.
  Note however that if a Link file points to another Link file, then
  recovering the LINKTARGET of the first Link file will give you the name of
  the second Link file, not the ultimate target filename.


- To associate a brief descriptive label with a file, and display these
  descriptions using %LISTF:

  First, the label is defined using the new %IDENTIFY command:

    %IDENTIFY SRC022, "Latest source: 95/05/17"

  The label may subsequently be displayed using %LISTF ,ID:

    %LISTF SRC022, ID

                      Rec                  Last Last
    Filename  Code   Size Type   EOF  Sect  Acc  Mod  Identification
    --------  ----- ----- ---- ----- ----- ---- ----  ----------------------

    SRC022           128W FB     128   128   25   25  Latest source: 95/05/17


  The contents of a label may even be referenced in an extended fileset:

    %PRINT @(IDCONTAINS ("95/05") )


- To locate all files in PUB.SYS that are related to LINKEDIT:

    %LISTF @.PUB.SYS (IDCONTAINS ('LINKEDIT')) ,ID


  which displays the following:

                      Rec                  Last Last
    Filename  Code   Size Type   EOF  Sect  Acc  Mod  Identification
    --------  ----- ----- ---- ----- ----- ---- ----  ----------------------

    LINKEDIT  NMPRG  128W FB    2950  2960    1    8  MPE LINKEDIT command
    LKEDCAT           80B FA     410   144    1   69  LINKEDIT messages
    LKEDHELP          80B FA    4453  1424    1   69  LINKEDIT help file

  This selects files based on finding a match in the predefined
  identification data that MPEX's %LISTF ,ID displays.  This information is
  supplied for most PUB.SYS files, as well as for HPBIN.SYS and VESOFT
  account files.


Section 5: MPEX %LISTF command changes
--------------------------------------

Appendix B contains a list of all MPEX %LISTF modes, together with sample
output.  This section will highlight the significant changes made.


Directory Expansion
-------------------

%LISTF modes 2, 3 and ID have all been modified to expand all directory
files (including MPE Groups) encountered.

This directory expansion may be inhibited by specifying the ;NOEXPAND (or
;NOEXPANDDIR) keyword on the %LISTF command.


Suppressing display of 'Hidden' Files
-------------------------------------

Although all MPEX %LISTF commands have been modified to display qualified
Posix filenames, this can be suppressed by excluding files on the basis of
their ISHIDDEN attribute, for example

  %LISTF @.@.@(NOT ISHIDDEN) ,2


MPEX's ability to apply default fileset restrictions may also be used, by
issuing the following command:

  %SETVAR MPEXCritRestrictListf "NOT ISHIDDEN"


Directory Space Totals
----------------------

When used with MPE-syntax filenames, MPE %LISTF modes ,DATES ,ID ,POSIX and
numeric modes ,1 through ,5 continue to report MPE Group and (where
relevant) MPE Account space totals.

When used with HFS-syntax filenames these modes will now report disc usage
on a directory-by directory basis.


%LISTF ,2 changes
-----------------

The existing %LISTF ,2 output has been enhanced to include two new fields,
for all files:

  Days Acc ...... Days since file last accessed, or blank if accessed today.
  Days Mod ...... Days since file last modified, or blank if modified today.

File names that can't be shown in the available space will be displayed
wrapped over multiple lines (if necessary).  If Link files are encountered
the Link target will also be shown.

In addition to this, when %LISTF ,2 encounters a Directory file (including
MPE Group or Account files), it displays all files located within the
directory file using a new compact format.

For example, when the MPE command :LISTFILE,2 is used on a directory
file (either an HFS directory or an MPE Group or Account), the directory
information is reported as follows:

  :LISTFILE /TELESUP,2

  PATH= /

  CODE  ------------LOGICAL RECORD-----------  ----SPACE----  FILENAME
          SIZE  TYP        EOF      LIMIT R/B  SECTORS #X MX

            0W  ABD          0          0   0       32  1  *  TELESUP/


When the equivalent command is issued within MPEX, the MPE Account is
expanded into its constituent Groups:

  %LISTF /TELESUP ,2

  PATH= /

  FILENAME  CODE ------------LOGICAL RECORD-----------  ----SPACE----   --DAYS--
                   SIZE  TYP        EOF      LIMIT R/B  SECTORS #X MX   ACC MOD

  TELESUP /       ==>  BUG/      CS80/     DAT/      DCC0000/  DOC/
                       DOCXL/    DTS0000/  DUMP/     FSPSTORE/ HP36375/
                       HPC1700A/ IDAT/     IDPXL/    INFOXL/   ITPXL/
                       MPEXL/    NET0000/  NSRV0000/ O/        OSA23/
                       OSA44/    OSA51/    OSB30/    OSB78/    OSB79/
                       OSI0000/  PATCH/    PATCHXL/  PRVXL/    PUB/
                       PUBXL/    SA21/     SQL/      TI/       VESOFT/
                       VSTORE/   WORK/     XPT0407/  XPTB0301/


When %LISTF ,2 is used on non-directory files, data is formatted as follows:

  FILENAME  CODE  ---------LOGICAL RECORD---------  ----SPACE----  --DAYS--
                   SIZE  TYP     EOF     LIMIT R/B  SECTORS #X MX  ACC  MOD

  .sh_history        1B  BA     1614  214748647  1       16  1  *     2   1
  A.PUB.SYS        128W  FB        0      1023   1        0  0  *     2  21
  DIR1    /       ==>
  TDIR    /       ==>  77                A1                A2
                       A3long-file-name  B1...C...D...E    Byte
  FINFO2             1B  BA     5654      5654   1       32  1 12   203 203
  MAIN1            Link: /VESOFT/PUB/MAIN                16  1  *   261 261
  NL      * NMXL   128W  FB   103111   4096000   1   104448 54  *         4
                                                         1 reader
  zlibc.a5050
            NMRL   128W  FB     1955      1955   1     1968  8  *    73   7


The new last-accessed and last-modified data can be suppressed by using:

  SETVAR MPEXLISTFNODAYS TRUE


%LISTF ,-1 changes
------------------

This mode has been extended to show an extended file label (332 words
instead of the old 256 words).  It can be forced to be backward-compatible
via SETJCW MPEXLISTFLABELSIZE = 256.

An example of the extended format is shown below:

  F = SL.PUB.SYS
  00000000 24535953 54454D5F 4D415354 45522020 20202020 ....$SYSTEM_MASTER
  20202020 20202020 20202020 20300000 534C2020 20202020              0..SL
  20202020 20202020 50554220 20202020 20202020 20202020         PUB
  00000000 53595320 20202020 20202020 20202020 00000000 ....SYS             ....
  20202020 20202020 20202020 20202020 4D414E41 47455220                 MANAGER
  53595320 20202020 00000000 DC000010 055E0001 46112208 SYS     .........^..F.".
  00010001 00000000 00000300 0002D231 2D9B5E05 0002D231 ...............1-.^....1
  2D9B5E05 0002D621 210070A9 0002D5F6 161833B0 01813E00 -.^....!!.p.......3...>.
  00018800 0004E200 0001813E 0001813D 00000000 00000000 ...........>...=........
  04E20000 00000000 00000000 00000000 00000100 00000100 ........................
  00010000 00000000 00000407 00000000 00000000 00000000 ........................
  00000000 00000000 00000000 00000000 00000000 00000000 ........................
  00000000 00000000 00000001 0002D231 2D9B5E05 53595320 ...............1-.^.SYS
  20202020 20202020 20202020 01813E01 00000000                      ..>.....


%LISTF ,-3 (or ,XL3) changes
----------------------------

Although the general layout of %LISTF ,-3 is substantially unchanged, the
following changes have been made, either to maintain MPE compatibility, or
to make improvements to the MPE equivalent:

- MPEX always shows fully-qualified file Owner and Group ID fields.  If the
  filename is specified using HFS syntax, numeric UID and GID equivalents
  are also shown.

- MPEX shows the new Posix State-Change timestamp.  This field, as well as
  the file Restore timestamp that we reported in prior versions, is not
  shown by MPE's :LISTF or :LISTFILE commands.

- MPEX now shows VOLUME SET/CLASS/NAME information, including a comment
  ('$SYSTEM-MASTER') that identifies system bootfiles (these files must
  reside on LDEV 1, or you won't be able to reboot your system).

- MPEX identifies files that must have ACDs, as well as files that have
  (optional) ACDs assigned.  ACDs are automatically assigned to any file
  that is cross-Account renamed, such ACDs may be altered via ALTSEC, but
  may not be totally removed.

  MPEX shows **SECURITY IS ON, ACD EXISTS
          or **SECURITY IS ON, ACD REQUIRED
  when appropriate.

- shows SYMLINK target for Link files.

- shows Accessors, Protected and Nobackup fields.


An example of the extended format when using an MPE-syntax filename is
shown below:

  FILE: SL.PUB.SYS

  FILE CODE : 1031                FOPTIONS: BINARY,FIXED,NOCCTL,STD
  BLK FACTOR: 1                   CREATOR : MANAGER.SYS
  REC SIZE: 256(BYTES)            LOCKWORD:
                                  GROUP ID: SYS
  BLK SIZE: 256(BYTES)            SECURITY--READ:    ANY
  EXT SIZE: 0(SECT)                         WRITE:   ANY
  NUM REC: 98622                            APPEND:  ANY
  NUM SEC: 100352                           LOCK:    ANY
  NUM EXT: 52                               EXECUTE:
  MAX REC: 320000                         **SECURITY IS ON
                                  FLAGS   : 3 ACCESSORS,SHARED,3 R,2 W
  NUM LABELS: 0                   CREATED : WED, MAR  1, 1995, 11:50 AM
  MAX LABELS: 0                   MODIFIED: TUE, APR 18, 1995, 11:01 AM
  DISC DEV #: 1                   ACCESSED: THU, APR 20, 1995,  2:22 PM
                                  RESTORED: WED, MAR  1, 1995, 11:50 AM
                                  STATE   : WED, MAR  1, 1995, 11:50 AM
  SEC OFFSET: 0                   LABEL ADDR: **
  UFID      : $055E0001 $46112208 $000162BE $1E023038 $028A3C2E
  VOLNAME   : MPEXL_SYSTEM_VOLUME_SET:MEMBER1          ($SYSTEM_MASTER)


When an HFS-syntax filename is used, the information shown in the first few
lines is modified as follows:

  FILE: /SYS/PUB/SL

  FILE CODE : 1031                FOPTIONS: BINARY,FIXED,NOCCTL,STD
  BLK FACTOR: 1                   OWNER   : MANAGER.SYS       UID: 1
  REC SIZE: 256(BYTES)            GROUP ID: SYS               GID: 1


%LISTF ,ID mode added
---------------------

The new %LISTF ,ID mode attempts to display as much information as possible
to allow files to be identified.  The following information is reported:

- File code, record size and type, EOF and sectors used.

- Number of days since the file was last accessed, and last modified.

- The first 3 lines of data within the file (for ASCII or QEDIT files),
  without changing the file's access timestamp.

- Brief descriptions of most PUB.SYS, HPBIN.SYS and VESOFT Account files.

- Target filename of any Posix Link files.


For QEDIT files %LISTF ,ID shows the logical language, record length and
number of lines in the file, also without changing the file's access
datestamp.  QEDIT 'jumbo' files are identified with a 'QEDIT+' file code.

MPEX's new %IDENTIFY command may be used to enter your own file descriptions
for any file on the system.

The length of data extracted from data files may be configured using the
MPEXLISTFIDLINES JCW (defaults to 3 lines), the indent for lines after the
first is controlled by the MPEXLISTFIDINDENT JCW (defaults to 2 columns).

An example of the new format is shown below:

                    Rec                  Last Last
  Filename  Code   Size Type   EOF  Sect  Acc  Mod  Identification
  --------  ----- ----- ---- ----- ----- ---- ----  ---------------------------

  BASIC     PROG   128W FB     360   368   25   25  Hooked BASIC.PUB.SYS
  CI        PROG   128W FB      11    16    1   25  Command Interpreter
  CIMGR            256B FA       3    16    1   25  :INITUDCS
                                                      :INITMPEXMGR
                                                      :INITREDO
  DATAFILE         256B VA       7   256            Encrypted Today at 15:23 by
                                                    TOM,MANAGER.VESOFT
  FONEDB    PRIV   128W FB       6    16   73   73
  FONEDB01  PRIV   512W FB      35   144   73   73  NOTES (master)
  FONEDB02  PRIV   384W FB       6    32   73   73  A-KEY (auto)
  SL      * SL     128W FB  101749  102K         2  System Library (cm)
  QED123    QEDIT+1000B DATA     5    16   23   31  This is an example of a
                                                      QEDIT "Jumbo" file


%LISTF ,DATES mode added
------------------------

The new %LISTF ,DATES mode summarizes all of a file's various date and time
stamps (including the Restore and State-change fields) on a single line.

This LISTF mode is available on all MPE releases, and reports all time and
date information in a common format.  It is an improved version of the
%LISTF ,3 mode that MPEX has long provided.

The output contains the following information:

  File .......... Filename.
  Created ....... Date and Time file created.
  Modified ...... Date and Time file last modified.
  Accessed ...... Date and Time file last accessed.
  Restored ...... Date and Time file last restored.
  State-Change .. Date and Time file's Posix state last changed.

The date format is one of the following:

  Today ......... Represents today.
  Mon..Sun ...... Represents Dates within past week.
  MM/DD ......... Represents Dates within past year.
  YYMMDD ........ Represents Dates greater than one year old.

The MM/DD and YYMMDD formats change to match the current setting of the MPEX
date format, when %SET DATE is used to select between the various date
display formats (MDY, DMY or YMD).

An example of the new format is shown below:

  File           Created     Modified      Accessed      Restored  State-Change
  ---------- -----------  -----------  ------------  ------------  ------------

  SL          3/01 11:50    Tue 11:01     Thu 14:22    3/01 11:50    3/01 11:50


%LISTF ,POSIX mode added
------------------------

The new %LISTF ,POSIX mode can be very helpful in diagnosing file access
problems related to Posix file attributes.

The output contains the following information:

  File .......... Filename.
  Type .......... Filetype (as shown by LISTF ,2).
  UID & Owner ... Numeric UID and corresponding ASCII equivalent.
  GID & Group ... Numeric GID and corresponding ASCII equivalent.
  ACD ........... 'Yes' if ACDs defined, 'Must' if ACDs are required.
  State ......... Posix State change timestamp.

A '?' is shown in place of UID and GID if the actual numeric values are zero
(which occurs if the current ASCII fields do not currently exist as legal
Users or Accounts within MPE's User directory).

The ASCII Owner field is preceded by a '!' if the file owner is located in
another Account to that in which the file is located.  The ASCII Group field
is preceded by a '!' if it does not match the Account in which the file is
located.  The State change field is prefixed by a '~' if the field is either
uninitialized, or earlier than the file's Creation timestamp, or later than
the file's Creation, Access and Modify timestamps.


An example of the new format is shown below:

  File       Type   UID Owner               GID Group ID  ACD        State
  ---------- ---- ----- ----------------- ----- -------- ---- ------------

  NL         FB       1 MANAGER.SYS           1 SYS             3/01 11:53
  SL         FB       1 MANAGER.SYS           1 SYS             3/01 11:50
  XL         FB       1 MANAGER.SYS           1 SYS             3/01 11:52

  GROUP     TOTAL:     3 FILES                         280576 SECTORS


Note that the actual format of the information shown by %LISTF ,POSIX
is subject to change in future MPEX releases.


Section 6: MPEX %ALTFILE and %COPY command changes
--------------------------------------------------

Appendix F gives a complete syntax summary of the MPEX %ALTFILE and %COPY
commands.  Significant changes are described below:


%ALTFILE ;CREATOR
-----------------

The %ALTFILE ;CREATOR keyword has been extended to allow a file's Owner
attribute to be specified using any of the following forms:

  CREATOR = User               Set Owner to specified User, sets Account
                               part of Owner field to file's Account.

  CREATOR = User.Account       Set Owner to specified User.Account.

  CREATOR = *.*                The '*' means "substitute user's logon User
                               and/or Account".  The '*' may be mixed with
                               the other forms described here.

  CREATOR = =.=                The '=' means "leave matching part of Owner
                               User and/or Account unchanged".  The '=' may
                               be mixed with the other forms described here.

In addition (for compatibility with the new MPE :ALTFILE command) you can
also use the ;OWNER= keyword instead of ;CREATOR=.  The above forms may also
be quoted.

By default, any specified Owner must be a legal MPE User and Account name.
To defeat this requirement, SM users may specify the ;NOCHECK keyword.


%ALTFILE ;GROUPID
-----------------

The %ALTFILE ;GROUPID keyword has been extended to allow a file's Group ID
attribute to be specified using any of the following forms:

  GROUPID = Account            Set Group ID to specified MPE Account.

  GROUPID = *                  The '*' means "substitute user's logon
                               Account".

  GROUPID = =                  The '=' means "leave Group ID unchanged".

The above forms may also be quoted.

By default, any specified Group ID must be a legal MPE Account name.  To
defeat this requirement, SM users may specify the ;NOCHECK keyword.


%ALTFILE ;NOCHECK
-----------------

The %ALTFILE ;NOCHECK keyword has been extended to allow a file's Owner or
Group ID to be set to values that don't currently exist as legal MPE
'User.Account' or Account names.  The keyword may only be specified by SM
users.

The ;NOCHECK keyword will not allow Owner or Group ID to be set to illegal
values, just to values that don't currently exist.


%ALTFILE ;DELACD
----------------

The %ALTFILE ;DELACD keyword has been added to allow the removal of all ACDs
currently assigned to a file.  It operates in a similar fashion to the
ALTSEC command's ;DELACD keyword, but allows a file's Group ID to be
modified and the file's ACDs to be removed in a single operation.

The DELACD request will fail if the file's Group ID does not match its MPE
Account.


%ALTFILE ;LOCAL
---------------

The %ALTFILE ;LOCAL keyword has been added to allow the file's Group ID
attribute to be easily set to the file's MPE Account.  It may only be used
by users with SM capability, and may not be specified at the same time as
the ;GROUPID keyword.

The Keyword may also be specified as ;LOCALGROUPID.


%COPY ;CREATE
-------------

The ;CREATE keyword causes the %COPY command to automatically build any HFS
directories required to implement the requested copy operation.  This can be
very useful when copying all files within an MPE Account (or any other
multi-level directory structure) beneath another HFS directory.


%COPY ;CREATEQ
--------------

The ;CREATEQ keyword operates identically to the ;CREATE keyword, but
suppresses all directory creation messages.


%SET CREATORPROTECT
-------------------

Prior MPEX versions allowed any user to use %ALTFILE to change the Creator
of files to which they had read and write access, although system managers
could use the %SET CREATORPROTECT command to prevent this.  To remain
compatible with MPE's :ALTFILE command, MPEX now enforces CREATORPROTECT,
limiting use of %ALTFILE ;CREATOR to users with appropriate privileges.


%ALTFILE and internal structural changes
----------------------------------------

%ALTFILE has been enhanced to accept the following new keywords:

  %ALTFILE  [;BINARY|ASCII]
            [;FIXED|VARIABLE|UNDEF|BYTE]
            [;KEEPTRAIL]
            [;REC= newrecordlength]

These allow files to be converted between Fixed, Variable, Undefined or Byte
stream record types, and/or between ASCII or Binary file types.

The ;REC= keyword allows you to specify the record length to be used when
converting to Fixed or Variable record length, and ;KEEPTRAIL controls
whether trailing blanks should be retained when converting from Fixed to
Variable record length (they're stripped by default).


Section 7: MPEX %RENAME command changes
---------------------------------------

Appendix G gives a complete syntax summary of the MPEX %RENAME command.

The ;DELACD, ;LOCAL, ;CREATE and ;CREATEQ keywords have been added, and
operate identically to the corresponding %ALTFILE and %COPY equivalents,
described in Section 6.




Section 8: MPEX %ALTSEC command changes
---------------------------------------

MPE's :ALTSEC was one of the very few MPE commands that accepted simple
filesets, but for some reason, although it accepts filenames in either MPE
or HFS syntax, it hasn't (yet?) been enhanced to accept filesets when used
with HFS syntax filenames.

MPEX's %ALTSEC accepts enhanced MPEX filesets using MPE and/or HFS syntax,
and provides access to all MPE :ALTSEC keywords.




Section 9: MPEX %PURGE command changes
--------------------------------------

With version 25., the MPEX %PURGE command has been enhanced to allow Posix
directory files to be purged.

The %PURGE command normally purges files in the order in which they're
encountered in the supplied fileset.  As Posix directory files normally
appear before the files that they contain, and as you can't purge any
directory file that still contains other files, special handling was
required.  As a result, whenever %PURGE needs to remove Posix directory
files, it will defer purging them until after all files within the directory
have been deleted.

MPE's :PURGE command (even when used with MPE's limited filesets) will not
purge HFS directory files.

MPE's :PURGEDIR command, when used with the ;TREE and ;NOCONFIRM keywords,
will remove directories together with their contents, but provides no
display of filenames as it removes them.

Interestingly, MPE's :PURGELINK command can be used to purge HFS directory
files (and other non-link files), but it doesn't accept wildcards, and
cannot be used to purge an HFS directory together with its contents.

The Posix shell's rm command can be used with '-rf' flags to recursively
purge a directory and its contents, but it doesn't display the names of
files as they're purged, nor does it provide the equivalent of the MPEX
%?PURGE command's file-by-file 'ok to purge?' prompt.  It's also unable to
purge files having lockwords or privileged filecodes.

One major problem with the Posix shell's rm command, however, comes from its
ancestry on Unix: the rm command will purge (actually, unlink from the
directory) all files that you specify, including files that are currently
in-use by other processes.  While this may be useful on occasion (and may
well be implemented as an optional %PURGE keyword in future MPEX releases),
this is most definitely not the default behavior that most HP3000 system
managers will appreciate.  In case you're wondering: no, the rm command has
no option that stops it from purging in-use files.

The MPEX %PURGE command will not, for compatibility reasons, purge MPE
Account or Group files, although it can be used to purge all files within
an MPE Group or Account, including (if the user has appropriate privileges)
files with negative filecodes or lockwords.


Section 10: MPEX %HELP command changes
--------------------------------------

With version 25., the MPEX Help facility has been extended with two major
additions:

- During installation, MPEX extracts the names of all available MPE help
  keys (from the system help files), and indexes them.  If you select help
  on any MPE topic, MPEX will display corresponding sections from the MPEX
  and MPE help files, with keywords highlighted.  Unlike MPE's :HELP
  command, you can easily page backwards and forwards through the Help
  section, using the standard MPEX help interface.

- During installation, MPEX extracts the names of all available Posix
  commands and functions, and inserts pointers into the MPEX help indexes.
  If you select help on any Posix topic, MPEX will extract the 'man' help
  text and display it using the standard MPEX help interface, where you can
  page backwards and forwards through the selected help text.


By default, %HELP looks through all of its internal indexes, hence typing
%HELP STORE will allows you to choose from the following topics:

    1. %MPEXSTORE, MPEX command
    2. MPE's :RESTORE help text
    3. MPE's :STORE help text
    4. MPE's :VSTORE help text
    5. STORED, file attribute variable
    6. MPE/V and MPE/iX differences: STORED attribute

Similarly, %HELP DIR now displays:

    1. MPE's :CHDIR help text
    2. MPE's :NEWDIR help text
    3. MPE's :PURGEDIR help text
    4. DIRACCOUNT, account attribute of files
    5. 'cmd syntax (executes QUERY commands directly from MPEX)
    6. >cmd syntax (executes SPOOK5 commands directly from MPEX)
    7. TARGET filesets, when the target is a directory
    8. ISDIR, file attribute variable
    9. DIRGROUP, group attribute of files
   10. POSIX dirname(1)  display directory components of path name

If you only want help on MPE commands, simply prefix the help key with a ':'
character, for example on an MPE/iX 5.0 system, %HELP :FILE will display the
following topics:

    1. MPE's :ALTFILE help text
    2. MPE's :ALTSPOOLFILE help text
    3. MPE's :BUILD help text
    4. MPE's :DELETESPOOLFILE help text
    5. MPE's :FILE help text
    6. MPE's :HPFILE help text
    7. MPE's :LISTFILE help text
    8. POSIX file(1)  determine file type
    9. MPE's :FILES help text

and %HELP :SPOOL shows the following:

    1. MPE's :ALTSPOOLFILE help text
    2. MPE's :DELETESPOOLFILE help text
    3. MPE's :OPENQ help text
    4. MPE's :RESUMESPOOL help text
    5. MPE's :SHUTQ help text
    6. MPE's :STARTSPOOL help text
    7. MPE's :STOPSPOOL help text
    8. MPE's :SUSPENDSPOOL help text
    9. MPE's :SPOOLER help text
   10. MPE's :SPOOLF help text
   11. MPE's :SPOOLING help text


and %HELP :CH shows the following:

    1. MPE's :CHANGELOG help text
    2. MPE's :CHDIR help text
    3. MPE's :CHGROUP help text
    4. POSIX chgrp(1)  change the group ownership of files and/or directories
    5. POSIX chmod(1)  change access permissions of a file
    6. MPE's :CHOICE help text
    7. POSIX chown(1)  change the ownership of files and/or directories


One piece of trivia: on the MPE/iX 5.0 push release, '%HELP :' reports over
600 MPE and Posix shell commands, including a number of lesser documented
MPE :HELP keywords.  For example, %HELP :SENTENCE reveals the following
syntax diagram example:

  "GO [UPSTAIRS] [RIGHT NOW] [TO {YOUR/MY/THE} {BEDROOM/BATHROOM}]
        [AND BRUSH {YOUR/THE DOG'S} {TEETH/HAIR/CLOTHES}]."

The output of typing HELP :DELI is left as an exercise for the reader.


If you want to see a list of all help topics available from within the Posix
shell, simply type %HELP POSIX.  We haven't included the full list of topics
shown here, as (on the MPE/iX 5.0 push release) it's over 200 entries long.


Finally, if you update your MPE version at any time, the first time that you
type %HELP after updating MPE, MPEX automatically rebuilds all of its
internal MPE help key indexes, and the output of %HELP will adjust to show
the MPE and Posix commands available on the new MPE release.


Help on the purpose of files within PUB.SYS and HPBIN.SYS may also be
gathered using the new %LISTF ,ID mode.  Version 25. comes pre-configured
with descriptions for most HP-supplied program and configuration files in
these two groups, and %LISTF ,ID makes use of this information.

As an example, typing %LISTF @CH@.HPBIN.SYS,ID on a 5.0 Push release system
displays the following information:

                   Rec                Last Last
  Filename Code   Size Type EOF  Sect  Acc  Mod  Identification
  -------- ----- ----- ---- --- ----- ---- ----  -----------------------------
  CHGRP    NMPRG  128W FB   576   576   55   55  Change file Group ownership
  CHMOD    NMPRG  128W FB   575   576   55   55  Change file access modes
  CHOWN    NMPRG  128W FB   578   592   55   55  Change file ownership
  ECHO     NMPRG  128W FB   463   464   55   55  Echoes arguments
  PATCH    NMPRG  128W FB   815   816   55   55  Change file using diff output
  PATHCHK  NMPRG  128W FB   519   528   55   55  Validate pathname
  TOUCH    NMPRG  128W FB   625   640   55   55  Update file modification date
  WHICH    NMPRG  128W FB   521   528   55   55  Show executable absolute path




Section 11: MPEX %PRINT command changes
---------------------------------------

The %PRINT command enhancements are not restricted to Posix systems, but
I'll briefly cover one interesting addition, the ;WAIT keyword.

The %PRINT ;WAIT keyword is analogous to the Posix shell's tail command when
used with the -f option, in that it displays the contents of a file, up-
dating the display whenever new data is written to the file.  Unlike tail,
however, %PRINT ;WAIT correctly handles MPE file types, including open
Spoolfiles.

Using ;WAIT, the %PRINT command pauses when it reaches the current EOF, and
looks to see if any processes currently have the file open for writing.  If
none do, the command terminates, but if any processes still have the file
open for writing, %PRINT goes into a loop, pausing and then re-checking to
see if the EOF has moved, and displaying any new data that has been written
to the file while it was pausing.

You can specify just ';WAIT', in which case a 5 second pause is used, or
';WAIT=<seconds>', which allows you to specify the pause length.  By default
the terminal bell is sounded whenever new data is detected; this can be
suppressed by specifying ';WAIT=-<seconds>'.

Because it has been implemented as an option to the MPEX %PRINT command, it
may be used in conjunction with all other %PRINT keywords, including
;SEARCH.  In addition, it can be used by the %PRINTO command to look at the
current state of an executing job's $STDLIST file, just by supplying the job
number you want to monitor.  Needless to say, this can be a very useful tool
in monitoring the progress of an executing job.

The %PRINT command also accepts the ;LONGWAIT keyword.  This modifies the
behavior of ;WAIT so that %PRINT continues to wait at the end of a file,
even if no processes currently are writing to the file.  When this option is
used, <Control-Y> must be hit to terminate the command.  This is useful when
monitoring a file that's continually being closed and re-opened for append
access.


APPENDIX A: List of MPEX commands operating on enhanced filesets
----------------------------------------------------------------

  ALLOCATE              EDITCHG                  RELEASE
  ALTFILE               ERASE                    RENAME
  ALTSEC                FCOPY                    SECURE
  ALTSPOOLFILE          FORFILES                 SHOWIN
  COPY                  LISTF                    SHOWOUT
  DBADGALT              NEWLINK                  SPOOLF
  DBGENALT              PRINT                    TOUCH
  DBMGRALT              PRINTO                   VECMDCH
  DEALLOCATE            PURGE                    VEOPENCH
  DELETESPOOLFILE       PURGELINK
  EDIT                  QEDIT

In addition to the above, the numerous CM and NM compiler commands supported
by MPE may all be used with filesets.




APPENDIX B: List of MPEX %LISTF modes accepting enhanced filesets
-----------------------------------------------------------------

        -1   same as    LABEL
        -2   same as    ACD
        -3   same as    DETAIL       same as   XL3
         0   same as    FILES
         1   same as    SUMMARY
         2   same as    DISC
         3
         4
         5
         6   same as    QUALIFY      same as   FILENAME
    ACCESS
     DATES
        DB
   DISCUSE
        ID
  MAXSPACE
     POSIX
   SAVABLE
       SEC
       XL3   same as    DETAIL
       XL4   same as    SECURITY




APPENDIX C: List of MPEX commands accepting Target Filesets
-----------------------------------------------------------

The following MPEX commands accept Source and Target Filesets:

  COPY .......... Copy files, optionally changing file characteristics.
  FCOPY ......... Use MPE :FCOPY, but with MPEX filesets.
  NEWLINK ....... Use MPE :NEWLINK command, but with MPEX filesets.
  RENAME ........ Rename files.

In addition to the above, the numerous CM and NM compiler commands supported
by MPE may all be used with Target Filesets for their various filename
parameters.  Type %HELP COMPILER from inside MPEX for more info.




APPENDIX D: List of File Attributes available inside MPEX on Posix systems
--------------------------------------------------------------------------

MPEX supports MANY file attribute variables; they're summarized here,
grouped according to their general usage.  Attributes of particular interest
on a Posix system are identified and described in more detail.

Attributes may return any of the following data types: Date, Time, String,
Integer, Real or Logical (Boolean).

This list includes all file attributes that are directly usable within MPEX
extended filesets, as well as the VEFINFO(file).attribute syntax and as
'RFILE.' prefixed attributes usable within %REPEAT...%FORFILES loops.

Refer also to Appendix E for details on a range of new VEFINFO-like
functions able to retrieve these file attributes for Link file targets.


Date/Time related:
------------------

  ACCDATE              .. Date file last accessed.
  ACCDATETIME          .. String representing ACCDATE+ACCTIME.
  ACCTIME              .. Time file last accessed.

  CREDATE              .. Date file created.
  CREDATETIME          .. String containing CREDATE+CRETIME.
  CRETIME              .. Time file created.

  MODDATE              .. Date file last modified.
  MODDATETIME          .. String containing MODDATE+MODTIME.
  MODTIME              .. Time file last modified.

  RSTDATE              .. Date file last restored.
  RSTDATETIME          .. String containing RSTDATE+RSTTIME.
  RSTTIME              .. Time file last restored.

  STATEDATE            .. Date file's state info last changed.       (POSIX)
  STATEDATETIME        .. String containing STATEDATE+STATETIME.     (POSIX)
  STATETIME            .. Time file's state info last changed.       (POSIX)
  STATEZERO            .. TRUE if file's state change field is
                          uninitialized.                             (POSIX)

  NEWERTHAN ('fileset')
                       .. TRUE if file has been modified later than the
                          corresponding file in the supplied Target Fileset
                          parameter; also TRUE if no corresponding Target
                          file exists.


File Name and Location information:
-----------------------------------

  ACCOUNT              .. String containing MPE Account name file is
                          located beneath, or null if the file is
                          not located beneath an MPE Account.        (POSIX)

  GROUP                .. String containing MPE Group name file is
                          located beneath, or null if the file is
                          not located beneath an MPE Group.          (POSIX)

  FULLNAME             .. String containing fully-qualified file name.

  OBJECTFILE ('fileset')
                       .. String containing name of current file, mapped
                          into the supplied Target Fileset parameter.
                          This function is only usable within the context
                          of MPEX's %REPEAT .. %FORFILES construct.  May
                          contain MPE or HFS syntax, depending on syntax
                          of current filename.                       (POSIX)

  PATH                 .. String containing HFS-syntax pathname of file,
                          not including the filename.                (POSIX)


File Security attributes:
-------------------------

  ACDREQUIRED          .. TRUE if the RENAME or ALTFILE;GROUPID= commands
                          have been used in such a way that MPE requires
                          that the file be protected by ACDs.  Also TRUE
                          for all files located outside of the traditional
                          MPE Group and Account structure.           (POSIX)

  HASACD               .. TRUE if ACDs have been assigned to the file.
                          ACDs may have been explicitly assigned using
                          the ALTSEC command, or automatically assigned by
                          the RENAME or ALTFILE;GROUPID commands.    (POSIX)

  ISRELEASED           .. TRUE if file security is off.  Note that
                          this attribute has no practical effect on
                          file access if the file is protected by ACDs.

  ISSECURED            .. TRUE if file security is on.  See ISRELEASED.


File Device information:
------------------------

  DEVICE               .. String containing file's Volume restriction.
  DEVICEISCLASS        .. TRUE if DEVICE restricted to a Volume Class.
  DEVICEISSET          .. TRUE if DEVICE restricted to a Volume Set.
  DEVICEISVOLUME       .. TRUE if DEVICE restricted to a Volume Name.
  DEVICESECTORS (ldev) .. Integer number of sectors of file located
                          on specified LDEV number.
  FLABLDEV             .. Integer LDEV number on which file label stored.
  ONDEVICE (ldev)      .. TRUE if at least one extent of file is located
                          on specified LDEV number.
  SECTORS              .. Integer number of sectors occupied by file.


Program file characteristics:
-----------------------------

Attributes that are only applicable to NM or CM program files are identified
with (NM) or (CM).

  PROG.FMTCAPS         .. String containing program formatted capabilities.
  PROG.PMCAP           .. TRUE if program has PM capability.
  PROG.MRCAP           .. TRUE if program has MR capability.
  PROG.DSCAP           .. TRUE if program has DS capability.
  PROG.PHCAP           .. TRUE if program has PH capability.
  PROG.IACAP           .. TRUE if program has IA capability.
  PROG.BACAP           .. TRUE if program has BA capability.
  PROG.DBSIZE          .. Integer size of global variable (DB) area.    (CM)
  PROG.DL              .. Integer PREP-time DL= value.                  (CM)
  PROG.HASPRIVSEG      .. TRUE if program contains privileged segments. (CM)
  PROG.ISOCTCOMPED     .. TRUE if program was :OCTCOMPed.               (CM)
  PROG.MAXDATA         .. Integer PREP-time MAXDATA= value.             (CM)
  PROG.NMHEAP          .. Integer LINK-time NMHEAP= value.              (NM)
  PROG.NMSTACK         .. Integer LINK-time NMSTACK= value.             (NM)
  PROG.NUMSEGS         .. Integer number of code segments in program.   (CM)
  PROG.STACK           .. Integer PREP-time STACK= value.               (CM)
  PROG.ZERODB          .. TRUE if program was :PREPed with ;ZERODB.     (CM)


Spool file characteristics:
---------------------------

  SPOOL.ISACTIVE       .. TRUE if Spool file STATE is ACTIVE.
  SPOOL.ISREADY        .. TRUE if Spool file STATE is READY.
  SPOOL.ISOPENED       .. TRUE if Spool file STATE is OPENED.
  SPOOL.ISLOCKED       .. TRUE if Spool file STATE is LOCKED.
  SPOOL.ISDEFERRED     .. TRUE if Spool file STATE is DEFERRED.
  SPOOL.ISSPSAVE       .. TRUE if Spool file SPSAVE attribute set.
  SPOOL.OUTPRI         .. Integer output priority of spool file.
  SPOOL.JOBTYPE        .. Integer: 1 if created by session,
                                   2 if created by job,
                                   3 if created by job, INPUT from tape,
                                   0 if created by session, INPUT from tape.
  SPOOL.JOBNUMBER      .. Integer Job number of creating user.
  SPOOL.USER           .. String User name of creating user.
  SPOOL.ACCOUNT        .. String Account name of creating user.
  SPOOL.JSNAME         .. String Job/Session name of creating user.
  SPOOL.FILE           .. String spoolfile name.
  SPOOL.SPOOLFILENUM   .. Integer file number (#Oxxx) of spoolfile.
  SPOOL.HASFORMSMSG    .. TRUE if spoolfile has forms message.
  SPOOL.DEVICE         .. String containing output device class name.
  SPOOL.JOBABORTED     .. TRUE if job aborted as a result of an error
                          in a command not preceded by '!CONTINUE'.
  SPOOL.NUMCOPIES      .. Integer number of copies to be printed.
  SPOOL.NUMLINES       .. Integer number of lines in spoolfile.
  SPOOL.READYDATE      .. Date spoolfile became Ready.
  SPOOL.READYTIME      .. Time spoolfile became Ready.


TurboImage Dataset characteristics:
-----------------------------------

  DBSETBLOCKFACTOR     .. Integer blocking factor of dataset.
  DBSETBLOCKSIZE       .. Integer number of words in each dataset block.
  DBSETBLOCKWASTAGE    .. Real fraction (between 0 and 1) of each dataset
                          block that is wasted.
  DBSETCAPACITY        .. Integer capacity of dataset.
  DBSETDYNAMIC         .. TRUE if dynamic capacity expansion enabled.
  DBSETENTRIES         .. Integer number of entries in dataset.
  DBSETENTRYLENGTH     .. Integer word length of dataset entry.
  DBSETFULLNESS        .. Real fraction (between 0 and 1) of each dataset
                          that is full.  Equal to Entries//Capacity.
  DBSETHIGHWATERMARK   .. Integer record number of highest numbered record
                          ever used.
  DBSETINCNUMBER       .. Integer number to dynamically increase capacity.
  DBSETINCPERCENT      .. Integer percent to dynamically increase capacity.
  DBSETINITCAPACITY    .. Integer initial capacity of dataset.
  DBSETMAXCAPACITY     .. Integer maximum capacity of dataset.
  DBSETMEDIALENGTH     .. Integer word length of dataset media record.
  DBSETNAME            .. String returning dataset name.
  DBSETNUMPATHS        .. Integer number of paths linked to this dataset.
  DBSETTYPE            .. String returning dataset type (M, D or A).


File Identification information:
--------------------------------

  ID                   .. String representing user-defined file
                          identification string input using MPEX %IDENTIFY
                          command.

  IDCONTAINS ('string')
                       .. TRUE if the file's ID string contains the
                          supplied string.  Uses case-insensitive pattern-
                          matching.

  FCONTAINS ('string') .. TRUE if the file contains one or more
                          occurrences of string supplied as a parameter.

  FCONTAINSSTRING ('string')
                       .. Integer number of times supplied string occurs
                          within file.

  FSEARCHEXP ('expression')
                       .. Integer number of lines in file that match the
                          logical expression supplied as a parameter.

  FSEARCHSTRING ('string')
                       .. Integer number of lines in file that contain the
                          string supplied as a parameter.

  ISJUMBO              .. TRUE if a Jumbo-Format QEDIT file.


Miscellaneous Attributes:
-------------------------

  ACCESSIBLE ('acc')   .. TRUE if running user has 'acc' access to file.
                          The 'acc' parameter is a string containing one
                          or more of 'RSALXS' access types to test.

  ACCESSIBLEBY ('acc', 'user')
                       .. TRUE if file has ACDs, and if 'user' has
                          'acc' access to the file.  The 'user' parameter
                          may contain '@.@'.

  BLOCKFACTOR          .. Integer blocking factor of file.

  BLOCKSIZE            .. Integer block size of file.

  CODE                 .. String containing filecode in ASCII.

  CREATOR              .. String containing the unqualified User name
                          of the file owner.

  CREATORACCOUNT       .. String containing the Account name of the
                          file creator.  Assumed to be the same as the
                          file's Account for files built prior to
                          installing Posix.                          (POSIX)

  EOF                  .. Integer number of records in file.

  EXCLUSIVE            .. TRUE if file accessed exclusively.

  FILE                 .. String containing file name.

  FILEGROUP            .. String containing name of files GROUPID
                          field.                                     (POSIX)

  FLIMIT               .. Integer maximum number of records in file.

  FMTFILETYPE          .. String identifying file type.  Contains one of:
                            STD, KSAM, RIO, KSAMXL, CIR, SPOOL, MSG, CM,
                            DIRECTORY, PIPE, FIFO, SYMLINK or DEVICE LINK.
                                                                     (POSIX)

  FMTFOPTIONS          .. String representation of FOPTIONS field.

  FMTOPENED            .. String containing '*' if file opened, '' if not.

  FMTRECSIZE           .. String containing file's record size, followed
                          by 'W' or 'B', as appropriate.

  FMTRECTYPE           .. String identifying file record type.
                          Contains one of following:
                            FIXED, VARIABLE, UNDEF, SPOOL, ROOT,
                            ACCOUNT, GROUP, BYTESTREAM or DIRECTORY. (POSIX)

  FMTTYPE              .. String file type, as shown by LISTF ,2

  FOPTIONS             .. Integer FOPTIONS of file.

  GID                  .. Integer equivalent of FILEGROUP field, as
                          shown by %LISTF ,-3 and %LISTF ,POSIX.     (POSIX)

  GROUPID              .. Synonym for FILEGROUP attribute.           (POSIX)

  INTCODE              .. Integer filecode.

  ISACCT               .. TRUE if file is an MPE Account file.       (POSIX)

  ISASCII              .. TRUE if file is an ASCII file.

  ISBINARY             .. TRUE if file is a Binary file.

  ISBOSS               .. TRUE if user currently running MPEX is
                          SM, or is AM of the Account equal to the
                          file's GROUPID field.                      (POSIX)

  ISBYTESTREAM         .. TRUE if file is a Byte Stream file.        (POSIX)

  ISCCTL               .. TRUE if file has Carriage Control.

  ISCIR                .. TRUE if file is a Circular file.

  ISCMPROG             .. TRUE if file is a CM PROG.

  ISDIR                .. TRUE if file is a directory file, including
                          MPE Group or Account files.                (POSIX)

  ISENCRYPTED          .. TRUE if file has been encrypted by the
                          SECURITY/3000 %SEC ENCRYPT command.

  ISEXECUTABLE         .. TRUE if file code is PROG, SL, NMPRG or NMXL.

  ISFIFO               .. TRUE if file is type FIFO, created by MKNOD
                          program.                                   (POSIX)

  ISFIXED              .. TRUE if file record length is fixed.

  ISGROUP              .. TRUE if file is an MPE Group file.         (POSIX)

  ISHIDDEN             .. TRUE if file would not be shown by MPE :LISTF
                          command: file is a directory, or has a name
                          that wouldn't be legal in MPE-syntax.      (POSIX)

  ISKSAM               .. TRUE if file is a KSAM file (CM or NM).

  ISKSAMCM             .. TRUE if file is a CM KSAM file.

  ISKSAMXL             .. TRUE if file is an NM KSAM file.

  ISLINK               .. TRUE if file is a Link file.               (POSIX)

  ISMSG                .. TRUE if file is a Message file.

  ISNMPROG             .. TRUE if file is an NM PROG.

  ISNOCCTL             .. TRUE if file does not have CCTL attribute.

  ISPIPE               .. TRUE if file is a PIPE.                    (POSIX)

  ISPRIV               .. TRUE if file is Privileged.  This may mean that
                          the filecode is negative, or that the file is
                          protected against non-privileged accessors.

  ISPROG               .. TRUE if file is a PROG or NMPRG file.

  ISQEDIT              .. TRUE if file is a QEDIT file.

  ISRIO                .. TRUE if file is an RIO file.

  ISSETGID             .. TRUE if the file's SETGID bit is set
                          (not usable under C.50.00).                (POSIX)

  ISSETUID             .. TRUE if the file's SETUID bit is set
                          (not usable under C.50.00).                (POSIX)

  ISSTD                .. TRUE if file type is Standard.

  FMTFILETYPE          .. String identifying file type.

  ISSTREAM             .. TRUE if file is a Device Stream file, normally
                          located in the /dev directory.  Note: subject
                          to change in next MPEX version.            (POSIX)

  ISUNDEFINED          .. TRUE if file record length is undefined.

  ISVARIABLE           .. TRUE if file record length is variable.

  ISXLSPOOLFILE        .. TRUE if file is an NM SPOOL file.

  LABELEOF             .. Integer number of user labels written so far.

  LABELFLIMIT          .. Integer maximum number of user labels.

  LASTEXTENTSIZE       .. Integer number of sectors in last extent.

  LINKTARGET           .. String containing target filename of a Link
                          file, expressed in HFS syntax (absolute or
                          relative pathname).                        (POSIX)

  LOCAL                .. TRUE if file's Group ID equals file's Account.
                                                                     (POSIX)

  LOCKWORD             .. String containing file's Lockword.  Note that
                          Lockwords are ignored if the file is also
                          protected by ACDs.                         (POSIX)

  LOGSETID             .. Integer, non zero if file is attached to a
                          transaction manager (XM) logfile.

  MATCHES ('fileset')  .. TRUE if filename is matched by supplied fileset
                          parameter.  It's possible to test whether MPE
                          syntax filename are matched by HFS-syntax
                          filesets.                                  (POSIX)

  MAXEXTENTS           .. Integer maximum number of extents in file,
                          or 0 if no limit exists.

  MPEXCURRENTFILE      .. String containing fully-qualified filename, in
                          MPE or HFS syntax, according to the context.

  NOBACKUP             .. File is marked 'NoBackup', as shown by LISTF ,-3
                          Such files (including Account '3000devs' and
                          active job STDIN files in IN.HPSPOOL) are not
                          normally stored.

  NUMEXTENTS           .. Integer number of extents currently allocated.

  OWNER                .. String representing owner in 'User.Account'
                          format.                                    (POSIX)

  PRIVLEVEL            .. Integer privilege level of file.

  PROTECTED            .. File is marked 'Protected', as shown by LISTF ,-3
                          Such files cannot be Purged.

  READING              .. TRUE if file open for reading.

  RECSIZE              .. Integer byte record size.

  SAVABLESECTORS       .. Integer sectors savable by %ALTFILE;XLTRIM.
                          May be abbreviated to SAVABLE.

  UID                  .. Integer UID number of file Owner.          (POSIX)

  WRITING              .. TRUE if file open for writing.




APPENDIX E: List of Miscellaneous MPEX Functions available on Posix systems
---------------------------------------------------------------------------

MPEX is able to evaluate many functions within CI expressions.  This
Appendix describes new or changed functions only.


File Information Retrieval Functions
------------------------------------

These functions retrieve information on arbitrary files; all accept either
MPE or HFS syntax filenames.

When used on Symbolic link files traditional file information recovery
functions return information on the Symbolic Link file itself.  MPEX has
added functions that are able to return information on Link file targets.

  FINFO ('filename', info)
                       .. Based on MPE's FINFO function: retrieves requested
                          file information for specified file.  The data-
                          type returned depends on the information
                          requested.  Information may be requested by index
                          number or by name.  Complete list of information
                          available using FINFO is available within MPEX by
                          typing %HELP FINFO.

                          MPE's FINFO returns information by looking first
                          for Temporary and then for Permanent files.  By
                          default, MPEX's FINFO only looks for Permanent
                          files (see manual if you need compatibility here).

  FTEMPINFO ('filename', info)
                       .. Like FINFO, but only looks at Temporary files.

  FPERMINFO ('filename', info)
                       .. Like FINFO, but only looks at Permanent files.

  FANYINFO ('filename', info)
                       .. Like FINFO, but looks first for Temporary, and
                          then (if not found) for Permanent files.

  FEXISTS ('filename') .. TRUE if specified Permanent file exists.

  FTEMPEXISTS ('filename')
                       .. TRUE if specified Temporary file exists.

  FPERMEXISTS ('filename')
                       .. TRUE if specified Permanent file exists.

  FANYEXISTS ('filename')
                       .. TRUE if specified file (Permanent or Temporary)
                          exists.

  VEFINFO ('filename').attribute
                       .. Retrieves requested file attribute for specified
                          Permanent file.  The data-type returned depends
                          on the attribute requested.  Attributes are
                          summarized in Appendix D.  Note that the list of
                          attributes usable with VEFINFO is NOT the same as
                          the info labels usable with FINFO.

  VEFTEMPINFO ('filename').attribute
                       .. Like VEFINFO, but only returns Temporary file
                          information.

  VEFPERMINFO ('filename').attribute
                       .. Like VEFINFO, but only returns Permanent file
                          information.

  VEFANYINFO ('filename').attribute
                       .. Like VEFINFO, but looks first for Temporary, and
                          then (if not found) for Permanent files.

  VEFLINFO ('filename').attribute
                       .. Like VEFINFO, but follows Symbolic Links and
                          returns information on the target file.
                          May also be used on non-Link files.

  VEFLPERMINFO ('filename').attribute
                       .. Like VEFPERMINFO, but follows Symbolic Links
                          and returns information on the target file.
                          May also be used on non-Link files.

  VEFLANYINFO ('filename').attribute
                       .. Like VEFANYINFO, but follows Symbolic Links
                          and returns information on the target file.
                          May also be used on non-Link files.


Miscellaneous Functions
-----------------------

  DATEYEAR3 (date)     .. Like DATEYEAR, but accepts years in range 1900
                          to 2027 (instead of in range 1900 to 1999) and
                          therefore returns up to three digits.

  FMTCOMMA (number)    .. String corresponding to supplied number
                          parameter formatted with ',' characters every
                          three digits.

  FMTDATE (date)       .. String containing supplied date parameter
                          formatted according to rules used by
                          %LISTF ,DATES mode.

  FMTTIME (time)       .. String containing supplied time parameter
                          formatted in 24-hour HH:MM format.

  FPXIFY (filename)    .. String representing supplied filename parameter
                          represented in HFS syntax.

  GROUPVOLSET ('group', 'account')
                       .. String representing Volume Set Name on
                          which Group identified by supplied Group and
                          Account parameters is located.

  HOSTNODENAME         .. String containing name of Host system, if
                          logon originated from another system using NS
                          services.  Data is retrieved using NSSTATUS
                          intrinsic.

  HPGID (GID)          .. String GROUPID corresponding to supplied
                          integer GID number.

  HPGID ('GroupID')    .. Integer GID corresponding to supplied
                          string GroupID string.

  HPUID (UID)          .. String USERID corresponding to supplied
                          integer UID number.

  HPUID ('UserID')     .. Integer UID corresponding to supplied
                          string UserID string.

  ISARPA ()            .. TRUE if terminal is ARPA connected.

  ISCHGROUPED ()       .. TRUE if %CHGROUP currently active.

  ISCHLOGONED          .. TRUE if %CHLOGON currently active.

  ISDSTERM ()          .. TRUE if terminal is a DS pseudo-terminal.

  ISFILESET ('string') .. TRUE if supplied string parameter represents
                          MPE or HFS-syntax fileset.

  ISMODEM ()           .. TRUE if terminal is modem connected.

  ISPADTERM ()         .. TRUE if terminal is X.25 PAD connected.

  ISTERMINAL ()        .. TRUE if terminal is hardwired terminal.

  ISVALIDMPESYNTAX ('string')
                       .. TRUE if supplied string parameter represents
                          filename with legal MPE syntax name.

  ISVTERM ()           .. TRUE if terminal is an NS virtual terminal.

  JOBPIN ()            .. Integer PIN number of JOB system process.

  MPEHASNS ()          .. TRUE if NS services are available.

  MPEHASPOSIX ()       .. TRUE if MPE version supports Posix.

  MPEHASWG ()          .. Integer number of WorkGroups configured.
                          Defaults to '5' if product not purchased.

  MPEXFILESET          .. User-definable flexible LISTF construct has been
                          extended to accept MPE and/or HFS syntax filesets.

  MYPIN ()             .. Integer pin of current process.

  PINISCHLOGONED (pin) .. TRUE if process identified by supplied integer
                          pin parameter is %CHLOGONed.

  PINJOBNUMBER (pin)   .. Integer Job or Session number corresponding to
                          supplied integer pin parameter, or 0 if pin not
                          operating in Job or Session environment.

  PINJOBTYPE (pin)     .. Returns 'S' or 'J' corresponding to job type of
                          supplied integer pin parameter, or '' if pin
                          not operating in Job or Session environment.

  PINJSMAINPIN (pin)   .. Integer pin of JSMAIN system process corresponding
                          to supplied integer pin parameter.

  PINLOGONID (pin)     .. String containing Logon ID of process identified
                          by supplied integer pin parameter.

  PINPROGNAME (pin)    .. String containing Program name of process
                          identified by supplied integer pin parameter.

  PINWORKGROUP (pin)   .. String containing WorkGroup specification
                          for supplied integer pin parameter.

  SESSIONPIN ()        .. Integer pin number of SESSION system process.

  TASKACTIVE ('task')  .. TRUE if supplied BACKG task parameter is active.

  VEDBCHAINLEN         .. Integer representing 2nd word of Image Status
                          array used in last Image call.

  VEDBDATALEN          .. Integer representing 1st word of Image Status
                          array used in last Image call.

  VEDBERR              .. Integer representing 0th word of Image Status
                          array used in last Image call.

  VEDBNEXTREC          .. Integer representing 4th word of Image Status
                          array used in last Image call.

  VEDBPREVREC          .. Integer representing 3rd word of Image Status
                          array used in last Image call.

  VEDBRECNUM           .. Integer representing 1st word of Image Status
                          array used in last Image call.

  VEDEVTYPE (ldev)     .. Integer representing configured device type of
                          supplied integer device parameter.

  VEMODIFY ('data')    .. String resulting from user modifications (via
                          VEMODIFY) of the supplied string parameter.
                          VEMODIFY has also been extended, and now allows
                          strings up to 150 characters long to be modified.




APPENDIX F: MPEX %ALTFILE and %COPY Command Syntax Summary
----------------------------------------------------------

Syntax:   %ALTFILE fileset

        General Characteristics:

          [;CAP= [+|-] progcapability [ ,...  ]]                       (CHG)
          [;CODE= filecode]
          [;KEEPAMDATES]
          [;LOCKWORD= lockword]
          [;MAXDATA= progmaxdata]
          [;STACK= progstacksize]

        File Ownership and Access:

          [;CREATOR= username]
          [;CREATOR= username [.accountname]]                        (POSIX)
            [;NOCHECK]                                               (POSIX)
          [;DELACD]                                                    (NEW)
          [;GROUPID= groupid]                                        (POSIX)
          [;LOCAL[GROUPID]]                                          (POSIX)

        Physical Structure:

          [;BINARY|ASCII]                                              (NEW)
          [;BLKFACT= { blockingfactor|BEST }]
          [;DEV= { devicenumber|deviceclass }]
          [;EXTENTS= maxextents]
          [;FIXED|VARIABLE|UNDEF|BYTE]                                 (NEW)
          [;FLIMIT= flimitspecifier]
          [;INITEXTENTS= initialextents]
          [;KEEPTRAIL]                                                 (NEW)
          [;REC= newrecordlength]                                      (NEW)
          [;SQUEEZE]
          [;XLTRIM]


The %COPY command supports the above keywords, with the addition of:

          [;{YES|NO|ASK}]
          [;KEEPATTR]
          [;KEYFILE= keyfileset]
          [;COPYACD]
          [;BUFFERSIZE= nnn]
          [;CREATE[Q]]                                               (POSIX)




APPENDIX G: MPEX %RENAME COMMAND Syntax Summary
-----------------------------------------------

Syntax:   %RENAME fromfileset, tofileset
          [;KEEPAMDATES]
          [;CREATE[Q]]                                               (POSIX)
          [;LOCAL[GROUPID]]                                          (POSIX)
          [;DELACD]                                                  (POSIX)





Acknowledgments
---------------

To conclude, I'd like to thank the numerous nameless individuals at HP who
contributed to the design, development and integration of Posix features,
and in particular to continuing MPE's now-taken-for-granted tradition of
forward compatibility.

I'd like to thank the numerous HP personnel who assisted us in achieving
Posix compatibility, and I'd also like to acknowledge the contributions made
to MPEX version 25. by present and past members of VESOFT's technical support
group, in the areas of new functionality, testing and documentation.

Last, and certainly not least, thanks to Eugene Volokh for his substantial
contributions, both in adding external functionality, internally in
modifying MPEX to smoothly operate with the Posix hierarchical file system,
and for many useful suggestions made during the writing of this paper.

Go to Adager's index of technical papers