Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-02 - 43,50230/ripoff.rnd
There are no other files named ripoff.rnd in the archive.
.ps 60,70
.noautoparagraph
.fig 12
.center
RIPOFF - Cusp-Level Disk Service Routine
.sk 5
.center
G. Michael Uhler
.sk 25
.center
University Computing Center
.center
University of Arizona
.center
Tucson, Arizona
.sk 2
.center
March 25, 1978
.title RIPOFF - Cusp-Level Disk Service Routine
.page
.fig 5
RIPOFF is intended to be a centralized repository for disk-related
maintenance utilities, and as an alternative to the DEC supplied
CUSPs such as DSKRAT, DSKLST, REDALL, DELFIL, etc.  As an added
bonus, it appears to be 5 to 10 times faster than the equivalent
DEC utilities for most non-trivial functions.  This document
is written as an explanation of the various functions that RIPOFF
provides and is intended to be read by experienced system personnel
who are familiar with the concepts of the TOPS10 file system.
.sk 1
RIPOFF was originally written by Steve Bush at the University of
Texas Health Sciences Center at Dallas.  Since then, a massive
rewrite has been undertaken at the University
of Arizona Computing Center.  The original goal was to simply add
SFD support to the existing code.  However, it soon became apparent
that numerous bugs must be fixed
also (see the revision history for details).  We have been running
the current version of RIPOFF for several months with no reported
problems and feel that it is fairly stable.  However, we urge every
site to be initially very cautious in the use of RIPOFF, since we
cannot possibly test it under every possible monitor and disk
configuration.  We suggest that each function be verified on a
scratch pack, preferably using a DEC standard CUSP, before using
that function in production.  For example, use DSKRAT to verify
the /V and /S functions, DSKLST to verify the /P function, etc.
.page
RIPOFF may be run with the following command:
.sk 1
.nofill
	.RUN RIPOFF
.sk 1
.fill
Having found that the user is sufficiently priviliged ([1,2] or
running with JACCT), RIPOFF initializes a number of parameters
and requests the startup option from the user.  The answer to
this question may be one of the following (minimal-segment-decoding
is used):
.sk 1
.nofill
	QUICK - Don't ask about off-line devices
	LONG  - Full startup dialog
	HELP  - Type help message
.sk 1
.fill
The "LONG" response must be used if dismounted structures are to
be accessed.  When using this option, any unit whose status indicates
that it does not have a pack logically mounted will result in a message of
the form:
.sk 1
.nofill
	Unit RPA1 has no pack mounted
	Type YES to ignore error, NO to consider pack down
	Proceed?
.sk 1
.fill
If the user replies with a "Y", RIPOFF will ignore the indicated
status and assume that the unit contains a spinning pack.  An "N"
response will result in the unit being assigned a "DOWN" status.
.sk 1
When the internal unit data blocks are built for each "UP" unit in the
system, RIPOFF will type a "*" to indicate it's readiness to accept
a command.  The command string is intended to tell RIPOFF the following
things:
.sk 1
.nofill
	Device
	Filename(s)
	Extension(s)
	Path
	Block numbers
	Switches
	Switch options
.sk 1
.fill
where the device may be a generic disk name (ALL, D, DS, DSK),
a structure name (DSKB), a specific logical unit in a structure
(DSKB1), a contoller type (RP), a specific controller (RPA),
a specific unit within a controller (RPA1), or even a pack ID
(PRIV01).
.sk 1
The basic command string format is one of the following:
.sk 1
.nofill
	DEV:FILE.EXT[PATH]/WABC/XDEF...   ; Comments
.sk 1
		or
.sk 1
	DEV:BLOCK1<BLOCK2(BLOCK3)/YGHI... ; Comments
.sk 1
		or
.sk 1
	DEV:FILE.EXT[PATH]=DEV:FILE.EXT[PATH]/ZJKL... ; Comments
