[comp.sources.bugs] Patches to upgrade Fsanalyze from v4.1 PL2 to v4.2

mjy@sdti.SDTI.COM (Michael J. Young) (01/21/89)

This is an official upgrade to bring fsanalyze from v4.1 PL2 to v4.2.

This version contains the following new functionality:
	1.  A new option '-n' has been added which causes fsanalyze to
	    report the pathnames of the most-fragmented files, rather
	    than just the inode numbers.  This option uses ncheck to
	    do its dirty work.  Thanks to Chip Rosenthal (chip@vector.UUCP)
	    for providing the code for this.
	2.  A new option '-t' makes it possible to specify the number
	    of files to include in the most-fragmented file list.  The
	    default is still NUMOFFEND (10).
	3.  A new option '-s' causes fsanalyze to send progress reports
	    to stderr.  This is sometimes useful when the output of fsanalyze
	    is being captured to a file or piped to another process.

Please apply the following patches to the 4.1 PL2 source and run 'make'.
Note: make sure you have applied patches 1 & 2 before applying this patch.
If you have not received the two previous patches, they may be obtained from
me at mjy@sdti.SDTI.COM.
------------------
Index: Changes
Prereq: 4.1
*** ../prev/Changes	Fri Jan 20 10:12:38 1989
--- Changes	Fri Jan 20 10:14:37 1989
***************
*** 92,94
  
     Release 4.1 contains no major changes from 3.04, but resulted from
     placing the code under SCCS.

--- 92,104 -----
  
     Release 4.1 contains no major changes from 3.04, but resulted from
     placing the code under SCCS.
+ 
+    Release 4.2 adds three new options:
+ 	'-n' causes fsanalyze to report the pathnames of the most
+ 	     fragmented files.  The pathnames are generated by
+ 	     invoking ncheck.
+ 	'-s' causes fsanalyze to report its progress on stderr.
+ 	     This is sometimes useful when the output of fsanalyze
+ 	     is being captured to a file or piped to another process.
+ 	'-t' may be used to specify how many files to report in the
+ 	     most-fragmented file list.  The default is still 10 files.

Index: Mkfile.sun
Prereq: 4.1.1.1
*** ../prev/Mkfile.sun	Fri Jan 20 10:13:59 1989
--- Mkfile.sun	Fri Jan 20 10:14:40 1989
***************
*** 1,4
! ## @(#)$Id: Mkfile.sun, V4.1.1.1 89/01/10 10:48:45 $
  ##
  ## FSANALYZE makefile
  ## Version  : 4.1.1.1 - 89/01/10 10:48:45

--- 1,4 -----
! ## @(#)$Id: Mkfile.sun, V4.2 89/01/20 10:10:40 $
  ##
  ## FSANALYZE makefile
  ## Version  : 4.2 - 89/01/20 10:10:40
***************
*** 1,7
  ## @(#)$Id: Mkfile.sun, V4.1.1.1 89/01/10 10:48:45 $
  ##
  ## FSANALYZE makefile
! ## Version  : 4.1.1.1 - 89/01/10 10:48:45
  
  ## One of the things FSANALYZE displays is a list of the most fragmented
  ## files.  OFFEND determines how many of those files to report.

--- 1,7 -----
  ## @(#)$Id: Mkfile.sun, V4.2 89/01/20 10:10:40 $
  ##
  ## FSANALYZE makefile
! ## Version  : 4.2 - 89/01/20 10:10:40
  
  ## One of the things FSANALYZE displays is a list of the most fragmented
  ## files.  OFFEND determines how many of those files to report.

Index: Mkfile.sys5
Prereq: 4.1.1.1
*** ../prev/Mkfile.sys5	Fri Jan 20 10:14:00 1989
--- Mkfile.sys5	Fri Jan 20 10:14:41 1989
***************
*** 1,4
! ## @(#)$Id: Mkfile.sys5, V4.1.1.1 89/01/10 10:48:48 $
  ##
  ## FSANALYZE makefile
  ## Version  : 4.1.1.1 - 89/01/10 10:48:48

--- 1,4 -----
! ## @(#)$Id: Mkfile.sys5, V4.2 89/01/20 10:10:43 $
  ##
  ## FSANALYZE makefile
  ## Version  : 4.2 - 89/01/20 10:10:43
***************
*** 1,7
  ## @(#)$Id: Mkfile.sys5, V4.1.1.1 89/01/10 10:48:48 $
  ##
  ## FSANALYZE makefile
! ## Version  : 4.1.1.1 - 89/01/10 10:48:48
  
  ## One of the things FSANALYZE displays is a list of the most fragmented
  ## files.  OFFEND determines how many of those files to report.

--- 1,7 -----
  ## @(#)$Id: Mkfile.sys5, V4.2 89/01/20 10:10:43 $
  ##
  ## FSANALYZE makefile
! ## Version  : 4.2 - 89/01/20 10:10:43
  
  ## One of the things FSANALYZE displays is a list of the most fragmented
  ## files.  OFFEND determines how many of those files to report.

Index: Mkfile.uport
Prereq: 4.1.1.1
*** ../prev/Mkfile.uport	Fri Jan 20 10:14:01 1989
--- Mkfile.uport	Fri Jan 20 10:14:41 1989
***************
*** 1,4
! ## @(#)$Id: Mkfile.uport, V4.1.1.1 89/01/10 10:48:51 $
  ##
  ## FSANALYZE makefile
  ## Version  : 4.1.1.1 - 89/01/10 10:48:51

--- 1,4 -----
! ## @(#)$Id: Mkfile.uport, V4.2 89/01/20 10:10:46 $
  ##
  ## FSANALYZE makefile
  ## Version  : 4.2 - 89/01/20 10:10:46
***************
*** 1,7
  ## @(#)$Id: Mkfile.uport, V4.1.1.1 89/01/10 10:48:51 $
  ##
  ## FSANALYZE makefile
! ## Version  : 4.1.1.1 - 89/01/10 10:48:51
  
  ## One of the things FSANALYZE displays is a list of the most fragmented
  ## files.  OFFEND determines how many of those files to report.

--- 1,7 -----
  ## @(#)$Id: Mkfile.uport, V4.2 89/01/20 10:10:46 $
  ##
  ## FSANALYZE makefile
