Google
 

Trailing-Edge - PDP-10 Archives - decuslib10-02 - 43,50230/ripoff.doc
There are no other files named ripoff.doc in the archive.














                    RIPOFF - Cusp-Level Disk Service Routine





                                G. Michael Uhler

























                          University Computing Center
                             University of Arizona
                                Tucson, Arizona


                                 March 25, 1978
     RIPOFF - Cusp-Level Disk Service Routine                        Page 2







     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.

     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.
     RIPOFF - Cusp-Level Disk Service Routine                        Page 3


     RIPOFF may be run with the following command:

             .RUN RIPOFF

     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):

             QUICK - Don't ask about off-line devices
             LONG  - Full startup dialog
             HELP  - Type help message

     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:

             Unit RPA1 has no pack mounted
             Type YES to ignore error, NO to consider pack down
             Proceed?

     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.

     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:

             Device
             Filename(s)
             Extension(s)
             Path
             Block numbers
             Switches
             Switch options

     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).

     The basic command string format is one of the following:

             DEV:FILE.EXT[PATH]/WABC/XDEF...   ; Comments

                     or

             DEV:BLOCK1<BLOCK2(BLOCK3)/YGHI... ; Comments

                     or

             DEV:FILE.EXT[PATH]=DEV:FILE.EXT[PATH]/ZJKL... ; Comments
     RIPOFF - Cusp-Level Disk Service Routine                        Page 4


     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.

     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.

     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.

     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).

     The third command format is used to indicate that a  scratch  area  is
     being used (e.g., see /I).

     Several characters have special meaning in the command  string.   They
     are as follows:

        <tab>   Ignored
        <space> Ignored
        "       Followed by a  delimiter,  ASCII  characters,  and  another
                delimiter, e.g., "/TEXT/
        '       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.
        #       A cluster number follows, i.e.   #1234  represents  cluster
                1234
        $       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
        (       Relative or incremental number follows.
        )       Matched with an opening "(", ignored.
        *       Used to indicate wildcards in the filename,  extension,  or
                path.    Also   used   to  indicate  multiplication  within
                expressions.  See below.
        ,       Separates octal half-words.
        ,,      Separates octal half-words.
        .       Filename has preceded, extension (maybe null) follows.
        /       Processor switch follows
        :       Device name preceded
        ;       Terminates command scan, comments follow
        <       Initial block or cluster number preceded,  final  block  or
                cluster number follow.
        >       Same as <
        ==      Word number preceded, new contents follow (see /EC)
        =       Scratch area file spec preceded
        !       Run preceding file
        [       Path follows.
     RIPOFF - Cusp-Level Disk Service Routine                        Page 5


        ]       When matched with opening "[", ignored.
        ^       New radix  (^D,  ^O,  or  ^B)  for  next  expression,  then
                expression follow.

     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).

     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.

     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.

     Each function is covered separately below.
     RIPOFF - Cusp-Level Disk Service Routine                        Page 6


     /A - Alphabetize directories



     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:

          /A  - Same as /AF
          /AF - Sort by filename, then extension
          /AE - Sort by extension, then filename
          /AT - Sort by creation date/time
          /AM - Sort the MFD by PPN
          /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.


     Note that on all sorts except /AM, the MFD  is  avoided.   Conversely,
     /AM only sorts the MFD.

     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.



     Examples


     *DSKB:/A                ; Sort all directories on DSKB except the
                             ; MFD

     *DSKB:/AM               ; Sort the MFD of DSKB.  Note that this
                             ; can never be done with the structure
                             ; mounted.

     *DSKB:[10,*]/AE         ; Sort all the 10 project UFD's by
                             ; extension

     *DSKB:[10,12,RIPOFF,NEW]/AT ; Sort the specified directory by creation
                                 ; date/time
     RIPOFF - Cusp-Level Disk Service Routine                        Page 7


     /C - Convert disk parameters



     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:

          /CB - Convert from a structure block number
          /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.
          /CD - Convert from a structure CFP
          /CP - Convert from unit cylinder, surface, and sector
          /CT - Convert from a universal date/time.  This isn't  exactly  a
                disk parameter but it's a useful conversion anyway.
          /CU - Convert from a block number on a unit.



     Examples


     *DSKB:1234/CB           ; Convert block 1234 on DSKB

     *DSKB:102/CC            ; Convert from cluster 102 on DSKB.  Note
                             ; that the cluster number has no "#"
                             ; before it

     *DSKB:102/CD            ; Convert from CFP 102 on DSKB

     *DSKB:1<16(10)/CP       ; Convert from cylinder 1, surface 16,
                             ; sector 10 on DSKB

     *RPA1:1<16(10)/CP       ; Do the same for physical unit RPA1

     *124720,,345632/CT      ; Convert from the specified universal
                             ; date/time

     *RPA1:1234/CU           ; Convert from block 1234 on unit RPA1
     RIPOFF - Cusp-Level Disk Service Routine                        Page 8


     /D - Delete files



     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:

          /D  - Delete  the  file(s).   (Try  monitor  RENAME  first   then
                internal subroutine)
          /DM - Delete with monitor RENAME only
          /DR - Delete with internal  subroutine  only.   (Don't  even  try
                monitor RENAME)
          /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.
          /DN - Delete null directories
          /DB - Delete only those files that are bad (RIB  errors)  in  the
                specified directories
          /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.
          /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.



     Examples


     *FILE.*[7,7]/D          ; Delete ALL:FILE.EXT[7,7]

     *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

     *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,*,*,*,*,*]

     *DSKB:[7,7,FOO]/DB      ; Delete all bad files in DSKB:[7,7,FOO]

     */DB                    ; Delete all bad files in the entire system

     *DSKB:'/():-/.WRD[7,7,FOO]/D ; Delete weird file in [7,7,FOO]
     RIPOFF - Cusp-Level Disk Service Routine                        Page 9


     *DSKB:/DN               ; Delete all null directories on DSKB

     *DSKB:[10,*,*,*,*,*,*]/DN ; Delete all null directories in project 10

     *DSKB:*.TMP/DT          ; Delete all TMP files on DSKB that meet the
                             ; date/time criteria
     RIPOFF - Cusp-Level Disk Service Routine                       Page 10


     /E - Edit disk blocks



     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:

          /ER  - Read the block into core
          /EW  - Write the block back to disk
          /ERS - Read the same block as the last read/write
          /EWS - Write the same block as the last read/write
          /EC  - Change the contents of a word in the block in core
          /ET  - Type the contents of a word in octal
          /ETA - Type the contents of a word in ASCII
          /ET7 - Same as /ETA
          /ET6 - Type the contents of a word in SIXBIT
          /ETU - Type the contents of a word as though it were in universal
                 date/time format
          /ETS - Type the same word as that specified in the  last  /ET  or
                 /EC command.
          /ETL - Type the word previous to the one specified  in  the  last
                 /ET or /EC command.
          /ETN - Type the word following the one specified in the last  /ET
                 or /EC command.

     Note that the S, L, and N switches may  be  OR'ed  together  with  any
     combination of the A, 7, 6, or U format.



     Examples




     *DSKB:4027/ER           ; Read block 4027 of DSKB

     *2/ET                   ; Type word 2 of the block in octal

     */ET6                   ; Type same word in SIXBIT.  Note that /ETx
                             ; with no word number specified is the same
                             ; as /ETSx

     */ETL6                  ; Type word 1 in SIXBIT

     *0<12/ET                ; Type words 0 through 12 in octal
     RIPOFF - Cusp-Level Disk Service Routine                       Page 11


     *35/ETU                 ; Type word 35 as if it were in universal
                             ; date/time format

     *1=='/FOO//EC           ; Change word 1 to SIXBIT/FOO/.  Note that
                             ; the // is intentional

     *5==10/EC               ; Change word 5 to an octal 10

     */EWS                   ; Write the block back to the place from
                             ; which it came.  (In this example, 4027
                             ; on DSKB)
     RIPOFF - Cusp-Level Disk Service Routine                       Page 12


     /F - Find RIBs of files



     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:

          /F   - Do directory search, then structure search
          /FE  - Do only directory search.  The file exists.
          /FD  - Do only structure search;  the file has been deleted.
          /FD2 - Enable RIPOFF to find 2nd RIBs by forcing it to read every
                 block instead of every cluster.



     Examples


     *DSKB:FOO.BAZ[10,10]/FE ; Find the RIB of the specified file by doing
                             ; only a directory search

     *DSKB:FOO.BAZ[10,12,RIPOFF]/FE ; Same as above only in an SFD

     *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.
     RIPOFF - Cusp-Level Disk Service Routine                       Page 13


     /H - Type RIPOFF help file



     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:

          /H - Type the RIPOFF help file



     Examples


     */H                     ; Find the help file and type it
     RIPOFF - Cusp-Level Disk Service Routine                       Page 14


     /I - Initialize files from RIBs alone



                               ** Special Note **

     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.


     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).

     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.

     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.

     The /I options are as follows:

          /I  - Same as /ISR
          /IS - Save specified files on scratch area
          /IR - Restore specified files from scratch area
          /IP - Print directory listing of scratch area
          /ID - When OR'ed with /IS, causes RIPOFF to save only those files
                that are free in the SATs.
          /IE - When OR'ed with /IS, causes RIPOFF to save only those files
                that are marked in the SATs.
          /IA - Same as /IDE, i.e., save or restore files regardless of the
     RIPOFF - Cusp-Level Disk Service Routine                       Page 15


                SAT bits.
          /IT - Asks for date/time limits  and  only  saves/restores  files
                created  between these limits.  May be OR'ed with any other
                option.
          /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.
          /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.
          /IX - Don't   print   every   file   saved/restored,   only   the
                directories.
          /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.



     Examples


     *MTA1:=DSKB:/IS         ; Save all (see special note above)
                             ; files from DSKB on MTA1

     *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

     *MTA1:=DSKB:FOO.BAZ[10,7]/IR ; Restore FOO.BAZ to [10,7].  Note that
                                  ; MTA1 may contain a save of the entire
                                  ; structure.

     *DSKA:FOO.BAZ[1,2]=/IP  ; Print directory listing of scratch area
     RIPOFF - Cusp-Level Disk Service Routine                       Page 16


     /L - Lock RIPOFF in core



     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:

          /L  - Lock job in core
          /LU - Unlock job



     Examples


     */L                     ; Lock job in core

     */LU                    ; Unlock job
     RIPOFF - Cusp-Level Disk Service Routine                       Page 17


     /P - Print information, blocks, and files



     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:

          /PB - Print the unit's BAT blocks in octal,  then  interpret  the
                block in readable format
          /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.
          /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.
          /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".
          /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.
          /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.
          /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.
          /PU - Print physical units for each pack in a structure.
          /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.


     The block list subset consists of the following options:

          /PA - Print in ASCII format.  This option  prints  the  specified
                blocks/files  in  ASCII  and is very similar to the monitor
     RIPOFF - Cusp-Level Disk Service Routine                       Page 18


                TYPE or PRINT commands.
          /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.
          /PO - Print  in  octal.   This  option   prints   the   specified
                blocks/files  in  octal with a header for each block giving
                the block number.
          /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.
          /P6 - Print  in  SIXBIT.   This  option  prints   the   specified
                blocks/files in SIXBIT with a header for each block.
          /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.



     Examples


     *DSKB:FOO.BAZ[10,7,FOO]/PR ; Print the RIB of the specified file

     *DSKB:1234/PR           ; Print the specified block as a RIB

     *DSKB:1234<1234+5/PO    ; Print blocks 1234 through 1241 in octal

     *DSKB:FOO.*/PL          ; Find and print all files named FOO.*
                             ; on DSKB

     *10,7.UFD/PD            ; Prints ALL:[10,7] in a readable format

     *FOO.SFD[10,7]/PD       ; Prints ALL:[10,7,FOO] directories in a
                             ; readable format

     */PV                    ; Print vital statistics for all units
                             ; on the system

     *DSKB:/PB               ; Print the BAT blocks on DSKB
     RIPOFF - Cusp-Level Disk Service Routine                       Page 19


     /R - Read disk blocks



     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:

          /R - Read specified blocks



     Examples


     *DSKB:1234<4567(10)     ; Read blocks 1234 through 4567 skipping 10
                             ; blocks between each read

     *DSKB:/R                ; Read all blocks on DSKB (0 through highest
                             ; block on unit using 1 as an increment)

     *DSKB:40000/R           ; Read blocks 40000 through the highest
                             ; block on the unit using 1 as an increment
     RIPOFF - Cusp-Level Disk Service Routine                       Page 20


     /S - Manipulate SAT's



     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:

          /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.
          /SR - Read the SATs of the specified structure into core.  If you
                plan to change the SATs, do a /SL first.
          /SW - Write the in-core copy of the SATs  back  out.   Note  that
                this may not be done unless the structure is dismounted.
          /SP - Print the SAT blocks of the specified structure.   Produces
                the same type of listing as /PS
          /ST - Type the status of the SAT bits specified by the  block  or
                cluster numbers given in the command string.
          /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.
          /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.



     Examples


     *DSKB:/SL               ; Lock up DSKB and remove it 60 seconds
                             ; later

     *DSKB:5/SL              ; Lock up DSKB and remove it 5 seconds
                             ; later

     *DSKB:/SR               ; Read in the SATs

     *DSKB:1234/ST           ; Type the status of the cluster containing
                             ; block 1234

     *DSKB:#100<#200/ST      ; Type the status of clusters 100 through 200

     *DSKB:#1234/SM          ; Mark cluster 1234 in the SAT

     *DSKB:#100/SF           ; Free cluster 100 in the SAT

     *DSKB:/SW               ; Write the SATs back out to DSKB
     RIPOFF - Cusp-Level Disk Service Routine                       Page 21


     /U - Create specified UFDs/SFDs



     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:

          /U - Create the specified directories



     Examples


     *DSKB:[10,12,RIPOFF,NEW]/U ; Create all non-existent directories
                                ; in the command string

     *DSKB:[10,7]/U          ; Create the [10,7] UFD if it doesn't exist
     RIPOFF - Cusp-Level Disk Service Routine                       Page 22


     /V - Verify files



     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.

     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:

          /V  - Verify the specified files
          /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.
          /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.  
          /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.



     Examples


     *DSKB:FOO.BAZ[10,7,FOO]/V  ; Verify the integrity of the specified
                                ; file

     *DSKB:FOO.BAZ[10,7,FOO]/VA ; Verify and read all blocks of the file

     *DSKB:/VF               ; Verify all files and fix the SATs. DSKB
                             ; may not be mounted if the F option is used

     *DSKB:/VQF              ; Faster than the above example but will
                             ; not catch checksum errors
     RIPOFF - Cusp-Level Disk Service Routine                       Page 23


     /W - Do word searches



     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:

          /WM - Set search mask for the search
          /WS - Start the search
          /WT - Type current values of the search mask and search word
          /WW - Set word to be searched for



     Examples


     *777777/WM              ; Set mask for the right-half of the
                             ; word

     *606060/WW              ; Set word to be searched for to 0,,606060

     */WT                    ; Type current values of mask and word

     *DSKB:100<500/WS        ; Search blocks 100 through 500 on DSKB for
                             ; the specified pattern masked with the mask

     *DSKB:FOO.BAZ[10,7]/WS  ; Search the specified file
     RIPOFF - Cusp-Level Disk Service Routine                       Page 24


     /X - Exit and close listing files



     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:

          /X  - Exit to the monitor
          /XQ - Exit and run QUEUE



     Examples


     */X                     ; Exit to the monitor

     */XQ                    ; Exit and run QUEUE
     RIPOFF - Cusp-Level Disk Service Routine                       Page 25


     RIPOFF error messages



     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.

     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:

             Write enable?
             Proceed?

     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.

     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:

             Access files from [path]?
             Proceed?

     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.

     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:

       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)

     The right half status bits are from the monitor GETSTS UUO.  The  left
     half bits are internally defined and are as follows:

             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

     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.

     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
     RIPOFF - Cusp-Level Disk Service Routine                       Page 26


     error and software checksum error.