.sk 1
.fill
The default command string is ALL:*.*[*,*,*,*,*,*,*].  Any element
of the command string that is left out will also cause a "*" to be
assumed for that element.
.sk 1
Switches typed in the command string immediately following a "/" and are
always exactly one character (A-Z).  This one character specifies the
general processor to call.  Any following characters (A-Z, 0-9), up until the
next "/", ";", or line terminator, are switch options whose interpretation
is dependent on the switch in question.
.sk 1
In the first example above, the switches are "W" with the "A", "B",
and "C" options, and "X" with the "D", "E", and "F" options.  Similarly,
in the second example, the switch is "Y" with the "G", "H", and "I"
options.
.sk 1
For commands where block numbers are relevant, the second format
is more likely (although parts of both can be readily mixed).
The usual interpretation of the second example is from BLOCK1
through BLOCK2 inclusive, by increments of BLOCK3 (e.g., see /R).
.sk 1
The third command format is used to indicate that a scratch
area is being used (e.g., see /I).
.sk 1
Several characters have special meaning in the command string.
They are as follows:
.sk 1
.left margin 11
.indent -8
_<tab_>###Ignored
.indent -8
_<space_>#Ignored
.indent -8
_"#######Followed by a delimiter, ASCII characters, and another
delimiter, e.g., _"/TEXT/
.indent -8
_'#######Followed by a delimiter, SIXBIT characters, and another
delimiter, e.g., _'/TEXT/.  The single quote is also used to indicate division
within expressions.  See below.
.indent -8
_########A cluster number follows, i.e. _#1234 represents cluster
1234
.indent -8
_$#######A filename or extension follows.  RIPOFF assumes that any
command string atom that begins with a digit is a number.  Therefore
the _$ must be used to "protect" filenames or extensions that start
with a number, e.g., LSX012.$01E
.indent -8
(#######Relative or incremental number follows.
.indent -8
)#######Matched with an opening "(", ignored.
.indent -8
*#######Used to indicate wildcards in the filename, extension, or path.
Also used to indicate multiplication within expressions.  See below.
.indent -8
,#######Separates octal half-words.
.indent -8
,,######Separates octal half-words.
.indent -8
_.#######Filename has preceded, extension (maybe null) follows.
.indent -8
/#######Processor switch follows
.indent -8
_:#######Device name preceded
.indent -8
_;#######Terminates command scan, comments follow
.indent -8
_<#######Initial block or cluster number preceded, final block or
cluster number follow.
.indent -8
_>#######Same as _<
.indent -8
==######Word number preceded, new contents follow (see /EC)
.indent -8
=#######Scratch area file spec preceded
.indent -8
_!#######Run preceding file
.indent -8
_[#######Path follows.
.indent -8
_]#######When matched with opening "[", ignored.
.indent -8
_^#######New radix (_^D, _^O, or _^B) for next expression, then
expression follow.
.sk 1
.left margin 0
In addition to the above characters, four (actually two new ones)
more should be considered.  RIPOFF will accept an expression anywhere
a number is valid.  Such an expression is evaluated strictly
left-to-right with no parenthesis allowed.  Valid binary operators
in an expression are "+" (addition), "-" (subtraction), "*"
(multiplication), and "'" (division).
.sk 1
By default, RIPOFF writes it's output to device TTY:.  However,
if a logical device LST:, exists, RIPOFF will use that instead.
If it is a directory device, the listing will go to the file
RIP0.LST.  If this file already exists, RIPOFF will create
RIP1.LST,...,RIP9.LST, until a non-existent file is found.  This
insures that previous outputs (as long as there aren't too many)
are never lost.
.sk 1
Note that if the output device is not TTY:, the top of every page
of the listing file contains the RIPOFF version number, the current
time and date, the page number, and the command string that it
is currently executing.  Thus, all listings show what command
created them and when.  If a ";" appears in the command string,
the rest of the command is considered comments.  These comments
will also appear on the top of each page, thereby further documenting
the listing.
.sk 1
Each function is covered separately below.
.page
/A#-#Alphabetize directories
.sk 3
This switch causes the entries in the specified directories to be
sorted by filename, extension, or creation date/time.  The /A
options are as follows:
.sk 1
.left margin 11
.indent -6
/A##-#Same as /AF
.indent -6
/AF#-#Sort by filename, then extension
.indent -6
/AE#-#Sort by extension, then filename
.indent -6
/AT#-#Sort by creation date/time
.indent -6
/AM#-#Sort the MFD by PPN
.indent -6
/AX#-#(Xlist) When OR'ed with one of the above options, e.g., /AFX,
the sorted directories are not listed on the TTY.  This is useful if
a lot of directories are to be done, since printing the listing slows
down the whole process.
.left margin 0
.sk 2
Note that on all sorts except /AM, the MFD is avoided.  Conversely,
/AM only sorts the MFD.
.sk 1
This switch should be used with care.  Do not try to sort a directory
when the structure is mounted and the user is logged in, since the
monitor may have part of the directory in core.  Preferably, the
structure should be dismounted, (see /SL) but directories can probably
be sorted with the structure mounted if the user is not logged in.
RIPOFF will not allow the /AM switch to be used on a mounted structure.
.sk 3
Examples
.nofill
.sk 2
*DSKB:/A		; Sort all directories on DSKB except the
			; MFD
.sk 1
*DSKB:/AM		; Sort the MFD of DSKB.  Note that this
			; can never be done with the structure
			; mounted.
.sk 1
*DSKB:[10,*]/AE		; Sort all the 10 project UFD's by
			; extension
.sk 1
*DSKB:[10,12,RIPOFF,NEW]/AT ; Sort the specified directory by creation
			    ; date/time
.fill
.page
/C#-#Convert disk parameters
.sk 3
This switch accepts a block number, cluster number, CFP,
cylinder-surface-sector, or a universal date/time and converts them
to equivalent values.  This is quite useful when one has one value
and needs to know the equivalent values.
The /C options are as follows:
.sk 1
.left margin 11
.indent -6
/CB#-#Convert from a structure block number
.indent -6
/CC#-#Convert from a structure cluster number.  Note that this switch
is the only place in RIPOFF where the cluster number is specified
without the "_#" preface, i.e., 1234/CC instead of _#1234/CC.
.indent -6
/CD#-#Convert from a structure CFP
.indent -6
/CP#-#Convert from unit cylinder, surface, and sector
.indent -6
/CT#-#Convert from a universal date/time.  This isn't exactly a
disk parameter but it's a useful conversion anyway.
.indent -6
/CU#-#Convert from a block number on a unit.
.left margin 0
.sk 3
Examples
.sk 2
.nofill
*DSKB:1234/CB		; Convert block 1234 on DSKB
.sk 1
*DSKB:102/CC		; Convert from cluster 102 on DSKB.  Note
			; that the cluster number has no "_#"
			; before it
.sk 1
*DSKB:102/CD		; Convert from CFP 102 on DSKB
.sk 1
*DSKB:1<16(10)/CP	; Convert from cylinder 1, surface 16,
			; sector 10 on DSKB
.sk 1
*RPA1:1<16(10)/CP	; Do the same for physical unit RPA1
.sk 1
*124720,,345632/CT	; Convert from the specified universal
			; date/time
.sk 1
*RPA1:1234/CU		; Convert from block 1234 on unit RPA1
.fill
.page
/D#-#Delete files
.sk 3
This switch is used to delete files.  RIPOFF is capable of deleting
a file through almost any error that may exist.  The user has the
option of specifying monitor RENAME only, DELFIL-type delete only,
or a combination of the two in which RIPOFF will try the monitor
RENAME first and then the RIPOFF internal subroutine to delete the
directory entry if the RENAME fails.  Note that the internal
subroutine will not release the SAT bits and therefore create
lost blocks.  The /D options are as follows:
.sk 1
.left margin 11
.indent -6
/D##-#Delete the file(s). (Try monitor RENAME first then internal
subroutine)
.indent -6
/DM#-#Delete with monitor RENAME only
.indent -6
/DR#-#Delete with internal subroutine only. (Don't even try monitor
RENAME)
.indent -6
/DU#-#Delete all files in the specified UFD and then delete the
UFD.  Note that this option is available with entire UFD's only,
not with SFD's.
.indent -6
/DN#-#Delete null directories
.indent -6
/DB#-#Delete only those files that are bad (RIB errors) in the
specified directories
.indent -6
/DT#-#Asks for a creation date/time and an access date/time and only
deletes those files created before the first date/time and not
accessed since the second.
.indent -6
/DA#-#Prints each file to be deleted and asks for confirmation before
attempting to delete. May be OR'ed with all except the /DU or /DN
options.
.left margin 0
.sk 3
Examples
.nofill
.sk 2
*FILE.*[7,7]/D		; Delete ALL:FILE.EXT[7,7]
.sk 1
*DSKB:*.*[7,7]/D	; Deletes DSKB:*.*[7,7].  Note that if [7,7]
			; contains any non-empty SFD's, the monitor
			; RENAME will fail on the SFD and RIPOFF
			; will zap the SFD with the internal
			; subroutine.  To avoid this, use either
			; /DA or /DM