! ## Version  : 4.2 - 89/01/20 10:10:46
  
  ## One of the things FSANALYZE displays is a list of the most fragmented
  ## files.  OFFEND determines how many of those files to report.

Index: Mkfile.xenix
Prereq: 4.1.1.1
*** ../prev/Mkfile.xenix	Fri Jan 20 10:14:02 1989
--- Mkfile.xenix	Fri Jan 20 10:14:42 1989
***************
*** 1,4
! ## @(#)$Id: Mkfile.xenix, V4.1.1.1 89/01/10 10:48:54 $
  ##
  ## FSANALYZE makefile
  ## Version  : 4.1.1.1 - 89/01/10 10:48:54

--- 1,4 -----
! ## @(#)$Id: Mkfile.xenix, V4.2 89/01/20 10:10:49 $
  ##
  ## FSANALYZE makefile
  ## Version  : 4.2 - 89/01/20 10:10:49
***************
*** 1,7
  ## @(#)$Id: Mkfile.xenix, V4.1.1.1 89/01/10 10:48:54 $
  ##
  ## FSANALYZE makefile
! ## Version  : 4.1.1.1 - 89/01/10 10:48:54
  
  ## One of the things FSANALYZE displays is a list of the most fragmented
  ## files.  OFFEND determines how many of those files to report.

--- 1,7 -----
  ## @(#)$Id: Mkfile.xenix, V4.2 89/01/20 10:10:49 $
  ##
  ## FSANALYZE makefile
! ## Version  : 4.2 - 89/01/20 10:10:49
  
  ## One of the things FSANALYZE displays is a list of the most fragmented
  ## files.  OFFEND determines how many of those files to report.

Index: README
Prereq: 4.1.1.2
*** ../prev/README	Fri Jan 20 10:12:47 1989
--- README	Fri Jan 20 10:14:43 1989
***************
*** 1,5
  FSANALYZE - File System Analyzer tool
! Version  : 4.1.1.2 - 88/11/30 15:53:38
  
  Author   : Michael J. Young
  USmail   : Software Development Technologies, Inc.

--- 1,5 -----
  FSANALYZE - File System Analyzer tool
! Version  : 4.2 - 89/01/20 10:10:53
  
  Author   : Michael J. Young
  USmail   : Software Development Technologies, Inc.

Index: chkfile.c
Prereq: 4.1.1.1
*** ../prev/chkfile.c	Fri Jan 20 10:14:05 1989
--- chkfile.c	Fri Jan 20 10:14:45 1989
***************
*** 1,4
! static char sccsid[] = "@(#)$Id: chkfile.c, V4.1.1.1 89/01/10 10:48:57 $";
  
  /*
   * chkfile.c - analyze file

--- 1,4 -----
! static char sccsid[] = "@(#)$Id: chkfile.c, V4.2 89/01/20 10:10:56 $";
  
  /*
   * chkfile.c - analyze file
***************
*** 2,8
  
  /*
   * chkfile.c - analyze file
!  * Version  : 4.1.1.1 - 89/01/10 10:48:57
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

--- 2,8 -----
  
  /*
   * chkfile.c - analyze file
!  * Version  : 4.2 - 89/01/20 10:10:56
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.
***************
*** 39,44
   *
   * Thu Jan  5 10:53:25 EST 1989 - Gerry Swislow (gerry@certif.UUCP),
   *    Fixed bugs in some debugging statements!
   */
  
  #include "fsconfig.h"

--- 39,47 -----
   *
   * Thu Jan  5 10:53:25 EST 1989 - Gerry Swislow (gerry@certif.UUCP),
   *    Fixed bugs in some debugging statements!
+  *
+  * Fri Jan 20 09:41:20 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Added '-s' flag
   */
  
  #include "fsconfig.h"
