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 ,-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 ;GROUPID= :ALTSEC ;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= 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= ;DELACD where 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=', 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=-'. 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, 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.