.sk 1
*DSKB:[7,7]/DU		; Delete all files in [7,7] and lower
			; directories and then delete the UFD.  This
			; option will not create unnecessary lost
			; blocks as in the above example.  Note that
			; in this case only, the path spec [7,7]
			; really implies [7,7,*,*,*,*,*]
.sk 1
*DSKB:[7,7,FOO]/DB	; Delete all bad files in DSKB:[7,7,FOO]
.sk 1
*/DB			; Delete all bad files in the entire system
.sk 1
*DSKB:'/():-/.WRD[7,7,FOO]/D ; Delete weird file in [7,7,FOO]
.sk 1
*DSKB:/DN		; Delete all null directories on DSKB
.sk 1
*DSKB:[10,*,*,*,*,*,*]/DN ; Delete all null directories in project 10
.sk 1
*DSKB:*.TMP/DT		; Delete all TMP files on DSKB that meet the
			; date/time criteria
.fill
.page
/E#-#Edit disk blocks
.sk 3
This switch allows any disk block to be modified.  This provides an
easy way to change parameters in a HOME block or fix a RIB that is
unacceptable to FILSER.  One block at a time may be read into core,
examined, changed, and then written back out.  The new contents of
a word may be typed in in any format that is acceptable to the
command scanner, i.e., ASCII, SIXBIT, octal, decimal, or binary.
The type out format is normally 12 octal digits, but may also be
ASCII, SIXBIT, or universal date/time.  Note that it is possible
to write the block onto a completely different place from which
it was read.  However, it is assumed that it will always be written
back to the same place.  If this is not the case, a warning message
is issued and the user is forced to confirm the choice.  A write
is illegal without a previous read.  The /E options are:
.sk 1
.left margin 12
.indent -7
/ER##-#Read the block into core
.indent -7
/EW##-#Write the block back to disk
.indent -7
/ERS#-#Read the same block as the last read/write
.indent -7
/EWS#-#Write the same block as the last read/write
.indent -7
/EC##-#Change the contents of a word in the block in core
.indent -7
/ET##-#Type the contents of a word in octal
.indent -7
/ETA#-#Type the contents of a word in ASCII
.indent -7
/ET7#-#Same as /ETA
.indent -7
/ET6#-#Type the contents of a word in SIXBIT
.indent -7
/ETU#-#Type the contents of a word as though it were in universal
date/time format
.indent -7
/ETS#-#Type the same word as that specified in the last /ET or
/EC command.
.indent -7
/ETL#-#Type the word previous to the one specified in the last
/ET or /EC command.
.indent -7
/ETN#-#Type the word following the one specified in the last
/ET or /EC command.
.left margin 0
.sk 1
Note that the S, L, and N switches may be OR'ed together with any
combination of the A, 7, 6, or U format.
.sk 3
Examples
.sk 2
.nofill
.sk 2
*DSKB:4027/ER		; Read block 4027 of DSKB
.sk 1
*2/ET			; Type word 2 of the block in octal
.sk 1
*/ET6			; Type same word in SIXBIT.  Note that /ETx
			; with no word number specified is the same
			; as /ETSx