***************
*** 397,402
      struct dinode i_node[MAXINOPB];     /* holds a block of inodes */
      struct file_data data;              /* per-inode statistics */
  
      for (i = first_inode; i < num_inodes(fil_sys); i+=inopb(fil_sys)){
  
          /*

--- 400,409 -----
      struct dinode i_node[MAXINOPB];     /* holds a block of inodes */
      struct file_data data;              /* per-inode statistics */
  
+     if (status_flag){
+ 	fprintf (stderr, "Scanning %ld inodes...\n", (long) num_inodes(fil_sys));
+         }
+ 
      for (i = first_inode; i < num_inodes(fil_sys); i+=inopb(fil_sys)){
  
  	if (status_flag){
***************
*** 398,403
      struct file_data data;              /* per-inode statistics */
  
      for (i = first_inode; i < num_inodes(fil_sys); i+=inopb(fil_sys)){
  
          /*
           * for efficiency, read a block of i-nodes at a time

--- 405,414 -----
          }
  
      for (i = first_inode; i < num_inodes(fil_sys); i+=inopb(fil_sys)){
+ 
+ 	if (status_flag){
+ 	    fprintf (stderr, "inode %-20d\r", i);
+ 	    }
  
          /*
           * for efficiency, read a block of i-nodes at a time

Index: fragm.c
Prereq: 4.1
*** ../prev/fragm.c	Fri Jan 20 10:12:53 1989
--- fragm.c	Fri Jan 20 10:14:46 1989
***************
*** 1,4
! static char sccsid[] = "@(#)$Id: fragm.c, V4.1 88/11/16 17:29:42 $";
  
  /*
   * fragm.c - fragmentation analysis

--- 1,4 -----
! static char sccsid[] = "@(#)$Id: fragm.c, V4.2 89/01/20 10:11:04 $";
  
  /*
   * fragm.c - fragmentation analysis
***************
*** 2,8
  
  /*
   * fragm.c - fragmentation analysis
!  * Version  : 4.1 - 88/11/16 17:29:42
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

--- 2,8 -----
  
  /*
   * fragm.c - fragmentation analysis
!  * Version  : 4.2 - 89/01/20 10:11:04
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.
***************
*** 33,38
   *
   * Wed Nov 16 11:31:32 EST 1988 - M. Young (mjy@sdti.SDTI.COM),
   *    Placed under SCCS
   */
  
  /*

--- 33,41 -----
   *
   * Wed Nov 16 11:31:32 EST 1988 - M. Young (mjy@sdti.SDTI.COM),
   *    Placed under SCCS
+  *
+  * Tue Jan 10 15:50:33 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Workaround for braindamaged compiler that can't divide 0L/(long).
   */
  
  /*
***************
*** 104,111
  {
      off_t bytes_per_cyl;
  
!     bytes_per_cyl = (off_t)cyl_size * DEV_BSIZE;
!     return (file_size / bytes_per_cyl);
      }
  
  /*

--- 107,119 -----
  {
      off_t bytes_per_cyl;
  
!     if (file_size == 0){
!         return 0L;
!         }
!     else {
!         bytes_per_cyl = (off_t)cyl_size * DEV_BSIZE;
!         return (file_size / bytes_per_cyl);
!         }
      }
  
  /*

Index: fsanalyze.8
Prereq: 4.1.1.1
*** ../prev/fsanalyze.8	Fri Jan 20 10:13:36 1989
--- fsanalyze.8	Fri Jan 20 10:14:47 1989
***************
*** 5,11
  .SH SYNOPSIS
  .B fsanalyze
  [
! .B \-deiov
  [
  .B \-b#
  ] [

--- 5,11 -----
  .SH SYNOPSIS
  .B fsanalyze
  [
! .B \-deinosv
  [
  .B \-b#
  ] [
***************
*** 12,17
  .B \-c#
  ] [
  .B \-g#
  ] ]
  .B special
  [

--- 12,19 -----
  .B \-c#
  ] [
  .B \-g#
+ ] [
+ .B \-t#
  ] ]
  .B special
  [
***************
*** 93,98
  another source of file system overhead.  Expressed as an absolute number and
  a percentage of the file system size.
  .LP
  .I Fsanalyze
  also lists the 10 most fragmented inodes in the file system.
  They are listed in decreasing order of fragmentation

--- 95,101 -----
  another source of file system overhead.  Expressed as an absolute number and
  a percentage of the file system size.
  .LP
+ By default,
  .I Fsanalyze
  also lists the 10 most fragmented inodes in the file system.
  The number of files listed may be changed using the
***************
*** 95,101
  .LP
  .I Fsanalyze
  also lists the 10 most fragmented inodes in the file system.
! They are listed in decreasing order of fragmentation
  based on the absolute number of fragments.  For example a 100-block file
  that contains 40 individual fragments is 39.39% fragmented (39 seeks / 99
  potential seeks), but is listed before a 2-block file that contains 2

--- 98,107 -----
  By default,
  .I Fsanalyze
  also lists the 10 most fragmented inodes in the file system.
! The number of files listed may be changed using the
! .B \-t
! option.
! The files are listed in decreasing order of fragmentation
  based on the absolute number of fragments.  For example a 100-block file
  that contains 40 individual fragments is 39.39% fragmented (39 seeks / 99
  potential seeks), but is listed before a 2-block file that contains 2
***************
*** 139,145
  assume '#' sectors per disk cylinder -- by default, this value is
  determined by information in the superblock.
  .IP \fB\-d\fR
! display inode numbers as they are examined.  This flag makes it easy to
  chart the progress of fsanalyze through the file system.  Used mainly for
  debugging.
  .IP \fB\-e\fR

--- 145,151 -----
  assume '#' sectors per disk cylinder -- by default, this value is
  determined by information in the superblock.
  .IP \fB\-d\fR
! Display inode numbers as they are examined.  This flag makes it easy to
  chart the progress of fsanalyze through the file system.  Used mainly for
  debugging.
  .IP \fB\-e\fR
***************
*** 154,159
  .IP \fB\-i\fR
  report double and triple indirection - the inode numbers are reported for
  files that contain double and/or triple data-block indirection.
  .IP \fB\-o\fR
  overrides file system integrity checks.  The file system will be analyzed
  even if

--- 160,172 -----
  .IP \fB\-i\fR
  report double and triple indirection - the inode numbers are reported for
  files that contain double and/or triple data-block indirection.
+ .IP \fB\-n\fR
+ shows the pathname of the files in the list of most fragmented files.
+ If an inode contains multiple links, only one pathname will be displayed,
+ but the display will note that there are other links.  This option may
+ cause
+ .I fsanalyze
+ to take longer to complete.
  .IP \fB\-o\fR
  overrides file system integrity checks.  The file system will be analyzed
  even if
***************
*** 162,167
  .I fsanalyze
  may give erroneous results if used on a damaged file system, but the file
  system itself will not be affected.
  .IP \fB\-v\fR
  causes the current version number and patch level to be displayed.
  .SH EXAMPLES

--- 175,192 -----
  .I fsanalyze
  may give erroneous results if used on a damaged file system, but the file
  system itself will not be affected.
+ .IP \fB\-s\fR
+ causes
+ .I fsanalyze
+ to display progress messages on
+ .I stderr .
+ This option is useful when the output of fsanalyze is being captured to a
+ file or piped to another process.
+ .IP \fB\-t#\fR
+ causes
+ .I fsanalyze
+ to list the '#' most fragmented files in its report.  The
+ default is 10.
  .IP \fB\-v\fR
  causes the current version number and patch level to be displayed.
  .SH EXAMPLES
***************
*** 187,190
  .br
  Internet : mjy@sdti.SDTI.COM
  .SH VERSION
! 4.1.1.1 \- 88/12/14 11:07:34

--- 212,215 -----
  .br
  Internet : mjy@sdti.SDTI.COM
  .SH VERSION
! 4.2 \- 89/01/20 10:11:09

Index: fsanalyze.c
Prereq: 4.1.1.2
*** ../prev/fsanalyze.c	Fri Jan 20 10:14:07 1989
--- fsanalyze.c	Fri Jan 20 10:14:48 1989
***************
*** 1,4
! static char sccsid[] = "@(#)$Id: fsanalyze.c, V4.1.1.2 89/01/10 10:49:05 $";
  
  /*
   * fsanalyze.c - file system analyzer

--- 1,4 -----
! static char sccsid[] = "@(#)$Id: fsanalyze.c, V4.2 89/01/20 10:11:13 $";
  
  /*
   * fsanalyze.c - file system analyzer
***************
*** 2,8
  
  /*
   * fsanalyze.c - file system analyzer
!  * Version  : 4.1.1.2 - 89/01/10 10:49:05
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

--- 2,8 -----
  
  /*
   * fsanalyze.c - file system analyzer
!  * Version  : 4.2 - 89/01/20 10:11:13
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.
***************
*** 79,84
   * Mon Jan  9 13:08:04 EST 1989 - Wietse Z. Venema (wietse@wzv.UUCP),
   *    Fixed faulty test in error() which caused floating-point error
   *    when invoked on an non-existent filesystem.
   */
  
  /*

--- 79,87 -----
   * Mon Jan  9 13:08:04 EST 1989 - Wietse Z. Venema (wietse@wzv.UUCP),
   *    Fixed faulty test in error() which caused floating-point error
   *    when invoked on an non-existent filesystem.
+  *
+  * Fri Jan 20 09:40:06 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Added '-s' flag.
   */
  
  /*
***************
*** 145,151
          /*
           * no individual files to check, scan entire file system
           */
!         printf ("Analyzing file system %s...\n", special);
  
          /*
           * scan through all i-nodes in the file system

--- 148,159 -----
          /*
           * no individual files to check, scan entire file system
           */
! 	if (status_flag){
! 	    fprintf (stderr, "Analyzing file system %s...\n", special);
! 	    }
! 	else {
!             printf ("Analyzing file system %s...\n", special);
! 	    }
  
          /*
           * scan through all i-nodes in the file system

Index: fsanalyze.h
Prereq: 4.1.1.3
*** ../prev/fsanalyze.h	Fri Jan 20 10:14:09 1989
--- fsanalyze.h	Fri Jan 20 10:14:50 1989
***************
*** 1,4
! /* @(#)$Id: fsanalyze.h, V4.1.1.3 89/01/10 11:19:58 $ */
  
  /*
   * fsanalyze.h - file system analyzer header file

--- 1,4 -----
! /* @(#)$Id: fsanalyze.h, V4.2 89/01/20 10:11:16 $ */
  
  /*
   * fsanalyze.h - file system analyzer header file
***************
*** 2,8
  
  /*
   * fsanalyze.h - file system analyzer header file
!  * Version  : 4.1.1.3 - 89/01/10 11:19:58
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

--- 2,8 -----
  
  /*
   * fsanalyze.h - file system analyzer header file
!  * Version  : 4.2 - 89/01/20 10:11:16
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.
***************
*** 52,57
   * Tue Jan 10 11:19:30 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
   *    Changed format of IS_SPECIAL to prevent some braindamaged
   *    compilers from barfing on degenerate conditionals
   */
  
  #include <sys/stat.h>

--- 52,66 -----
   * Tue Jan 10 11:19:30 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
   *    Changed format of IS_SPECIAL to prevent some braindamaged
   *    compilers from barfing on degenerate conditionals
+  *
+  * Tue Jan 10 14:07:10 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Added support for displaying pathnames of most fragmented files.
+  *    Also added support for user-specified number of fragmented files
+  *    to report.  Based on code developed by Chip Rosenthal
+  *    (chip@vector.UUCP).
+  *
+  * Fri Jan 20 09:46:19 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Added '-s' flag.
   */
  
  #include <sys/stat.h>
***************
*** 120,125
   */
  struct file_data {
      int inode;                          /* i-node number */
      long total_blocks;                  /* total blocks in file (incl 
  					 * indirect blocks */
      long data_blocks;                   /* total data blocks in file */

--- 129,135 -----
   */
  struct file_data {
      int inode;                          /* i-node number */
+     char *pathname;			/* pathname of file at this inode */
      long total_blocks;                  /* total blocks in file (incl 
  					 * indirect blocks */
      long data_blocks;                   /* total data blocks in file */
***************
*** 193,199
  extern long unuseable;                  /* unuseable bytes due to external
                                           * fragmentation */
  
! extern struct file_data file_log[];     /* worst offenders */
  
  
  /*

--- 203,209 -----
  extern long unuseable;                  /* unuseable bytes due to external
                                           * fragmentation */
  
! extern struct file_data *file_log;      /* worst offenders */
  
  
  /*
***************
*** 207,212
                                           * examined */
  extern boolean override;                /* override bad fs test */
  
  
  /***************************************************************************
   *                          Function Declarations                          *

--- 217,224 -----
                                           * examined */
  extern boolean override;                /* override bad fs test */
  
+ extern boolean show_names;		/* display pathname of severly
+ 					 * fragmanted i-nodes */
  
  extern int num_fragmented;		/* number of most-fragmented files
  					 * to report */
***************
*** 208,213
  extern boolean override;                /* override bad fs test */
  
  
  /***************************************************************************
   *                          Function Declarations                          *
   ***************************************************************************/

--- 220,231 -----
  extern boolean show_names;		/* display pathname of severly
  					 * fragmanted i-nodes */
  
+ extern int num_fragmented;		/* number of most-fragmented files
+ 					 * to report */
+ 
+ extern boolean status_flag;		/* if TRUE, display progress messages
+ 					 * on stderr */
+ 
  /***************************************************************************
   *                          Function Declarations                          *
   ***************************************************************************/
***************
*** 227,232
   */
  extern daddr_t blk_no();		/* get block number from inode structure */
  extern void get_inodes();		/* fetch inode(s) */
  
  /*
   * from fragm.c

--- 245,252 -----
   */
  extern daddr_t blk_no();		/* get block number from inode structure */
  extern void get_inodes();		/* fetch inode(s) */
+ extern char *Smalloc();			/* safe malloc() */
+ extern char *Srealloc();		/* safe realloc() */
  
  /*
   * from fragm.c
***************
*** 232,237
   * from fragm.c
   */
  extern void test_fragmentation();	/* fragmentation analyzer */
  
  /*
   * from chkfile.c

--- 252,258 -----
   * from fragm.c
   */
  extern void test_fragmentation();	/* fragmentation analyzer */
+ extern long minimum_seeks();		/* mimimum number of seeks per file */
  
  /*
   * from chkfile.c

Index: fsconfig.h
Prereq: 4.1.1.3
*** ../prev/fsconfig.h	Fri Jan 20 10:14:12 1989
--- fsconfig.h	Fri Jan 20 10:14:52 1989
***************
*** 1,4
! /* @(#)$Id: fsconfig.h, V4.1.1.3 89/01/10 10:49:14 $ */
  
  /*
   * fsconfig.h - fsanalyze configuration-specific definitions

--- 1,4 -----
! /* @(#)$Id: fsconfig.h, V4.2 89/01/20 10:11:21 $ */
  
  /*
   * fsconfig.h - fsanalyze configuration-specific definitions
***************
*** 2,8
  
  /*
   * fsconfig.h - fsanalyze configuration-specific definitions
!  * Version  : 4.1.1.3 - 89/01/10 10:49:14
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

--- 2,8 -----
  
  /*
   * fsconfig.h - fsanalyze configuration-specific definitions
!  * Version  : 4.2 - 89/01/20 10:11:21
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

Index: init.c
Prereq: 4.1.1.2
*** ../prev/init.c	Fri Jan 20 10:14:14 1989
--- init.c	Fri Jan 20 10:14:53 1989
***************
*** 1,4
! static char sccsid[] = "@(#)$Id: init.c, V4.1.1.2 89/01/10 10:49:22 $";
  
  /*
   * init.c - initialization and usage code

--- 1,4 -----
! static char sccsid[] = "@(#)$Id: init.c, V4.2 89/01/20 10:11:26 $";
  
  /*
   * init.c - initialization and usage code
***************
*** 2,8
  
  /*
   * init.c - initialization and usage code
!  * Version  : 4.1.1.2 - 89/01/10 10:49:22
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

--- 2,8 -----
  
  /*
   * init.c - initialization and usage code
!  * Version  : 4.2 - 89/01/20 10:11:26
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.
***************
*** 44,49
   * Tue Jan 10 10:10:38 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
   *    Is_ok() and is_mounted() macros now work correctly, thanks to
   *    enlightenment from Mark Nudelman (UNIX386!mark).
   */
  
  #include "fsconfig.h"

--- 44,58 -----
   * Tue Jan 10 10:10:38 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
   *    Is_ok() and is_mounted() macros now work correctly, thanks to
   *    enlightenment from Mark Nudelman (UNIX386!mark).
+  *
+  * Tue Jan 10 14:09:13 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Added support to display pathnames of most fragmented files.
+  *    Also added flag to support user-specified number of fragmented
+  *    files to report. Based on code developed by Chip Rosenthal
+  *    (chip@vector.UUCP).
+  *
+  * Fri Jan 20 09:42:14 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Added '-s' flag.
   */
  
  #include "fsconfig.h"
***************
*** 81,86
                                           * examined */
  boolean override      = FALSE;          /* override bad fs test */
  
  /*
   * version : prints out the current version of fsanalyze
   */

--- 90,104 -----
                                           * examined */
  boolean override      = FALSE;          /* override bad fs test */
  
+ boolean show_names    = FALSE;		/* display pathname of severly
+ 					 * fragmanted i-nodes */
+ 
+ int num_fragmented    = NUMOFFEND;	/* number of most-fragmented
+ 					 * files to report */
+ 
+ boolean status_flag   = FALSE;		/* if TRUE, display progress
+ 					 * on stderr */
+ 
  /*
   * version : prints out the current version of fsanalyze
   */
***************
*** 86,92
   */
  void version(){
      printf ("\nFile System Analyzer\n");
!     printf ("Version : 4.1 - 89/01/10 10:49:22, Patch Level #%d\n", patch_level);
      }
  
  /*

--- 104,110 -----
   */
  void version(){
      printf ("\nFile System Analyzer\n");
!     printf ("Version : 4.2 - 89/01/20 10:11:26, Patch Level #%d\n", patch_level);
      }
  
  /*
***************
*** 95,101
   */
  void usage(){
      version();
!     printf ("Usage   : fsanalyze [-[deio] [-b#] [-c#] [-g#] ] special [file] ...\n");
      printf ("\nIf the [file] argument(s) are missing, the entire file system\n");
      printf ("is scanned.  Otherwise, only the specified files are examined.\n");
      printf ("Valid option are:\n\n");

--- 113,119 -----
   */
  void usage(){
      version();
!     printf ("Usage   : fsanalyze [-[deinosv] [-b#] [-c#] [-g#] [-t#] ] special [file] ...\n");
      printf ("\nIf the [file] argument(s) are missing, the entire file system\n");
      printf ("is scanned.  Otherwise, only the specified files are examined.\n");
      printf ("Valid option are:\n\n");
***************
*** 108,113
      printf ("\tg#\tassume an inter-block gap of '#' sectors;\n");
      printf ("\t\toverrides information contained in superblock.\n");
      printf ("\ti\treport data block double and triple indirection\n");
      printf ("\to\toverride error checking on file system argument\n");
      printf ("\tv\tdisplay current version number and patch level\n");
      exit(1);

--- 126,132 -----
      printf ("\tg#\tassume an inter-block gap of '#' sectors;\n");
      printf ("\t\toverrides information contained in superblock.\n");
      printf ("\ti\treport data block double and triple indirection\n");
+     printf ("\tn\tdisplay pathnames of most fragmented files.\n");
      printf ("\to\toverride error checking on file system argument\n");
      printf ("\ts\tdisplay progress messages on stderr\n");
      printf ("\tt#\tnumber of most-fragmented files to be reported\n");
***************
*** 109,114
      printf ("\t\toverrides information contained in superblock.\n");
      printf ("\ti\treport data block double and triple indirection\n");
      printf ("\to\toverride error checking on file system argument\n");
      printf ("\tv\tdisplay current version number and patch level\n");
      exit(1);
      }

--- 128,135 -----
      printf ("\ti\treport data block double and triple indirection\n");
      printf ("\tn\tdisplay pathnames of most fragmented files.\n");
      printf ("\to\toverride error checking on file system argument\n");
+     printf ("\ts\tdisplay progress messages on stderr\n");
+     printf ("\tt#\tnumber of most-fragmented files to be reported\n");
      printf ("\tv\tdisplay current version number and patch level\n");
      exit(1);
      }
***************
*** 223,229
  int argc;
  char *argv[];
  {
!     int i;                             /* loop counter */
      char *cp;                          /* cmd-line flag pointer */
      boolean special_found = FALSE;     /* TRUE = found special arg */
      boolean done;                      /* means of escaping while loop

--- 244,250 -----
  int argc;
  char *argv[];
  {
!     int i,j;                           /* loop counter */
      char *cp;                          /* cmd-line flag pointer */
      boolean special_found = FALSE;     /* TRUE = found special arg */
      boolean done;                      /* means of escaping while loop
***************
*** 300,305
                          rpt_indirects = TRUE;
                          break;
  
                          /* override bad fs test */
                      case 'o':
                          override = TRUE;

--- 321,333 -----
                          rpt_indirects = TRUE;
                          break;
  
+ 
+ 			/* display pathname of severly
+ 			 * fragmanted i-nodes */
+ 		    case 'n':
+ 			show_names = TRUE;
+ 			break;
+ 
                          /* override bad fs test */
                      case 'o':
                          override = TRUE;
***************
*** 305,310
                          override = TRUE;
                          break;
  
                      case 'v':
                          version();
  			exit(0);

--- 333,358 -----
                          override = TRUE;
                          break;
  
+ 			/* display status messages */
+ 		    case 's':
+ 			status_flag = TRUE;
+ 			break;
+ 
+ 			/* number of fragmented files to report */
+                     case 't':
+                         if (cp[1]){
+                             num_fragmented = atoi (++cp);
+                             done = TRUE;      /* force end of while loop */
+                             }
+                         else {
+                             num_fragmented = atoi (argv[++i]);
+                             }
+                         if (num_fragmented < 0){
+                             fprintf (stderr, "Illegal value for 't' option.  Assuming 0\n");
+ 			    num_fragmented = 0;
+                             }
+                         break;
+ 
                      case 'v':
                          version();
  			exit(0);
***************
*** 343,348
         cyl_size = sec_per_cyl(fil_sys);
         }
      
      return i;                /* return # of next argument to be processed */
      }
  

--- 391,406 -----
         cyl_size = sec_per_cyl(fil_sys);
         }
      
+     /*
+      * create and initialize worst-fragmented array
+      */
+     if (num_fragmented != 0){
+ 	file_log = (struct file_data *)Smalloc (num_fragmented * sizeof (struct file_data));
+ 	for (j = 0; j < num_fragmented; j++){
+ 	    init_stats (&file_log[j], 0, 0L);
+ 	    }
+ 	}
+ 
      return i;                /* return # of next argument to be processed */
      }
  
Index: patchlevel.h
Prereq: 4.1.1.2
*** ../prev/patchlevel.h	Fri Jan 20 10:14:16 1989
--- patchlevel.h	Fri Jan 20 10:14:54 1989
***************
*** 1,4
! /* @(#)$Id: patchlevel.h, V4.1.1.2 89/01/10 10:49:29 $ */
  
  /*
   * patchlevel.h - current patch level

--- 1,4 -----
! /* @(#)$Id: patchlevel.h, V4.2 89/01/20 10:11:33 $ */
  
  /*
   * patchlevel.h - current patch level
***************
*** 2,8
  
  /*
   * patchlevel.h - current patch level
!  * Version  : 4.1.1.2 - 89/01/10 10:49:29
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

--- 2,8 -----
  
  /*
   * patchlevel.h - current patch level
!  * Version  : 4.2 - 89/01/20 10:11:33
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.
***************
*** 22,26
   * =========================================================================
   */
  
! #define patch_level 2
  

--- 22,26 -----
   * =========================================================================
   */
  
! #define patch_level 0
  
Index: report.c
Prereq: 4.1.1.2
*** ../prev/report.c	Fri Jan 20 10:14:18 1989
--- report.c	Fri Jan 20 10:14:55 1989
***************
*** 1,4
! static char sccsid[] = "@(#)$Id: report.c, V4.1.1.2 89/01/10 10:49:31 $";
  
  /*
   * report.c - print analysis report

--- 1,4 -----
! static char sccsid[] = "@(#)$Id: report.c, V4.2 89/01/20 10:11:36 $";
  
  /*
   * report.c - print analysis report
***************
*** 2,8
  
  /*
   * report.c - print analysis report
!  * Version  : 4.1.1.2 - 89/01/10 10:49:31
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

--- 2,8 -----
  
  /*
   * report.c - print analysis report
!  * Version  : 4.2 - 89/01/20 10:11:36
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.
***************
*** 40,45
   * 
   * Thu Jan  5 10:31:21 EST 1989 - Rob McMahon (cudcv@warwick.ac.uk),
   *    Added conditionals for NFS file systems
   */
  
  #include "fsconfig.h"

--- 40,53 -----
   * 
   * Thu Jan  5 10:31:21 EST 1989 - Rob McMahon (cudcv@warwick.ac.uk),
   *    Added conditionals for NFS file systems
+  *
+  * Tue Jan 10 14:12:01 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Added support to display pathnames of most fragmented files.
+  *    Also permits user to specify number of most-fragmented files to report.
+  *    Based heavily on code developed by Chip Rosenthal (chip@vector.UUCP).
+  *
+  * Fri Jan 20 09:40:46 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Added '-s' flag.
   */
  
  #include "fsconfig.h"
***************
*** 46,51
  #include "fsanalyze.h"
  
  /*
   * print_report : calculates percentages and prints a summary report of
   * file system statistics
   */

--- 54,149 -----
  #include "fsanalyze.h"
  
  /*
+  * printstats : displays the statistics of the specified file.  If the
+  * argument is NULL, a page header is displayed instead.
+  */
+ void printstats(f)
+ struct file_data *f;
+ {
+     if ( f == NULL ) {
+ 	printf(" i-node  Size  Fragments   %%      Dist ");
+         }
+     else {
+ 	printf("%6d %6ld   %6ld  %6.2f%% %6.1f",
+ 	       f->inode, f->total_blocks, f->seeks+1, f->fragm*100, f->rel_cost);
+         }
+     }
+ 
+ 
+ /*
+  * get_pathnames() - find names of the most fragmented files
+  */
+ #ifndef LPNMAX
+ # define LPNMAX 128
+ #endif
+ 
+ void get_pathnames()
+ {
+     static char buf[1024], path[LPNMAX];
+     char *c;
+     int i, n;
+     FILE *pp;
+     extern char *strcpy(), *strcat(), *malloc(), *realloc();
+ 
+     if (status_flag){
+ 	fprintf (stderr, "Scanning for pathnames of most fragmented files...\n");
+         }
+ 
+     /*
+      * Initialize the pathnames list.
+      */
+     for ( i = 0 ; i < num_fragmented ; ++i ){
+ 	file_log[i].pathname = NULL;
+         }
+ 
+     (void) strcpy(buf,"ncheck -i ");
+     for ( i = 0 ; i < num_fragmented && file_log[i].inode > 0 ; ++i ) {
+ 	c = buf + strlen(buf);
+ 	(void) sprintf(c,"%d ",(int)file_log[i].inode);
+         }
+     (void) strcat(buf,special);
+ 
+     if ( (pp=popen(buf,"r")) == (FILE *) NULL ) {
+ 	perror("pipe to 'ncheck'");
+ 	return;
+         }
+ 
+     /*
+      * Sample "ncheck" output"
+      *   /dev/root:
+      *   1563	/bin/adb
+      *   2566	/bin/rmail
+      *   2566	/bin/smail
+      *   2547	/etc/fsanalyze
+      *   2583	/etc/renice
+      *   2368	/usr/lib/Llibccgi.a
+      */
+     while ( fgets(buf,sizeof buf,pp) != NULL ) {
+ 	if ( sscanf(buf,"%d %s",&n,path) != 2 || n <= 0 ){
+ 	    continue;
+ 	    }
+ 	for ( i = 0 ; i < num_fragmented ; ++i ) {
+ 	    if ( file_log[i].inode != n ){
+ 		continue;
+ 	        }
+ 	    if ( file_log[i].pathname == NULL ) {
+ 		file_log[i].pathname = Srealloc(NULL,strlen(path)+1);
+ 		(void) strcpy(file_log[i].pathname,path);
+ 	        }
+             else {
+ 		file_log[i].pathname = Srealloc(file_log[i].pathname,
+ 			strlen(file_log[i].pathname)+strlen(path)+3);
+ 		(void) strcat(file_log[i].pathname,", ");
+ 		(void) strcat(file_log[i].pathname,path);
+ 	        }
+ 	    }
+         }
+ 
+     (void) pclose(pp);
+     return;
+     }
+ 
+ /*
   * print_report : calculates percentages and prints a summary report of
   * file system statistics
   */
***************
*** 49,55
   * print_report : calculates percentages and prints a summary report of
   * file system statistics
   */
! void print_report (){
      char    minibuf[32];          /* line buffer */
      long    num_files;            /* number of inodes used
                                     * in file system */

--- 147,154 -----
   * print_report : calculates percentages and prints a summary report of
   * file system statistics
   */
! void print_report ()
! {
      char    minibuf[32];          /* line buffer */
      long    num_files;            /* number of inodes used
                                     * in file system */
***************
*** 76,81
              wasted_p;             /* wasted space due to external frag */
  
      /*
       * calculate percentages for report
       */
      fragm = potential_seeks ? (float)seeks/(float)potential_seeks : 0.0;

--- 175,186 -----
              wasted_p;             /* wasted space due to external frag */
  
      /*
+      * get names of severly fragmented files
+      */
+     if ( show_names )
+ 	get_pathnames();
+ 
+     /*
       * calculate percentages for report
       */
      fragm = potential_seeks ? (float)seeks/(float)potential_seeks : 0.0;
***************
*** 167,191
          sparse_files, sparse_p*100);
      printf ("Unused bytes in last blocks = %ld (%.2f%%)\n",
          unuseable, wasted_p*100);
!     printf ("                            %d Most Fragmented Files\n",NUMOFFEND);
!     printf (" i-node  Size  Fragments   %%      Dist  i-node  Size  Fragments   %%       Dist\n");
!     for (i = 0; i < NUMOFFEND/2; i++){
!         if (file_log[i].inode != 0){
!             printf ("%6d %6ld   %6ld  %6.2f%% %6.1f",
!                 file_log[i].inode,
!                 file_log[i].total_blocks,
!                 file_log[i].seeks+1,
!                 file_log[i].fragm*100,
!                 file_log[i].rel_cost);
!             if (file_log[i+(NUMOFFEND/2)].inode != 0){
!                 printf (" %6d %6ld   %6ld  %6.2f%%  %6.1f",
!                     file_log[i+(NUMOFFEND/2)].inode,
!                     file_log[i+(NUMOFFEND/2)].total_blocks,
!                     file_log[i+(NUMOFFEND/2)].seeks+1,
!                     file_log[i+(NUMOFFEND/2)].fragm*100,
!                     file_log[i+(NUMOFFEND/2)].rel_cost);
!                 }
!             printf ("\n");
              }
          else break;
          }

--- 272,288 -----
          sparse_files, sparse_p*100);
      printf ("Unused bytes in last blocks = %ld (%.2f%%)\n",
          unuseable, wasted_p*100);
!     if (num_fragmented != 0){
!         printf ("                            %d Most Fragmented Files\n",num_fragmented);
! 
!         if ( show_names ) {
! 	    printstats(NULL);
! 	    printf(" Pathname\n");
! 	    for ( i = 0 ; i < num_fragmented && file_log[i].inode != 0 ; i++ ) {
! 	        printstats(&file_log[i]);
! 	        printf("  %s\n", ( file_log[i].pathname != NULL ?
! 		    file_log[i].pathname : "<unknown>" ) );
! 	        }
              }
          else {
  	    printstats(NULL);
***************
*** 187,193
                  }
              printf ("\n");
              }
!         else break;
          }
      }
  

--- 284,305 -----
  		    file_log[i].pathname : "<unknown>" ) );
  	        }
              }
