JOE@FHCRCVAX.BITNET (Joe Meadows) (09/11/87)
Hi,
A few weeks ago I promised to post a utility I was working on, which
I call INDEX. INDEX allows you to search through INDEXF.SYS based on
just about any thing stored in there. For those who are wondering,
INDEXF.SYS is where all the file headers are stored. I've put the help
file at the beginning of this series of "shar" files. You can cut and
execute each of the five parts by themselves, they are each approx. 30K
bytes. I will be sending them one part per day for the next five days.
Cheers,
Joe Meadows Jr. bitnet - JOE@FHCRCVAX
VAX/VMS System Manager / guru in training
Fred Hutchinson Cancer Research Center
1124 Columbia St. arpa - JOE%FHCRCVAX.BITNET@WISCVM.WISC.EDU
Seattle Wa. 98104 voice - (206) 467-4970
$ create/log INDEX.HLP
$DECK
! Last modified Sep. 11th, 1987 (minor changes)
1 INDEX
INDEX [device-name]
INDEX is a utility to allow you to display information about
a file, based on information stored in the files header. INDEX
operates in one of two modes, it either displays information
read directly out of the index file, or it asks the disk ACP
to return header information to it. The first mode of operation
is used for general searches, and does not necessarily return
the most current up to date information, as there may be many
headers cached in memory, and thus out of synch with the index file.
The second mode of operation is used when you specify a /FILE_ID
or /FULLNAME qualifier, giving it an explicit list of files to
work with. In this case it asks the disk ACP for the headers, thus
getting the most current, up to date information available, if
possible. Note that in either case, the index file is opened for
read acces, thus to use this utility, you must have read access to
the file [000000]INDEXF.SYS, and if using /FILE_ID or /FULLNAME
you must also have read access to the requested files.
INDEX takes one paramater, the name of the device whose index
file is to be searched. If device-name is not specified it defaults
to SYS$DISK (your current default disk). It correctly handles
rooted device names, and can handle multi-volume disk sets.
You may limit what files will be displayed by using the appropriate
qualifiers. Most of the qualifiers that affect what files will be
displayed allow a minimum and maximum value, if you do not specify
a maximum value, then it is assumed you want all things greater than
the minimum. If you want a specific value, than you must enter it as
both the minimum and maximum value, i.e.
$ INDEX/ALLOCATED=(1497,1497)
would display all files with exactly 1497 blocks allocated.
2 Examples
The following examples are meant to demonstrate some of the uses
of INDEX.
3 ACL
Suppose you are going delete a user, and you want to be sure that
no one has a file that specifically refers to that user, you could
specify:
$ INDEX/DISPLAY=ACL/ACE=([USER1],[USER2],PROJECT$P001)
This would display all files (and their access control lists) which
had any ACLs that refered to the uic identifiers [USER1], [USER2],
or the 'project' identifier PROJECT$P001
3 Activity
Suppose you wanted to get an idea of disk usage, you could generate
a report showing all the files created in a specified time period:
$ INDEX/DISPLAY=(CREATION,ALLOCATED,USED)-
$_ /CREATION=(YESTERDAY,TODAY)
would display all files created today
or all the files modified in a specifid time period:
$ INDEX/DISPLAY=(CREATION,REVISION,ALLOCATED,USED)-
$_ /REVISION=(YESTERDAY,TODAY)
would display all files revised today
3 Big_Directories
Suppose you want to find all the directory files that are bigger
than 50 blocks, you could use:
$ INDEX/DISPLAY=(USED,ALLOCATED) -
$_ /CHARACTERISTICS=DIRECTORY/ALLOCATED=50/MATCH=AND
Notice the use of the /MATCH qualifier. Normally this defaults
to OR, so that if any one of the conditions are met then the file
will be displayed.
3 FID
If you know a file id, you can display the info on that file via:
$ INDEX/DISPLAY=ALL/FILE_ID=(1,4)
This would display INDEXF.SYS [fid = (1,1,0)] and
000000.DIR (4,4,0). Note that only the first number of the
File ID should be specified.
3 Fragmentation
Suppose you want to know how badly fragmented the system is:
$ INDEX/DISPLAY=(EXTENTS,HEADERS)/HEADERS=1
would display all the files with more than one extention header,
of course, you needn't wait till your system gets that fragmented,
you may have a different idea of what is too fragmented:
$ INDEX/DISPLAY=(EXTENTS,HEADERS)/EXTENTS=20
would display all the files broken into 20 or more peices.
3 LBN
Suppose you have a block go bad, you know the LBN, and you want to
know the file which contains it:
$ INDEX/LBN=19500
would display the file containing that LBN.
Another way (is this cheating?) would be to search for any
file marked corrupt:
$ INDEX/CHARACTERISTICS=FILE_CORRUPT
Perhaps you want to see what LBNs are in a specific file,
$ INDEX/DISPLAY=LBN/FULLNAME=EXAMPLE.TXT
3 WASTE
If you want to know how many blocks are being wasted (the difference
between used and allocated), you could display it via
$ INDEX/DISPLAY=WASTED/FULLNAME=EXAMPLE.TXT
Or find all files wasting space...
$ INDEX/DISPLAY=WASTED/WASTED=100
2 Input_Qualifiers
Besides searching through the index file directly, you can select what
files will be used (and still subject to the "selection qualifiers"),
via /FILE_ID and /FULLNAME .
You may search through all the index files in a multiple volume
set by specifying /VOLUME. This is especially usefull in doing
searches based on LBN, ACE, and ACL, as one or more of a files
extension headers may reside on a separate disk, and extension
headers which are on their own would otherwise be ignored.
/FILE_ID
/FILE_ID=(list-of-file-id's)
This allows you to display selected files without the overhead
of searching through the entire index file. This limits the
search to only the selected files, as indicated by their file-id.
This searches through the index file to complete the file-id,
then if the file-id is valid, it asks the disk acp for the header
to this file, forcing the information to be as accurate as possible.
If the file id is no longer valid, it will display the file header
as stored in the index file, with an asterisk in front of the
file id (if it is being displayed). Note that if the file id is
valid that you will need read access to the file requested, as
well as read access to the index file.
/FULLNAME
/FULLNAME=(list-of-full-file-specs)
This allows you to display selected files without the overhead
of searching through the entire index file. This limits the
search to only the selected files.
This requires read access to the requested files, but does not
access the index file.
/VOLUME
/VOLUME
This forces INDEX to search through all the index files in a
multi-volume disk set. This is especially usefull in doing searches
based on LBN, ACE, and ACL, as one or more of a files extension
headers may reside on a separate disk, and extension headers which
are on their own would otherwise be ignored.
For example, suppose that DUA1 and DUA2 are set up as a multiple
volume set called MULTI$DISK. If the file TEST.DAT were created
on DUA1, but half of TEST.DAT was placed on DUA2, from logical
block number 100 through 500, then the command:
INDEX/LBN=250/DISPLAY=LBN DUA2:
would not return any info on TEST.DAT, since the first file segment
was located on DUA1. However, the command:
INDEX/LBN=250/DISPLAY=LBN/VOLUME MULTI$DISK ! (or "DUA1", or "DUA2")
would report that DUA1:TEST.DAT contained the LBN 250.
It may also report some other files as containing LBN 250, since
each disk is being searched, hence you would want to display
the LBN information, to be able to determine which file was the
one you were really concerned about.
2 Output_qualifiers
You may redirect output to a file, via /OUTPUT, and you may choose
what is to be displayed via /DISPLAY. By default the full file name
is always displayed. The only way to disable this (should you so desire)
is to select NOFULLNAME as a display option.
/OUTPUT
/OUTPUT[=filename]
Controls where output will go to. If qualifier isn't present
then all output will be to screen.
If qualifier is present but a filename is not specified, it will
default to INDEXF.LIS.
/DISPLAY
/DISPLAY=(list-of-display-keywords)
Controls what will be displayed from the file header.
All off the DISPLAY keywords are negatable, so that you could say:
/DISPLAY=(ALL, NOLBN) to get a listing including all the header
information except for the list of logical block numbers. By default
FULLNAME is always displayed. If you really don't want to see it
you must specify NOFULLNAME.
ALL
Display everything about the file (except negated items)
ACL
ACCESS_MODE
ACTIVE_RECOVERY_UNITS
ALLOCATED
ATTRIBUTES
BACKUP_DATE
BUCKET_SIZE
CHARACTERISTICS
CREATION_DATE
DEFAULT_EXTEND_QUANTITY
DIRECTORY_FILE_ID
EXPIRATION_DATE
EXTENTS
FILE_ID
FULLNAME (The name as returned by the disk ACP, if possible, otherwise
it will return the name in the file header preceded with [?],
and on the next line it will display the name of the file that
this files backlink points to, if possible)
GLOBAL_BUFFER_COUNT
HEADERS
HIGHWATER_MARK
JOURNAL
LBN
MAXIMUM_RECORD_SIZE
NAME (this is the name as it exists in the file header, this name may
be different than the name returned by FULLNAME due to multiple
links to the same file, esp. when selecting based on /FULLNAME)
NUMBER_OF_REVISIONS
ORGANIZATION
OWNER_UIC
PROTECTION
RECORD_SIZE
REVISION_DATE
TYPE
USED (displays blocks used, and first free byte)
VERSION_LIMIT
VFC_SIZE
WASTED_BLOCKS
2 Selection_qualifiers
/MATCH
/MATCH=(match-option)
Match-option can be AND or OR, and signifies wether a file will be
displayed only if all criterion pass (AND) or if any one criteria
passes (OR). OR matching is used by default.
example:
$ INDEX/CHAR=DIR/OWNER=[USER]/MATCH=AND
Display all directories owner by [USER].
$ INDEX/WASTED=50/ALLOC=100000/MATCH=OR
Is equivalent to:
$ INDEX/WASTED=50/ALLOC=100000
Which displays all files wasting 50 blocks or more, or which have
100,000 (or more) blocks allocated.
/ACE
/ACE=(list-of-identifiers-or-uics)
Allows you to select files which have an identifier ace containing
one (or more) of the specified ids.
example:
$ INDEX/DISPLAY=ACL/ACE=([PROJECTS,P001],[SYSTEM],BATCH)
Would display all files that referenced any of those identifiers in their
ACL.
/ACL
/ACL
Allows you to display all files that have an ACL of any kind.
/ATTRIBUTES
/ATTRIBUTES=(list-of-attributes-keywords)
Allows you to specify what record attributes a file must have or
not have, to be displayed.
FORTRANCC Fortran carriage control
IMPLIEDCC Implied carriage control
PRINTCC Print carriage control
SPAN Records can span blocks
example:
$ INDEX/DISP=ATTRIBUTES/ATTRIB=(FORTRAN,PRINT)
Display all files that have either fortran or print carriage control.
/CHARACTERISTICS
/CHARACTERISTICS=(list-of-characteristics-keywords)
Allows you to specify what file characteristics a file must have
or not have, to be displayed.
ACL_CORRUPT File contains corrupt ACL
BACKUP File can be backed up
BEST_TRY_CONTIGUOUS Keep file as contiguous as possible
CHARGE File space is charged to owner
CONTIGUOUS File is contiguous
DIRECTORY File is a directory
ERASE_ON_DELETE File is to be erased when deleted
FILE_CORRUPT File contains suspected bad blocks
LOCKED File is deaccess locked
MARKED_FOR_DELETE File is marked for delete
SPOOL File is a spool file
READ_VERIFY Verify all read operations
WRITE_BACK File may be write-back cached
WRITE_VERIFY Verify all write operations
example:
$ INDEX/DISP=(CHAR,FILE_ID)/CHAR=SPOOL
Display all spool files..
$ INDEX/DISPL=CHAR/CHAR=(READ_VERIFY,WRITE_VERIFY, -
$_ NOFILE_CORRUPT,NOACL_CORRUPT,NOMARKED_FOR_DELETE)
This displays all file that are set to either read or write verify,
but aren't corrupt in any way, nor deleted.
/JOURNAL
/JOURNAL=(list-of-journal-keywords)
Allows you to specify what journal attributes a file must have or
not have, to be displayed.
JOURNAL This is a journal file
AIJNL Enable after image journal
ATJNL Enable audit trail journal
BIJNL Enable before image journal
RUJNL Enable recovery unit journal
NEVER_RU File is never accessible in recovery unit
ONLY_RU File is accessible only in recovery unit
/ORGANIZATION
/ORGANIZATION=(list-of-organization-keywords)
Allows you to specify what file organization a file must have or
not have, to be displayed.
SEQUENTIAL
RELATIVE
INDEXED
DIRECT
example:
$ INDEX/ORG=INDEX
Display all indexed files.
$ INDEX/ORG=NOSEQUENTIAL
Display all non-sequential files.
$ INDEX/ORG=(INDEX,RELATIVE)
Display all files that are either indexed, or relative.
/TYPE
/TYPE=(list-of-type-keywords)
Allows you to specify what record type a file must have or
not have, to be displayed.
UNDEFINED Record type is undefined
FIXED Records have a fixed length
VARIABLE Record have variable length - stored in the file
as a 2 byte integer storing the record length, followed
by the record, possibly null padded to make next record
start on a word boundary.
VFC Variable with fixed control
STREAM Stream format (unix-ish, records? what records?)
LFSTREAM Stream format, records are separated by line feed
CRSTREAM Stream format, records are separated by carriage return
example:
INDEX/DISPL=TYPE/TYPE=(STREAM,LFSTREAM,CRSTREAM)
Display files having a stream format of some type.
Note that this is in effect an OR search, a file must have,
or not have, only one of the types specified.
/ACCESS_MODE
/ACCESS_MODE=(list-off-access_mode-keywords)
Allows you to specify what access mode a file must have or not have,
to be displayed. Note that I am not sure if VMS even uses this... As
a wild guess I would imagine that if it does use it, it would only be
for open files, and the header would be cached in memory, not in the
index file, so it probably could never be accessed except when an
ACP QIO function is performed to get the absolute most current/correct
header, as is done when /FILE_ID or /FULLNAME is specified.
USER
SUPERVISOR
EXECUTIVE
KERNEL
/CREATION_DATE
/CREATION_DATE=(min,max)
Display files created between the 'min' and 'max' dates.
example:
$ INDEX/DISPL=CREAT/CREAT=(YESTERDAY,TODAY)
Display all files created today.
/REVISION_DATE
/REVISION_DATE=(min,max)
Display files created between the 'min' and 'max' dates.
example:
$ INDEX/DISPL=(CREATION,REVISION)/REVISION=(YESTERDAY,TODAY)
/EXPIRATION_DATE
/EXPIRATION_DATE=(min,max)
Display files expiring between the 'min' and 'max' dates.
example:
$ INDEX/DISPL=(CREATION,EXPIRATION)/EXPIRATION=(YESTERDAY,TODAY)
/BACKUP_DATE
/BACKUP_DATE=(min,max)
Display files backed up between the 'min' and 'max' dates.
example:
$ INDEX/DISPL=(CREATION,BACKUP)/BACKUP=(YESTERDAY,TODAY)
/ACTIVE_RECOVERY_UNITS
/ACTIVE_RECOVERY_UNITS=(min,max)
1 = by RMS
2 = by DBMS
3 = by Rdb/VMS
4 = by Checkpoint/Restart
> 4 = by other reverable facility
/ALLOCATED
/ALLOCATED=(min,max)
/BUCKET_SIZE
/BUCKET_SIZE=(min,max)
/DEFAULT_EXTEND_QUANTITY
/DEFAULT_EXTEND_QUANTITY=(min,max)
/DIRECTORY_FILE_ID
/DIRECTORY_FILE_ID=(list-of-directory-file-id's)
You can use this to find all files that are (should be?) in a specified
directory, so long as you know the file-id of the directory.
/EXTENTS
/EXTENTS=(min,max)
/FIRST_FREE_BYTE
/FIRST_FREE_BYTE=(min,max)
/GLOBAL_BUFFER_COUNT
/GLOBAL_BUFFER_COUNT=(min,max)
/HEADERS
/HEADERS=(min,max)
/HIGHWATER_MARK
/HIGHWATER_MARK=(min,max)
/LBN
/LBN=(list-of-LBNs)
/MAXIMUM_RECORD_SIZE
/MAXIMUM_RECORD_SIZE=(min,max)
Maximum allowable record length. 0 means there is no maximum.
/RECORD_SIZE
/RECORD_SIZE=(min,max)
Longest record length.
/NAME
/NAME=filename
This allows you to search based on the name stored in the header.
Note that this is slower than using /FULLNAME but is usefull if
you know the name of a file but not its location.
/NUMBER_OF_REVISIONS
/NUMBER_OF_REVISIONS=(min,max)
/OWNER_UIC
/OWNER_UIC=(list-of-UICs)
This accepts any valid UIC. Valid UIC formats include
[octal-number,octal-number]
<octal-number,octal-number>
[identifier,identifier]
<identifier,identifier>
[identifier]
<identifier>
%xHexadecimal-number
/PROTECTION
/PROTECTION=(SET=(protection),CLEAR=(protection))
This allows you to search for all files that have specified protection
bits SET and or CLEAR, for example, to find all files that are world
writeable, but not world readable, you could specify :
/PROTECTION=(SET=(WORLD=W), CLEAR=(WORLD=R))
or just all files that are set to WORLD:RWED, use
/PROTECTION=(SET=W:RWED)
or all files that are set to owner not readable, use
/PROTECTION=(CLEAR=O:R)
/USED
/USED=(min,max)
/VERSION_LIMIT
/VERSION_LIMIT=(min,max)
Note that this is the directory version limit, i.e. this is set by
the command SET DIRECTORY/VERSION=n
/VFC_SIZE
/VFC_SIZE=(min,max)
/WASTED_BLOCKS
/WASTED_BLOCKS=(min,max)
/PLACEMENT
/PLACEMENT=(list-of-placement-keywords)
EXACT Exact placement specified
ON_CYLINDER On cylinder allocation desired
RELATIVE_VOLUME_NUMBER Place on specified RVN
LBN_SPECIFIED Use LBN of next map pointer
$EOD
$ create/log ACEDEF.H
$DECK
/* This header file was created by Joe Meadows, and is not copyrighted
in any way. No guarantee is made as to the accuracy of the contents
of this header file. This header file was last modified on Sep. 8th,
1987. */
#define ACE$C_KEYID 1
#define ACE$C_RMSJNL_BI 2
#define ACE$C_RMSJNL_AI 3
#define ACE$C_RMSJNL_AT 4
#define ACE$C_AUDIT 5
#define ACE$C_ALARM 6
#define ACE$C_INFO 7
#define ACE$C_RMSJNL_RU_DEFAULT 8
#define ACE$C_DIRDEF 9
#define ACE$C_RMSJNL_RU 10
#define ACE$C_RESERVED 255
#define ACE$C_CUST 1
#define ACE$C_CSS 2
#define ACE$C_VMS 3
#define ACE$M_SUCCESS 1
#define ACE$M_FAILURE 2
#define ACE$M_DEFAULT 256
#define ACE$M_PROTECTED 512
#define ACE$M_HIDDEN 1024
#define ACE$M_NOPROPAGATE 2048
#define ACE$M_READ 1
#define ACE$M_WRITE 2
#define ACE$M_EXECUTE 4
#define ACE$M_DELETE 8
#define ACE$M_CONTROL 16
#define ACE$K_LENGTH 8
#define ACE$C_LENGTH 8
#define ACE$S_RMSJNL_RU_DEFAULT 17
#define ACE$M_JOURNAL_DISABLED 1
#define ACE$M_BACKUP_DONE 2
#define ACE$S_RMSJNL_RU 38
#define ACE$S_RMSJNL 50
#define ACE$S_ACEDEF 50
#define ACE$S_INFO_TYPE 4
#define ACE$S_RESERVED 4
#define ACE$S_AUDITNAME 16
#define ACE$S_VOLNAM 12
#define ACE$S_FID 6
#define ACE$S_CDATE 8
#define ACE$S_MODIFICATION_TIME 8
#define DATE {unsigned : 32; unsigned : 32;}
struct acedef {
unsigned char ace$b_size;
unsigned char ace$b_type;
variant_union {
unsigned short int ace$w_flags;
variant_struct {
unsigned : 8;
unsigned ace$v_default : 1;
unsigned ace$v_protected : 1;
unsigned ace$v_hidden : 1;
unsigned ace$v_nopropagate : 1;
} ace$dummy_common_flags; /* common to all ace's */
variant_struct {
unsigned ace$v_success : 1;
unsigned ace$v_failure : 1;
} ace$dummy_alarm_flags; /* for alarm ace */
unsigned ace$v_info_type : 4; /* for application ace */
unsigned ace$v_reserved : 4; /* for identifier ace */
} ace$dummy_flags_union;
variant_union {
/* alarm and identifier ace */
variant_struct {
variant_union {
unsigned long int ace$l_access;
variant_struct {
unsigned ace$v_read : 1;
unsigned ace$v_write : 1;
unsigned ace$v_execute : 1;
unsigned ace$v_delete : 1;
unsigned ace$v_control : 1;
} ace$dummy_access_bits;
} ace$dummy_access_union;
variant_union {
unsigned long int ace$l_key;
char ace$t_auditname[ACE$S_AUDITNAME];
} ace$dummy_alarm_id_union;
} ace$dummy_alarm_id_ace;
/* application ace */
variant_struct {
unsigned long int ace$l_info_flags;
char ace$t_info_start;
} ace$dummy_application_ace;
/* default protection ace */
variant_struct {
unsigned long int ace$l_spare1;
unsigned long int ace$l_sys_prot;
unsigned long int ace$l_own_prot;
unsigned long int ace$l_grp_prot;
unsigned long int ace$l_wor_prot;
} ace$dummy_protectionc_ace;
variant_struct {
char ace$t_volnam[ACE$S_VOLNAM];
unsigned char ace$b_volnam_len;
unsigned char ace$b_rjrver;
variant_union {
unsigned char ace$r_fid_overlay[ACE$S_FID];
unsigned short int ace$w_fid[ACE$S_FID/2];
variant_struct {
unsigned short int ace$w_fid_num;
unsigned short int ace$w_fid_seq;
variant_union {
unsigned char ace$r_fid_rvn_overlay[2];
unsigned short int ace$w_fid_rvn;
variant_struct {
unsigned char ace$b_fid_rvn;
unsigned char ace$b_fid_nmx;
} ace$r_fid_rvn_fields;
} ace$dummy_fid_rvn_fields;
} ace$r_fid_fields;
} ace$dummy_fid_fields;
variant_union {
unsigned short int ace$w_rmsjnl_flags;
variant_struct {
unsigned ace$v_journal_disabled : 1;
unsigned ace$v_backup_done : 1;
} ace$dummy_rmsjnl_flags_bits;
} ace$dummy_rmsjnl_flags_union;
unsigned long int ace$l_jnlidx;
struct DATE ace$q_cdate;
unsigned long int ace$l_backup_seqno;
struct DATE ace$q_modification_time;
} ace$dummy_undocumented_ace;
} ace$dummy_ace_fields;
};
$EOD
$ create/log ATRDEF.H
$DECK
/* This header file was created by Joe Meadows, and is not copyrighted
in any way. No guarantee is made as to the accuracy of the contents
of this header file. This header file was last modified on Sep. 8th,
1987. */
#define ATR$C_UCHAR 3
#define ATR$S_UCHAR 4
#define ATR$C_RECATTR 4
#define ATR$S_RECATTR 32
#define ATR$C_FILNAM 5
#define ATR$S_FILNAM 6
#define ATR$C_FILTYP 6
#define ATR$S_FILTYP 2
#define ATR$C_FILVER 7
#define ATR$S_FILVER 2
#define ATR$C_EXPDAT 8
#define ATR$S_EXPDAT 7
#define ATR$C_STATBLK 9
#define ATR$S_STATBLK 32
#define ATR$C_HEADER 10
#define ATR$S_HEADER 512
#define ATR$C_BLOCKSIZE 11
#define ATR$S_BLOCKSIZE 2
#define ATR$C_USERLABEL 12
#define ATR$S_USERLABEL 80
#define ATR$C_ASCDATES 13
#define ATR$S_ASCDATES 35
#define ATR$C_ALCONTROL 14
#define ATR$S_ALCONTROL 14
#define ATR$C_ENDLBLAST 15
#define ATR$S_ENDLBLAST 4
#define ATR$C_ASCNAME 16
#define ATR$S_ASCNAME 86
#define ATR$C_CREDATE 17
#define ATR$S_CREDATE 8
#define ATR$C_REVDATE 18
#define ATR$S_REVDATE 8
#define ATR$C_EXPDATE 19
#define ATR$S_EXPDATE 8
#define ATR$C_BAKDATE 20
#define ATR$S_BAKDATE 8
#define ATR$C_UIC 21
#define ATR$S_UIC 4
#define ATR$C_FPRO 22
#define ATR$S_FPRO 2
#define ATR$C_RPRO 23
#define ATR$S_RPRO 2
#define ATR$C_ACLEVEL 24
#define ATR$S_ACLEVEL 1
#define ATR$C_SEMASK 25
#define ATR$S_SEMASK 8
#define ATR$C_UIC_RO 26
#define ATR$S_UIC_RO 4
#define ATR$C_DIRSEQ 27
#define ATR$S_DIRSEQ 2
#define ATR$C_BACKLINK 28
#define ATR$S_BACKLINK 6
#define ATR$C_JOURNAL 29
#define ATR$S_JOURNAL 1
#define ATR$C_HDR1_ACC 30
#define ATR$S_HDR1_ACC 1
#define ATR$C_ADDACLENT 31
#define ATR$S_ADDACLENT 255
#define ATR$C_DELACLENT 32
#define ATR$S_DELACLENT 255
#define ATR$C_MODACLENT 33
#define ATR$S_MODACLENT 255
#define ATR$C_FNDACLENT 34
#define ATR$S_FNDACLENT 255
#define ATR$C_FNDACLTYP 35
#define ATR$S_FNDACLTYP 255
#define ATR$C_FNDACETYP 35
#define ATR$S_FNDACETYP 255
#define ATR$C_DELETEACL 36
#define ATR$S_DELETEACL 255
#define ATR$C_READACL 37
#define ATR$S_READACL 512
#define ATR$C_ACLLENGTH 38
#define ATR$S_ACLLENGTH 4
#define ATR$C_READACE 39
#define ATR$S_READACE 255
#define ATR$C_RESERVED 40
#define ATR$S_RESERVED 380
#define ATR$C_HIGHWATER 41
#define ATR$S_HIGHWATER 4
#define ATR$C_DUMMY_0 42
#define ATR$S_DUMMY_0 4
#define ATR$C_PRIVS_USED 43
#define ATR$S_PRIVS_USED 4
#define ATR$C_MATCHING_ACE 44
#define ATR$S_MATCHING_ACE 255
#define ATR$C_ACCESS_MODE 45
#define ATR$S_ACCESS_MODE 1
#define ATR$C_FILE_SPEC 46
#define ATR$S_FILE_SPEC 512
#define ATR$C_CLASS_MASK 47
#define ATR$S_CLASS_MASK 20
#define ATR$C_BUFFER_OFFSET 48
#define ATR$S_BUFFER_OFFSET 2
#define ATR$C_RU_ACTIVE 49
#define ATR$S_RU_ACTIVE 1
#define ATR$C_MAX_CODE 49
#define ATR$C_MAX_PLUS1 50
#define ATR$S_ATRDEF 8
struct ATRDEF
{
unsigned short int atr$w_size;
unsigned short int atr$w_type;
char *atr$l_addr;
};
$EOD
$ create/log C.OPT
$DECK
sys$share:vaxcrtl.exe/share
$EOD
$ create/log CLD.H
$DECK
/* This header file was created by Joe Meadows, and is not copyrighted
in any way. No guarantee is made as to the accuracy of the contents
of this header file. This header file was last modified on Sep. 8th,
1987. */
/* this file will contain the text names for the CLD qualifiers etc. */
/* this include file contains the strings that describe the command line */
char *t_rtype = "Type";
char *ta_rtype[] = {
"Undefined",
"Fixed",
"Variable",
"VFC",
"Stream",
"LFStream",
"CRStream"
};
char *t_fileorg = "Organization";
char *ta_fileorg[] = {
"Sequential",
"Relative",
"Indexed",
"Direct"
};
char *t_attr = "Attributes";
char *t_fortrancc = "FortranCC";
char *t_impliedcc = "ImpliedCC";
char *t_printcc = "PrintCC";
char *t_nospan = "Span";
char *t_char = "Characteristics";
char *t_badacl = "ACL_Corrupt";
char *t_nobackup = "Backup";
char *t_contigb = "Best_Try_Contiguous";
char *t_nocharge = "Charge";
char *t_contig = "Contiguous";
char *t_directory = "Directory";
char *t_erase = "Erase_On_Delete";
char *t_badblock = "File_Corrupt";
char *t_locked = "Locked";
char *t_markdel = "Marked_For_Delete";
char *t_spool = "Spool";
char *t_readcheck = "Read_Verify";
char *t_writeback = "Write_Back";
char *t_writcheck = "Write_Verify";
char *t_journal = "Journal";
char *t_journal_file = "Journal";
char *t_aijnl = "AIJnl";
char *t_atjnl = "ATJnl";
char *t_bijnl = "BIJnl";
char *t_rujnl = "RUJnl";
char *t_never_ru = "Never_RU";
char *t_only_ru = "Only_RU";
char *t_access = "Access_Mode";
char *ta_access[] = {
"USER",
"SUPERVISOR",
"EXECUTIVE",
"KERNEL"
};
char *t_placement = "Placement";
char *t_place_exact = "Exact";
char *t_place_oncyl = "On_Cylinder";
char *t_place_rvn = "Relative_Volume_Number";
char *t_place_lbn = "LBN_Specified";
char *t_prot = "Protection";
char *t_protset = "Protection.set";
char *t_protclr = "Protection.clear";
char *ta_prot[] = {"SYSTEM", "OWNER", "GROUP", "WORLD"};
char *t_fileprot[] = {
"RWED", "WED", "RED", "ED", "RWD", "WD", "RD",
"D", "RWE", "WE", "RE", "E", "RW", "W", "R", ""
};
char *t_credate = "Creation_Date";
char *t_revdate = "Revision_Date";
char *t_expdate = "Expiration_Date";
char *t_bakdate = "Backup_Date";
char *t_revisions = "Number_Of_Revisions";
char *t_vfcsize = "VFC_Size";
char *t_rsize = "Record_Size";
char *t_maxrec = "Maximum_Record_Size";
char *t_efblk = "Used";
char *t_ffbyte = "First_Free_Byte";
char *t_hiblk = "Allocated";
char *t_defext = "Default_Extend_Quantity";
char *t_bktsize = "Bucket_Size";
char *t_gbc = "Global_Buffer_Count";
char *t_versions = "Version_Limit";
char *t_extents = "Extents";
char *t_header = "Headers";
char *t_lbn = "LBN";
char *t_owner = "Owner_UIC";
char *t_fid = "File_ID";
char *t_backlink = "Directory_File_ID";
char *t_highwater = "Highwater_Mark";
char *t_ru_active = "Active_Recovery_Units";
char *t_wasted = "Wasted_Blocks";
char *t_filename = "Name";
char *t_fullname = "Fullname";
char *t_display = "Display";
char *t_aclexists = "ACL";
char *t_aclcontains = "ACE";
$EOD
$ create/log CLI.C
$DECK
/* Modification History
--------------------
Sep. 8, 1987 JEM - Conversion from BETA to Release
*/
#include climsgdef
#include descrip
int cli_get_value(s1,s2)
char *s1;
struct dsc$descriptor *s2;
{
static struct dsc$descriptor s1_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0};
s1_desc.dsc$w_length = strlen(s1);
s1_desc.dsc$a_pointer = s1;
return(cli$get_value(&s1_desc,s2));
}
int cli_present(s1)
char *s1;
{
static struct dsc$descriptor s1_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0};
s1_desc.dsc$w_length = strlen(s1);
s1_desc.dsc$a_pointer = s1;
return(cli$present(&s1_desc));
}
unsigned int change(orig,s1,s2)
unsigned int orig;
char *s1,*s2;
{
static struct dsc$descriptor s3_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_D,0};
long int status;
unsigned int i;
append_with_point(s1,s2,&s3_desc);
status = cli$present(&s3_desc);
i=orig;
if (status & 1)
i=1;
if (status == CLI$_NEGATED)
i=0;
return(i);
}
int append_with_point(s1,s2,out)
char *s1,*s2;
struct dsc$descriptor *out;
{
static struct dsc$descriptor s1_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0};
static struct dsc$descriptor s2_desc={0,DSC$K_DTYPE_T,DSC$K_CLASS_S,0};
static char point = '.';
static struct dsc$descriptor pt_desc={1,DSC$K_DTYPE_T,DSC$K_CLASS_S,&point};
s1_desc.dsc$w_length = strlen(s1);
s1_desc.dsc$a_pointer = s1;
s2_desc.dsc$w_length = strlen(s2);
s2_desc.dsc$a_pointer = s2;
/* new = s1 + "." + s2 */
str$copy_dx(out,&s1_desc);
str$append(out,&pt_desc);
str$append(out,&s2_desc);
return;
}
$EOD