.sk 1
*/ETL6			; Type word 1 in SIXBIT
.sk 1
*0<12/ET		; Type words 0 through 12 in octal
.sk 1
*35/ETU			; Type word 35 as if it were in universal
			; date/time format
.sk 1
*1=='/FOO//EC		; Change word 1 to SIXBIT/FOO/.  Note that
			; the // is intentional
.sk 1
*5==10/EC		; Change word 5 to an octal 10
.sk 1
*/EWS			; Write the block back to the place from
			; which it came.  (In this example, 4027
			; on DSKB)
.fill
.page
/F#-#Find RIBs of files
.sk 3
This switch causes RIPOFF to find the RIB of a file and print
the relative block within the unit and the logical block within
the file structure of that RIB.  RIPOFF first tries to LOOKUP the
file and print the information from the CFP.  If this fails, or if
the /FD option is selected, the structure is searched cluster-by-cluster
until all RIBs matching the specifications have been found.
The /F options are as follows:
.sk 1
.left margin 12
.indent -7
/F###-#Do directory search, then structure search
.indent -7
/FE##-#Do only directory search.  The file exists.
.indent -7
/FD##-#Do only structure search; the file has been deleted.
.indent -7
/FD2#-#Enable RIPOFF to find 2nd RIBs by forcing it to read every
block instead of every cluster.
.left margin 0
.sk 3
Examples
.sk 2
.nofill
*DSKB:FOO.BAZ[10,10]/FE	; Find the RIB of the specified file by doing
			; only a directory search
.sk 1
*DSKB:FOO.BAZ[10,12,RIPOFF]/FE ; Same as above only in an SFD
.sk 1
*DSKB:FOO.BAZ[10,10]/FD	; Find the RIB by doing a structure search.
			; Note that specifying more of a path than
			; just the PPN with the /FD switch is futile
			; since the monitor does not keep enough
			; information in each RIB to tell which level
			; the file belongs in.