!         else {
! 	    printstats(NULL);
! 	    putchar(' ');
! 	    printstats(NULL);
! 	    putchar('\n');
! 	    for (i = 0 ; i < (num_fragmented+1)/2; i++){
! 		if (file_log[i].inode != 0){
! 	            printstats(&file_log[i]);
! 		    if ((i + (num_fragmented+1)/2) < num_fragmented && 
! 			file_log[i+(num_fragmented+1)/2].inode != 0){
! 			printf ("  ");
! 	                printstats(&file_log[i+(num_fragmented+1)/2]);
! 	                }
! 	            putchar('\n');
! 		    }
! 	        }
!             }
          }
      }
***************
*** 190,193
          else break;
          }
      }
- 

--- 303,305 -----
              }
          }
      }

Index: stats.c
Prereq: 4.1
*** ../prev/stats.c	Fri Jan 20 10:13:01 1989
--- stats.c	Fri Jan 20 10:14:56 1989
***************
*** 1,4
! static char sccsid[] = "@(#)$Id: stats.c, V4.1 88/11/16 17:31:26 $";
  
  /*
   * stats.c - file system statistics

--- 1,4 -----
! static char sccsid[] = "@(#)$Id: stats.c, V4.2 89/01/20 10:11:44 $";
  
  /*
   * stats.c - file system statistics
***************
*** 2,8
  
  /*
   * stats.c - file system statistics
!  * Version  : 4.1 - 88/11/16 17:31:26
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

--- 2,8 -----
  
  /*
   * stats.c - file system statistics
!  * Version  : 4.2 - 89/01/20 10:11:44
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.
***************
*** 33,38
   *
   * Wed Nov 16 11:31:32 EST 1988 - M. Young (mjy@sdti.SDTI.COM),
   *    Placed under SCCS
   */
  
  #include "fsconfig.h"