.fill
.page
/H#-#Type RIPOFF help file
.sk 3
This switch causes the file RIPOFF.HLP to be typed on the terminal.
The file is looked for on HLP:, SYS:, and finally DSK:.  RIPOFF.HLP
contains a summary of all switches and options that are acceptable
to RIPOFF.  The /H options are as follows:
.sk 1
.left margin 11
.indent -6
/H#-#Type the RIPOFF help file
.left margin 0
.sk 3
Examples
.nofill
.sk 2
*/H			; Find the help file and type it
.fill
.page
/I#-#Initialize files from RIBs alone
.sk 3
.center
** Special Note **
.sk 1
This is the only RIPOFF function with which I am not satisfied.
There are inherent problems with recovering an entire structure
containing SFDs from the RIBs alone given the design of the
TOPS10 file system.  There is simply not enough information in the
RIB of a file to determine at what level of nesting it existed.
It is therefore quite difficult to totally rebuild a structure
with the SFD structure intact.  I will be looking at this problem
in the next few months and would appreciate any feedback from
other users.
.sk 2
It is sometimes useful to rescue files which have been deleted or
lost.  When a file is deleted, although it's block space on the
disk is marked free for use and directory pointers to that file are
deleted, the data itself remains physically on the disk until
another file is allocated over it, which may not be immediately.
Therefore, if action is taken quickly enough, it is possible to
recover deleted files.  RIPOFF will search the entire file structure
for RIBs matching the filenames, extensions, and PPNs in the
command string.  Note that I say "PPNs" instead of "PATHs" since the
RIB only contains the PPN in which the file existed, not the full
path.  When the entire structure is passed over once, RIPOFF will
transfer all files found to a scratch area (disk or magtape).  When
all files have been transferred to the scratch area, it may be rewound
and the files restored to the original structure (or any other
structure for that matter).
.sk 1
The /I command string is of the third form in the examples given
at the beginning of this document.  The scratch area device and
file spec are specified to the left side of the equal sign.  The
files to be saved or restored are specified to the right side of
the equal sign.  Note that if a number is typed in parenthesis within
the scratch area device and file spec, this will be interpreted as
the number of buffers to use for the device.  The default is 15 decimal.
.sk 1
The scratch area is used for RIPOFF's internal needs.  If it is a
magtape, RIPOFF will correctly handle the change of reels, if necessary,
on both the save and restore.  If it is a disk file, there must be
enough space available to total the combined allocated sizes of all
files to be saved.  RIPOFF will not delete the scratch area disk file
when it is through.
.sk 1
The /I options are as follows:
.sk 1
.left margin 11
.indent -6
/I##-#Same as /ISR
.indent -6
/IS#-#Save specified files on scratch area
.indent -6
/IR#-#Restore specified files from scratch area
.indent -6
/IP#-#Print directory listing of scratch area
.indent -6
/ID#-#When OR'ed with /IS, causes RIPOFF to save only those files
that are free in the SATs.
.indent -6
/IE#-#When OR'ed with /IS, causes RIPOFF to save only those files
that are marked in the SATs.
.indent -6
/IA#-#Same as /IDE, i.e., save or restore files regardless of the SAT bits.
.indent -6
/IT#-#Asks for date/time limits and only saves/restores files created
between these limits. May be OR'ed with any other option.
.indent -6
/I2#-#Enable 2nd RIB recovery by forcing RIPOFF to search every block
for RIBs instead of just the first block of every cluster. May be
OR'ed with with all but /IF saves.
.indent -6
/IO#-#Allow overwritting.  The possibility exists that another file
may have overwritten the file that you wanted before RIPOFF got to it.
However, if the amount of overwritten data is small compared to the
size of the file, it may be worth getting a few clusters worth of
garbage to save a large file.  Normally, RIPOFF will stop restoring
the file if it finds overwritten data since this is obviously a
security violation.  However, if this option is selected, RIPOFF
will restore the file, overwritten data and all.  This option
should never be used until a normal restore is tried and fails.
.indent -6
/IX#-#Don't print every file saved/restored, only the directories.
.indent -6
/IF#-#Failsafe mode.  Don't use any RIB search logic, simply copy
all files from or to the scratch area.  This function may go away
in the next release in favor of a strictly pack-to-pack copy function.
.left margin 0
.fill
.sk 3
Examples
.sk 2
.nofill
*MTA1:=DSKB:/IS		; Save all (see special note above)
			; files from DSKB on MTA1
.sk 1
*DSKA:FOO.BAZ[1,2]=DSKB:FOO.MAC[10,7]/I
			; Restore FOO.MAC to [10,7] using 
			; DSKA:FOO.BAZ[1,2] as a scratch area
.sk 1
*MTA1:=DSKB:FOO.BAZ[10,7]/IR ; Restore FOO.BAZ to [10,7].  Note that
			     ; MTA1 may contain a save of the entire
			     ; structure.