--- 33,41 -----
   *
   * Wed Nov 16 11:31:32 EST 1988 - M. Young (mjy@sdti.SDTI.COM),
   *    Placed under SCCS
+  *
+  * Tue Jan 10 15:41:38 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Support for user-specified number of most-fragmented files to report
   */
  
  #include "fsconfig.h"
***************
*** 71,77
  long unuseable           = 0;           /* unuseable bytes due to external
                                           * fragmentation */
  
! struct file_data file_log[NUMOFFEND] = {0};    /* worst offenders */
  
  /*
   * init_stats : initializes per-file statistics structure

--- 74,80 -----
  long unuseable           = 0;           /* unuseable bytes due to external
                                           * fragmentation */
  
! struct file_data *file_log = NULL;      /* worst offenders */
  
  /*
   * init_stats : initializes per-file statistics structure
***************
*** 124,130
      /*
       * update worst offender array
       */
!     for (i = 0; i < NUMOFFEND; i++){
          if (data->seeks > file_log[i].seeks){
              for (j = NUMOFFEND-1; j > i; j--){
                  file_log[j] = file_log[j-1];

--- 127,133 -----
      /*
       * update worst offender array
       */
!     for (i = 0; i < num_fragmented; i++){
          if (data->seeks > file_log[i].seeks){
              for (j = num_fragmented-1; j > i; j--){
                  file_log[j] = file_log[j-1];
***************
*** 126,132
       */
      for (i = 0; i < NUMOFFEND; i++){
          if (data->seeks > file_log[i].seeks){
!             for (j = NUMOFFEND-1; j > i; j--){
                  file_log[j] = file_log[j-1];
                  }
              file_log[i] = *data;

--- 129,135 -----
       */
      for (i = 0; i < num_fragmented; i++){
          if (data->seeks > file_log[i].seeks){
!             for (j = num_fragmented-1; j > i; j--){
                  file_log[j] = file_log[j-1];
                  }
              file_log[i] = *data;

Index: util.c
Prereq: 4.1.1.1
*** ../prev/util.c	Fri Jan 20 10:14:19 1989
--- util.c	Fri Jan 20 10:14:57 1989
***************
*** 1,4
! static char sccsid[] = "@(#)$Id: util.c, V4.1.1.1 89/01/10 10:49:39 $";
  
  /*
   * util.c - inode utilities

--- 1,4 -----
! static char sccsid[] = "@(#)$Id: util.c, V4.2 89/01/20 10:11:48 $";
  
  /*
   * util.c - inode utilities
***************
*** 2,8
  
  /*
   * util.c - inode utilities
!  * Version  : 4.1.1.1 - 89/01/10 10:49:39
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.

--- 2,8 -----
  
  /*
   * util.c - inode utilities
!  * Version  : 4.2 - 89/01/20 10:11:48
   *
   * Author   : Michael J. Young
   * USmail   : Software Development Technologies, Inc.
***************
*** 36,41
   *
   * Thu Jan  5 10:29:19 EST 1989 - Rob McMahon (cudcv@warwick.ac.uk),
   *    Added conditionals for NFS file systems
   */
  
  #include "fsconfig.h"

--- 36,45 -----
   *
   * Thu Jan  5 10:29:19 EST 1989 - Rob McMahon (cudcv@warwick.ac.uk),
   *    Added conditionals for NFS file systems
+  *
+  * Tue Jan 10 14:21:03 EST 1989 - M. Young (mjy@sdti.SDTI.COM),
+  *    Added Srealloc() and Smalloc(), based on code by Chip Rosenthal
+  *    (chip@vector.UUCP)
   */
  
  #include "fsconfig.h"
***************
*** 88,92
              /* NOTREACHED */
              }
          }
      }
  

--- 92,129 -----
              /* NOTREACHED */
              }
          }
+     }
+ 
+ /*
+  * Smalloc : safe malloc()
+  */
+ char *Smalloc(size)
+ int size;
+ {
+     char *s;
+     extern char *malloc(), *realloc();
+ 
+     s = malloc(size);
+     if ( s == NULL ) {
+ 	error (0, "malloc: out of space\n");
+         }
+     return s;
+     }
+ 
+ /*
+  * Srealloc : safe realloc()
+  */
+ char *Srealloc(ptr,size)
+ char *ptr;
+ int size;
+ {
+     char *s;
+     extern char *malloc(), *realloc();
+ 
+     s = ( ptr == NULL ? malloc(size) : realloc(ptr,size) );
+     if ( s == NULL ) {
+ 	error (0, "malloc: out of space\n");
+         }
+     return s;
      }
  
-- 
Mike Young
Software Development Technologies, Inc., Sudbury MA       Tel: +1 508 443 5779
Internet: mjy@sdti.sdti.com                 UUCP: {harvard,mit-eddie}!sdti!mjy