.sk 1
*DSKA:FOO.BAZ[1,2]=/IP	; Print directory listing of scratch area
.sk 1
.page
/L#-#Lock RIPOFF in core
.sk 3
This switch locks the job in core with the LOCK UUO.  If the job
cannot be locked because of insufficient privileges, (shouldn't ever
happen in [1,2]) the user will be notified immediately.  Otherwise,
RIPOFF will attempt a LOCK every 2 seconds for 16 seconds.  At the end
of this period the error code will be given if the lock was
unsuccessful.  Note that a number of routines in RIPOFF expand core.
Since a CORE UUO is illegal when locked, the job is first unlocked,
the core area expanded, then the job is relocked.  If the relock
fails, a message will be typed and execution will continue unlocked.
The /L options are as follows:
.sk 1
.left margin 11
.indent -6
/L##-#Lock job in core
.indent -6
/LU#-#Unlock job
.left margin 0
.sk 3
Examples
.sk 2
.nofill
*/L			; Lock job in core
.sk 1
*/LU			; Unlock job
.fill
.page
/P#-#Print information, blocks, and files
.sk 3
This switch allows the user to observe the disk system.  Specifically,
the /P switch may be used to print disk statistics, SAT's, BAT's,
units, etc.  There are two distinct subsets of the /P switch.  The first
subset is similar to the DSKLST program and allows the user to print
various information about the disk system.  The second subset allows
the user to print the contents of blocks or files in any of several
formats.  Multiple switch options may be mixed within either subset,
but options from both subsets may not be mixed.  The /P disk list
options are as follows:
.sk 1
.left margin 11
.indent -6
/PB#-#Print the unit's BAT blocks in octal, then interpret the
block in readable format
.indent -6
/PE#-#Print error summary.  This is similar to the /PF option, except
the file information is not listed.  However, any file that is found
to have read errors or a bad RIB is listed, and a summary is given of all
disk errors, including those listed in the RIBSTS word of the RIB.
.indent -6
/PF#-#Print file information.  Produces a complete directory listing of the
specified disk by user directory.  Specific filenames, extension,
or path specifications may be given in the command string in which
case only the files that match the command string will be listed.
.indent -6
/PL#-#Print listing.  This is similar to the /PF option in that it
prints the file information.  However, it is used to look for files
and is therefore similar to the monitor DIRECT command.  Unlike the
/PF option, null UFD's are not listed.  Thus the /PL option may
be used to get a listing of all occurances of a particular filename,
extenstion, etc.  The /PL option may have another function.
A command of the form DEV:FILE.EXT[path](len) will only print those
files whose allocated length is greater than "len".
.indent -6
/PP#-#Print performance summary.  This option histograms the
file length in blocks and the number of RIB pointers in each
file.  The second histogram will give a breakdown on how fragmented
the structure is, and therefore how badly refreshing is needed.
.indent -6
/PQ#-#Print quick.  This is similar to the /PL option except no
information beyond the filename, extension and path is printed.  Therefore,
it is similar to the DIRECT/F monitor command.
.indent -6
/PS#-#Print SAT blocks.  This option print the SAT blocks of all
units specified in octal and gives the total remaining space in
each block.
.indent -6
/PU#-#Print physical units for each pack in a structure.
.indent -6
/PV#-#Print vital statistics.  This option prints the HOME block
of every specified unit in octal and then interprets each
interesting entry into readable format.
.left margin 0
.sk 2
The block list subset consists of the following options:
.left margin 11
.sk 1
.indent -6
/PA#-#Print in ASCII format.  This option prints the specified
blocks/files in ASCII and is very similar to the monitor TYPE or
PRINT commands.
.indent -6
/PD#-#Print in directory format.  This option prints the specified
block as if it were a directory.  The first word of each word pair
is listed as a SIXBIT filename, the left half of the second word as
a SIXBIT extension, and the right half is interpreted as a CFP.
.indent -6
/PO#-#Print in octal.  This option prints the specified blocks/files
in octal with a header for each block giving the block number.
.inden-6
/PR#-#Print as a RIB.  This option prints the specified block as if
it were a RIB.  In addition, if a filename is given in the command
string, the RIB of the specified file is printed.  This option
prints all non-zero information in the RIB preamble in a readable
format (much like DIRECT/DETAIL) and then interprets and prints
the retrieval pointers from the RIB.
.indent -6
/P6#-#Print in SIXBIT.  This option prints the specified blocks/files
in SIXBIT with a header for each block.
.indent -6
/P7#-#Print in ASCII.  This option prints the specified blocks/files
in ASCII with a header for each block.  It is very similar to the /PA
option except for the inclusion of the header information.
.left margin 0
.sk 3
Examples
.sk 2
.nofill
*DSKB:FOO.BAZ[10,7,FOO]/PR ; Print the RIB of the specified file
.sk 1
*DSKB:1234/PR		; Print the specified block as a RIB
.sk 1
*DSKB:1234<1234+5/PO	; Print blocks 1234 through 1241 in octal
.sk 1
*DSKB:FOO.*/PL		; Find and print all files named FOO.*
			; on DSKB
.sk 1
*10,7.UFD/PD		; Prints ALL:[10,7] in a readable format
.sk 1
*FOO.SFD[10,7]/PD	; Prints ALL:[10,7,FOO] directories in a
			; readable format
.sk 1
*/PV			; Print vital statistics for all units
			; on the system
.sk 1
*DSKB:/PB		; Print the BAT blocks on DSKB
.fill
.page
/R#-#Read disk blocks
.sk 3
This switch simply reads all blocks specified in the command string
and reports any errors.  This function is similar to the REDALL
CUSP.  The /R options are as follows:
.sk 1
.left margin 11
.indent -6
/R#-#Read specified blocks
.left margin 0
.sk 3
Examples
.nofill
.sk 2
*DSKB:1234<4567(10)	; Read blocks 1234 through 4567 skipping 10
			; blocks between each read
.sk 1
*DSKB:/R		; Read all blocks on DSKB (0 through highest
			; block on unit using 1 as an increment)
.sk 1
*DSKB:40000/R		; Read blocks 40000 through the highest
			; block on the unit using 1 as an increment
.fill
.page
/S#-#Manipulate SAT's
.sk 3
This switch allows the user to observe and manipulate the SAT blocks
on a structure.  Since the monitor keeps SATs in core for every mounted
structure and rewrites these SATs often, RIPOFF will not allow SATs
to be written back to a mounted structure.  The /S options are as
follows:
.sk 1
.left margin 11
.indent -6
/SL#-#Lock up a structure in preparation for removing it.  The specified
structure is first locked using the .FSLOK STRUUO function and
then removed with the .FSREM STRUUO function.  The user may specify
the number of seconds between the .FSLOK and the .FSREM by
placing the desired number in the command string.  The default value
is 60 seconds.
.indent -6
/SR#-#Read the SATs of the specified structure into core.  If you
plan to change the SATs, do a /SL first.
.indent -6
/SW#-#Write the in-core copy of the SATs back out.  Note that this
may not be done unless the structure is dismounted.
.indent -6
/SP#-#Print the SAT blocks of the specified structure.  Produces the
same type of listing as /PS
.indent -6
/ST#-#Type the status of the SAT bits specified by the block or
cluster numbers given in the command string.
.indent -6
/SF#-#Free the SAT bits specified by the block or cluster numbers
given in the command string.  Note that this only changes the
in-core copy of the SATs.
.indent -6
/SM#-#Mark the SAT bits specified by the block or cluster numbers
given in the command string.  Note that this only changes the
in-core copy of the SATs.
.left margin 0
.sk 3
Examples
.sk 2
.nofill
*DSKB:/SL		; Lock up DSKB and remove it 60 seconds
			; later
.sk 1
*DSKB:5/SL		; Lock up DSKB and remove it 5 seconds
			; later
.sk 1
*DSKB:/SR		; Read in the SATs
.sk 1
*DSKB:1234/ST		; Type the status of the cluster containing
			; block 1234
.sk 1
*DSKB:_#100<_#200/ST	; Type the status of clusters 100 through 200
.sk 1
*DSKB:_#1234/SM		; Mark cluster 1234 in the SAT
.sk 1
*DSKB:_#100/SF		; Free cluster 100 in the SAT
.sk 1
*DSKB:/SW		; Write the SATs back out to DSKB
.fill
.page
/U#-#Create specified UFDs/SFDs
.sk 3
This switch performs a function similar to the CREDIR CUSP in that
it creates the directories specified in the command string.  Quotas
will all be set to infinity and if a directory already exists, no
attempt will be made to create over the top of it.  Note that
this switch uses monitor ENTERs to create the specified directories
and as a result, requires that the specified structure be mounted.
The /U options are as follows:
.sk 1
.left margin 11
.indent -6
/U#-#Create the specified directories
.left margin 0
.sk 3
Examples
.sk 2
.nofill
*DSKB:[10,12,RIPOFF,NEW]/U ; Create all non-existent directories
			   ; in the command string
.sk 1
*DSKB:[10,7]/U		; Create the [10,7] UFD if it doesn't exist
.fill
.page
/V#-#Verify files
.sk 3
This switch verifies the integrety of the files specified in the
command string.  The RIBs of every file are checked, each file
is checksummed and compared with the checksum in the RIB, the
corresponding SAT bits are checked to insure that they are marked,
and at least one block of every group is read and checked for
hardware readability.
.sk 1
If *.*[*,*,*,*,*,*,*] is specified in the command string, or left out
and assumed by default, the disk SATs are read into core, and RIPOFF
builds it's own SATs as each file is read.  These two SATs are then
compared (similar to DSKRAT) and any clusters which are multiply
used, free, or lost are reported.  In addition, any such errors
may be fixed by rewriting RIPOFF's copy of the SAT's back to the
disk.  This function may only be done if the structure is dismounted.
The /V options are as follows:
.sk 1
.left margin 11
.indent -6
/V##-#Verify the specified files
.indent -6
/VA#-#Read all blocks.  This option forces RIPOFF to read all blocks
of the files specified in the command string and report any which
are hardware unreadable.  Also, if all files were specified, RIPOFF
will read all other blocks on the disk that were not contained in
a file.  This is similar to a DSKRAT followed by a REDALL.
.indent -6
/VQ#-#Quick option.  This option reads no more blocks than are
absolutely necessary to do the job.  /V normally reads at least
the first block of every group; /VA reads all blocks of the file;
/VQ does neither.  
.indent -6
/VF#-#Fix the SATs.  If all files are specified, the RIPOFF copy
of the SATs will be written back to the disk, thus fixing all errors.
Note that the F option may also be combined with /VA and /VQ.
RIPOFF will not allows this option to be selected if the structure
is mounted.
.left margin 0
.sk 3
Examples
.sk 2
.nofill
*DSKB:FOO.BAZ[10,7,FOO]/V  ; Verify the integrity of the specified
			   ; file
.sk 1
*DSKB:FOO.BAZ[10,7,FOO]/VA ; Verify and read all blocks of the file
.sk 1
*DSKB:/VF		; Verify all files and fix the SATs. DSKB
			; may not be mounted if the F option is used
.sk 1
*DSKB:/VQF		; Faster than the above example but will
			; not catch checksum errors
.fill
.page
/W#-#Do word searches
.sk 3
This switch allows the user to search for a particular pattern in
a range of disk blocks or files.  A mask word may be specified
that is used to mask each word that is a candidate before the comparison
with the word being searched for.  The /W options are as follows:
.sk 1
.left margin 11
.indent -6
/WM#-#Set search mask for the search
.indent -6
/WS#-#Start the search
.indent -6
/WT#-#Type current values of the search mask and search word
.indent -6
/WW#-#Set word to be searched for
.left margin 0
.sk 3
Examples
.sk 2
.nofill
*777777/WM		; Set mask for the right-half of the
			; word
.sk 1
*606060/WW		; Set word to be searched for to 0,,606060
.sk 1
*/WT			; Type current values of mask and word
.sk 1
*DSKB:100<500/WS	; Search blocks 100 through 500 on DSKB for
			; the specified pattern masked with the mask
.sk 1
*DSKB:FOO.BAZ[10,7]/WS	; Search the specified file
.fill
.page
/X#-#Exit and close listing files
.sk 3
This switch closes all listing files and releases all channels before
exiting to the monitor.  Note that if the user types a _^C to RIPOFF
when the listing is being written to a file, RIPOFF will ask if the
user wishes to close the listing file before exiting.  This is intended
to avoid losing the listing if the user forgets to use /X to exit.
The /X options are as follows:
.sk 1
.left margin 11
.indent -6
/X##-#Exit to the monitor
.indent -6
/XQ#-#Exit and run QUEUE
.left margin 0
.sk 3
Examples
.sk 2
.nofill
*/X			; Exit to the monitor
.sk 1
*/XQ			; Exit and run QUEUE
.fill
.page
RIPOFF error messages
.sk 3
A large number of warning or error messages can result from an
invalid or non-applicable command string (/LU without a previous
/L, /EW when no data has been /ER'ed, etc.).  These messages
are rather explicit in meaning and need not be discussed at
length.
.sk 1
As a protection against inadvertently wiping out file structures,
two extra precautions are taken.  If an OUTPUT UUO is attempted at
any time, a warning of the following form is typed:
.sk 1
.nofill
	Write enable?
	Proceed?
.sk 1
.fill
If answered by a "N", RIPOFF will stop immediately and exit.  A
"Y" will allow the output to continue.  This question will only
be asked once for every command string, i.e., the write enable
is good for one and only one command string.
.sk 1
In addition, if any attempt is made to alter the status of files
from [1,1], [1,4], [1,2], [2,5], or [10,1], the following message
occurs:
.sk 1
.nofill
	Access files from [path]?
	Proceed?
.sk 1
.fill
This insures that the fumble-fingered user doesn't accidentally
destroy a structure.  Additional PPNs may be added by adding
them to the table VIPS.
.sk 1
Hardware and software errors are reported to the listing file.
Note that the entire listing file (if not TTY) is tabbed over
one tab from the left margin.  All error messages are not, and
are thus readily identified.  All RIPOFF disk I/O falls through
one major low-level subroutine, BLKRED/BLKWRT.  At this level,
a complete summary of all hardware error conditions is given
as in the following example:
.sk 1
.nofill
  FOO.BAZ[10,7,FOO] Read error on RPA0, block 1234
  = Cylinder 1  surface 16  sector 10
  Status = 400000,,140000 = IO.BKT+IO.DTE
  Coni = 200014 (Exception)+(*Done*)+(PI channel=4)
.fill
.sk 1
The right half status bits are from the monitor GETSTS UUO.  The
left half bits are internally defined and are as follows:
.sk 1
.nofill
	IO.FAC	Bit 0	File is active on RIPOFF software channel
	IO.CKS  Bit 1	File has a software checksum error
	IO.WRT	Bit 2	File is being written on this channel
.sk 1
.fill
The CONI word is obtained from the DEVSTS UUO.  All bits of the
status and CONI words are interpreted into English. Stars
around phrases in the CONI interpretation indicate that the bit
causes an interrupt.
.sk 1
Software errors result in messages similar to the hardware errors
except the CONI word is suppressed since the hardware
status is not at fault.  The only software-type errors that
currently exist are RIB error and software checksum error.