diff mbox series

Remove ltp/growfiles

Message ID 20250219215229.15045-1-dsterba@suse.com (mailing list archive)
State New
Headers show
Series Remove ltp/growfiles | expand

Commit Message

David Sterba Feb. 19, 2025, 9:52 p.m. UTC
This utility is not used by any current test and seems that it's never
been used in xfstests, so remove it. Appending files can be simply done
by 'xfs_io' command too.

Signed-off-by: David Sterba <dsterba@suse.com>
---
 .gitignore      |    1 -
 lib/tlibio.c    |    2 +-
 ltp/Makefile    |    2 +-
 ltp/growfiles.c | 2607 -----------------------------------------------
 4 files changed, 2 insertions(+), 2610 deletions(-)
 delete mode 100644 ltp/growfiles.c

Comments

Darrick J. Wong Feb. 19, 2025, 10:39 p.m. UTC | #1
On Wed, Feb 19, 2025 at 10:52:28PM +0100, David Sterba wrote:
> This utility is not used by any current test and seems that it's never
> been used in xfstests, so remove it. Appending files can be simply done
> by 'xfs_io' command too.
> 
> Signed-off-by: David Sterba <dsterba@suse.com>

Agreed, I have no idea what growfiles does anymore...
Reviewed-by: "Darrick J. Wong" <djwong@kernel.org>

--D

> ---
>  .gitignore      |    1 -
>  lib/tlibio.c    |    2 +-
>  ltp/Makefile    |    2 +-
>  ltp/growfiles.c | 2607 -----------------------------------------------
>  4 files changed, 2 insertions(+), 2610 deletions(-)
>  delete mode 100644 ltp/growfiles.c
> 
> diff --git a/.gitignore b/.gitignore
> index 7060f52cf6b87e..4fd817243dca37 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -50,7 +50,6 @@ tags
>  /ltp/doio
>  /ltp/fsstress
>  /ltp/fsx
> -/ltp/growfiles
>  /ltp/iogen
>  
>  # src/ binaries
> diff --git a/lib/tlibio.c b/lib/tlibio.c
> index f7259734af97c7..5b81005952119d 100644
> --- a/lib/tlibio.c
> +++ b/lib/tlibio.c
> @@ -211,7 +211,7 @@ lio_set_debug(int level)
>   * Only the first character of the string is used.
>   *
>   * This function does not provide for meaningful option arguments,
> - * but it supports current growfiles/btlk interface.
> + * but it supports current btlk interface.
>   *
>   *  (rrl 04/96)
>   ***********************************************************************/
> diff --git a/ltp/Makefile b/ltp/Makefile
> index 0611c5efe96b14..b707924c808042 100644
> --- a/ltp/Makefile
> +++ b/ltp/Makefile
> @@ -5,7 +5,7 @@
>  TOPDIR = ..
>  include $(TOPDIR)/include/builddefs
>  
> -TARGETS = doio fsstress fsx growfiles iogen
> +TARGETS = doio fsstress fsx iogen
>  SCRIPTS = rwtest.sh
>  CFILES = $(TARGETS:=.c)
>  HFILES = doio.h
> diff --git a/ltp/growfiles.c b/ltp/growfiles.c
> deleted file mode 100644
> index 7ac44aba0bede0..00000000000000
> --- a/ltp/growfiles.c
> +++ /dev/null
> @@ -1,2607 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (c) 2000 Silicon Graphics, Inc.
> - * All Rights Reserved.
> - */
> -/*
> - * This program will grow a list of files.
> - * Each file will grow by grow_incr before the same
> - * file grows twice.  Each file is open and closed before next file is opened.
> - *
> - * To just verify file contents: growfiles -g 0 -c 1 filename
> - *
> - * See help and prt_examples functions below.
> - *
> - * Basic code layout
> - *  process cmdline 
> - *  print debug message about options used
> - *  setup signal handlers
> - *  return control to user (if wanted - default action)
> - *  fork number of desired childern (if wanted)
> - *  re-exec self (if wanted)
> - *  Determine number of files
> - *  malloc space or i/o buffer
> - *  Loop until stop is set
> - *    Determine if hit iteration, time, max errors or num bytes reached
> - *    Loop through each file
> - *	open file
> - *	fstat file - to determine if file is a fifo
> - *	prealloc file space (if wanted)
> - *      growfile
> - *	check last write
> - *	check whole file
> - *	shrink file
> - *	close file
> - *	delay (if wanted)
> - *    End loop
> - *  End loop
> - *  remove all files (if wanted)
> - *
> - * Author: Richard Logan
> - *
> - */
> -
> -#include "global.h"
> -
> -#ifdef HAVE_SYS_FILE_H
> -#include <sys/file.h>
> -#endif
> -
> -#include "dataascii.h"
> -#include "random_range.h"
> -#include "databin.h"
> -#include "open_flags.h"
> -#include "forker.h"
> -#include "file_lock.h"
> -
> -extern int datapidgen(int pid, unsigned char *buffer, int bsize, int offset);
> -extern void databingen(int mode, unsigned char *buffer, int bsize, int offset);
> -extern int datapidchk(int pid, char *buffer, int bsize, int offset, char **errmsg);
> -extern int databinchk(int mode, char *buffer, int bsize, int offset, char **errmsg);
> -
> -int file_size(int fd);
> -int check_write(int fd, int cf_inter, char *filename, int mode);
> -int shrinkfile(int fd, char *filename, int trunc_incr, int trunc_inter, int just_trunc);
> -int check_file(int fd, int cf_inter, char *filename, int no_file_check);
> -int growfile(int fd, char *file, int grow_incr, unsigned char *buf);
> -int cleanup();
> -int handle_error();
> -int lkfile(int fd, int operation, int lklevel);
> -void usage();
> -void help();
> -void prt_examples(FILE *stream);
> -int set_sig();
> -void sig_handler();
> -static void notify_others();
> -int pre_alloc(char *file, int fd, int size);
> -
> -
> -#define NEWIO	1	/* Use the tlibio.c functions */
> -
> -#ifndef NEWIO
> -#define NEWIO	0	/* specifies to use original iowrite.c */
> -			/* functions instead of tlibio.c functions */
> -			/* Once it is proven tlibio.c functions work properly, */
> -			/* only tlibio.c functions will be used */
> -#else
> -#include "tlibio.h"
> -#endif
> -
> -#ifndef PATH_MAX
> -#define PATH_MAX	1023
> -#endif
> -
> -
> -#define DEF_DIR		"."
> -#define DEF_FILE	"gf"
> -
> -char *Progname;
> -int Debug  = 1;
> -
> -int Pid=0;
> -
> -int io_type = 0;			/* I/O type -sync */
> -int open_flags = O_RDWR|O_CREAT;	/* open flags */
> -
> -#define MAX_FC_READ	196608		/* 4096 * 48 - 48 blocks */
> -
> -#define PATTERN_ASCII	1	/* repeating alphabet letter pattern */
> -				/* allows multiple writers and to be checked */
> -#define PATTERN_PID	2	/* <pid><words byte offset><pid> */
> -				/* Assumes 64 bit word. Only allows single */
> -				/* process to write and check */
> -/*
> - *	1234567890123456789012345678901234567890123456789012345678901234
> - *	________________________________________________________________
> - *	<    pid       >< offset in file of this word  ><    pid       >
> - */
> -	
> -#define PATTERN_OFFSET	3	/* Like PATTERN_PID but has a fixed number */
> -				/* (STATIC_NUM) instead of pid. */
> -				/* Allows multiple processes to write/read */
> -#define PATTERN_ALT	4	/* alternating bit pattern (i.e. 0x5555555...) */
> -#define PATTERN_CHKER	5	/* checkerboard pattern (i.e. 0xff00ff00ff00...) */
> -#define PATTERN_CNTING  6	/* counting pattern (i.e. 0 - 07, 0 - 07, ...) */
> -#define PATTERN_ONES	7	/* all bits set (i.e. 0xffffffffffffff...) */
> -#define PATTERN_ZEROS	8	/* all bits cleared (i.e. 0x000000000...) */
> -#define PATTERN_RANDOM	9	/* random integers - can not be checked */
> -#define STATIC_NUM	221849	/* used instead of pid when PATTERN_OFFSET */
> -
> -#define MODE_RAND_SIZE	1	/* random write and trunc */
> -#define MODE_RAND_LSEEK	2	/* random lseek before write */
> -#define MODE_GROW_BY_LSEEK 4	/* lseek beyond end of file then write a byte */
> -#define RANDOM_OPEN	999876	/* if Open_flags set to this value, open flags */
> -				/* will be randomly choosen from Open_flags[] */
> -#define MODE_FIFO	S_IFIFO	/* defined in stat.h  0010000 */
> -
> -int num_files = 0;		/* num_auto_files + cmd line files */
> -char *filenames;		/* pointer to space containing filenames */
> -int remove_files = 0;		/* if set, cleanup default is not to cleanup */
> -int bytes_consumed = 0;		/* total bytes consumed, all files */
> -int bytes_to_consume = 0;   	/* non-zero if -B was specified, total bytes */
> -int Maxerrs = 100;		/* Max number errors before forced exit */
> -int Errors = 0;			/* number of encountered errors */
> -int Upanic_on_error = 0;	/* call upanic if error and this variable set */
> -
> -/* The *_size variables are only used when random iosize option (-r) is used */
> -int max_size=5000;
> -int min_size=1;			/* also set in option parsing */
> -int mult_size=1;		/* when random iosz, iosz must be mult of mult_size */
> -/* the *_lseek variables are only used when radon lseek option (-R) is used */
> -int min_lseek=0;		/* also set in option parsing */
> -int max_lseek=-1;		/* -1 means size of file */
> -int Pattern=PATTERN_ASCII;
> -int Seed=-1;			/* random number seed, < 0 == uninitialized  */
> -int Nseeds=0;			/* Number of seed specified by the user */
> -int *Seeds;			/* malloc'ed arrary of ints holding user spec seeds */
> -
> -int using_random=0;		/* flag indicating randomization is being used */
> -float delaysecs=0.0;		/* delay between iterations (in seconds) */
> -int delaytime;			/* delay between iterations in clocks/uses */
> -int lockfile=0;			/* if set, do file locking */
> -				/* 1 = do file locking around write, trunc */
> -				/* and reads. */
> -				/* 2 = write lock around all file operations */
> -
> -int Woffset=0;			/* offset before last write */
> -int Grow_incr=4096;		/* sz of last write */
> -int Mode=0;			/* bitmask of write/trunc mode */
> -				/* also knows if dealing with fifo */
> -char *Buffer = NULL;		/* buffer used by write and write check */
> -int Alignment=0;		/* if non word multiple, io will not be word aligned */
> -int Opid=0;			/* original pid */
> -
> -int Sync_with_others = 0;	/* Flag indicating to stop other if we stop before DONE */
> -int Iter_cnt = 0;		/* contains current iteration count value */
> -char	TagName[40];		/* name of this growfiles (see Monster)	    */
> -
> -struct fileinfo_t {
> -    char *filename;
> -    int fd;
> -    int openflags;
> -    int mode;
> -}  Fileinfo;
> -
> -/*
> - * Define open flags that will be used when '-o random' option is used.
> - * Note: If there is more than one growfiles doing its thing to the same
> - * file, O_TRUNC will cause data mismatches.  How you ask?
> - * timing of events, example:
> - *   Process one		Process two
> - *   ---------------		-------------
> - *   get write lock
> - *   fstat file
> - *   lseek
> - *   generate pattern
> - *				open with O_TRUNC 
> - *   write with wrong pattern
> - *	because offset is wrong
> - *
> - *  The second process truncated the file after the pattern was
> - *  determined, thus the pattern is wrong for the file location.
> - *
> - * There can also be a timing problem with open flag O_APPEND if
> - * file locks are not being used (-l option).  Things could happen
> - * between the fstat and the write. Thus, writing the wrong pattern.
> - * If all processes observe the file locks, O_APPEND should be ok
> - * to use.
> - */
> -int Open_flags[] = { 
> -	O_RDWR|O_CREAT,
> -	O_RDWR|O_CREAT|O_APPEND,
> -	O_RDWR|O_CREAT|O_NDELAY,
> -	O_RDWR|O_CREAT|O_SYNC,
> -	O_RDWR|O_CREAT|O_SYNC|O_NDELAY,
> -	O_RDWR|O_CREAT|O_APPEND|O_NDELAY,
> -
> -};
> -
> -#define REXEC_INIT	0	/* don't do re-exec of childern */
> -#define REXEC_DOIT	1	/* Do re-exec of childern */
> -#define REXEC_DONE	2	/* We've already been re-exec'ed */
> -
> -#ifndef BSIZE
> -#define BSIZE	512
> -#endif  /* BSIZE */
> -
> -#define USECS_PER_SEC	1000000  /* microseconds per second */
> -
> -/*
> - * Define marcos used when dealing with file locks.
> - */
> -#define LKLVL0		1	/* file lock around write/read/trunc */
> -#define LKLVL1		2	/* file lock after open to before close */
> -
> -/*
> - * Define special max lseek values
> - */
> -#define LSK_EOF       	    -1	/* set fptr up to EOF */
> -#define LSK_EOFPLUSGROW	    -2	/* set fptr up to EOF + grow - leave whole */
> -#define LSK_EOFMINUSGROW    -3	/* set fptr up to EOF-grow - no grow */
> -
> -
> -/***********************************************************************
> - * MAIN
> - ***********************************************************************/
> -int
> -main(argc, argv)
> -int argc;
> -char **argv;
> -{
> -extern char *optarg;            /* used by getopt */
> -extern int optind;
> -extern int opterr;
> -
> -int ind;
> -int first_file_ind = 0;
> -int num_auto_files = 0;		/* files created by tool */
> -int seq_auto_files = 0;		/* auto files created by tool created by tool */
> -char *auto_dir = DEF_DIR;
> -char *auto_file = DEF_FILE;
> -int grow_incr = 4096;
> -int trunc_incr = 4096;
> -int trunc_inter = 0;		/* 0 means none, */
> -int unlink_inter = 0;		/* 0 means none, 1 means always unlink */
> -int unlink_inter_ran = -1;	/* -1 -use unlink_inter, otherwise randomly choose */
> -				/* between unlink_inter and unlink_inter_ran */
> -int file_check_inter = 0;	/* 0 means never, 1 means always */
> -int write_check_inter = 1;	/* 0 means never, 1 means always */
> -int iterations = 1;		/* number of increments to be added */
> -int no_file_check = 0;		/* if set, no whole file checking will be done */
> -int num;
> -int fd;				/* file descriptor */
> -int stop = 0;			/* loop stopper if set */
> -int tmp;
> -char chr;
> -int ret;
> -int pre_alloc_space = 0;
> -int total_grow_value = 0;	/* used in pre-allocations */
> -int backgrnd = 1;		/* return control to user */
> -struct stat statbuf;
> -int time_iterval = -1;
> -time_t start_time = 0;
> -char reason[40];		/* reason for loop termination */
> -int num_procs=1;
> -int forker_mode=0;
> -int reexec=REXEC_INIT;		/* reexec info */
> -char *exec_path=NULL;
> -
> -char *strrchr();
> -
> -char *filename;                 /* name of file specified by user */
> -char *cptr;			/* temp char pointer */
> -extern int Forker_npids;	/* num of forked pid, defined in forker.c */
> -
> -
> -	if ( argv[0][0] == '-' )
> -	   reexec=REXEC_DONE;
> -	/*
> -	 * Determine name of file used to invoke this program
> -	 */
> -	if ((Progname=strrchr(argv[0], '/')) != NULL)
> -		Progname++;
> -	else
> -		Progname=argv[0];
> -
> -	TagName[0] = '\0';
> -
> -	/*
> -	 * Process options
> -	 */
> -	while ((ind=getopt(argc, argv, 
> -	    "hB:C:c:bd:D:e:Ef:g:H:I:i:lL:n:N:O:o:pP:q:wt:r:R:s:S:T:uU:W:xy")) != EOF) {
> -		switch(ind) {
> -
> -		case 'h' :
> -			help();
> -			exit(0);
> -
> -		case 'B':
> -			switch (sscanf(optarg, "%i%c",
> -				   &bytes_to_consume, &chr)) {
> -			case 1: /* noop */
> -			        break;
> -
> -			case 2:
> -				if (chr == 'b') {
> -				    bytes_to_consume *= BSIZE;
> -				} else {
> -				    fprintf(stderr,
> -					"%s%s:  --B option arg invalid\n",
> -					Progname, TagName);
> -				    usage();
> -				    exit(1);
> -				}
> -				break;
> -
> -			default:
> -				fprintf(stderr, "%s%s: --B option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -				break;
> -			}
> -
> -			break;
> -
> -		case 'E' :
> -			prt_examples(stdout);
> -			exit(0);
> -
> -		case 'b' :	/* batch */
> -			backgrnd=0;
> -			break;
> -
> -		case 'C':
> -			if (sscanf(optarg, "%i", &write_check_inter) != 1 ) {
> -				fprintf(stderr, "%s%s: --c option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -		       break;
> -
> -		case 'c':
> -			if (sscanf(optarg, "%i", &file_check_inter) != 1 ) {
> -				fprintf(stderr, "%s%s: --c option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -
> -		case 'd':
> -			auto_dir=optarg;
> -			if ( stat(auto_dir, &statbuf) == -1 ) {
> -			    if ( mkdir(auto_dir, 0777) == -1 ) {
> -				if ( errno != EEXIST ) {
> -				    fprintf(stderr,
> -				        "%s%s: Unable to make dir %s\n", 
> -				        Progname, TagName, auto_dir);
> -				    exit(1);
> -			        }
> -			    }
> -			}
> -			else {
> -			    if ( ! (statbuf.st_mode & S_IFDIR) )  {
> -				fprintf(stderr,
> -				    "%s%s: %s already exists and is not a directory\n",
> -				    Progname, TagName, auto_dir);
> -				exit(1);
> -			    }
> -			}
> -			break;
> -
> -		case 'D':
> -			if (sscanf(optarg, "%i", &Debug) != 1 ) {
> -				fprintf(stderr, "%s%s: --D option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'e':
> -			if (sscanf(optarg, "%i", &Maxerrs) != 1 ) {
> -				fprintf(stderr, "%s%s: --e option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'f':
> -			auto_file=optarg;
> -			break;
> -
> -		case 'g':
> -			if ((ret=sscanf(optarg, "%i%c", &grow_incr, &chr)) < 1 ||
> -				grow_incr < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --g option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			if ( ret == 2 ) {
> -				if ( chr == 'b' || chr == 'B' )
> -					grow_incr *= 4096;
> -				else {
> -					fprintf(stderr,
> -						"%s%s: --g option arg invalid\n",
> -						Progname, TagName);
> -					usage();
> -					exit(1);
> -				}
> -			}
> -			break;
> -
> -		case 'H':
> -			if (sscanf(optarg, "%f", &delaysecs) != 1 || delaysecs < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --H option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'i':
> -			if (sscanf(optarg, "%i", &iterations) != 1 ||
> -				iterations < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --i option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'I':
> -#if NEWIO
> -			if((io_type=lio_parse_io_arg1(optarg)) == -1 ) {
> -			    fprintf(stderr,
> -				"%s%s: --I arg is invalid, must be s, p, f, a, l, L or r.\n",
> -				Progname, TagName);
> -			    exit(1);
> -			}
> -			if( io_type & LIO_RANDOM )
> -				using_random++;
> -#else
> -			if((io_type=parse_io_arg(optarg)) == -1 ) {
> -			    fprintf(stderr,
> -				"%s%s: --I arg is invalid, must be s, p, f, a, l, L or r.\n",
> -				Progname, TagName);
> -			    exit(1);
> -			}
> -			if( io_type == 99 ) /* hold-over until tlibio.h */
> -				using_random++;
> -#endif
> -			break;
> -
> -		case 'l':
> -			lockfile++;
> -			if ( lockfile > 2 )
> -			   lockfile=2;	/* lockfile can only be 1 or 2 */
> -			break;
> -
> -		case 'L':
> -			if (sscanf(optarg, "%i", &time_iterval) != 1 ||
> -				time_iterval < 0 ) {
> -				fprintf(stderr, "%s%s: --L option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'n':
> -			if (sscanf(optarg, "%i:%i", &num_procs, &forker_mode) < 1 ||
> -                                num_procs < 0 ) {
> -
> -                                fprintf(stderr, "%s%s: --n option arg invalid\n",
> -                                        Progname, TagName);
> -                                usage();
> -                                exit(1);
> -                        }
> -
> -			break;
> -
> -		case 'N':
> -			if (sscanf(optarg, "%i", &num_auto_files) != 1 ||
> -				num_auto_files < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --N option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'O':
> -			if (sscanf(optarg, "%i", &Alignment) != 1 ||
> -				num_auto_files < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --O option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'o':
> -		        if ( strcmp(optarg, "random") == 0 ){
> -			    open_flags=RANDOM_OPEN;
> -			    using_random++;
> -
> -		        } else if ((open_flags=parse_open_flags(optarg, NULL)) == -1 ) {
> -		            fprintf(stderr, "%s%s: --o arg contains invalid flag\n",
> -				Progname, TagName);
> -		            exit(1);
> -		        }
> -		        break;
> -
> -
> -		case 'p' :	/* pre allocate space */
> -			printf("%s%s: --p is illegal option on this system\n",
> -				Progname, TagName);
> -			exit(1);
> -			break;
> -
> -		case 'P':
> -			printf("%s%s: --P is illegal option on non-cray system\n",
> -				Progname, TagName);
> -			exit(1);
> -			break;
> -
> -		case 'q':	/* file content or pattern */
> -			switch(optarg[0]) {
> -			case 'A':
> -			    Pattern = PATTERN_ALT;
> -			    break;
> -			case 'a':
> -			    Pattern = PATTERN_ASCII;
> -			    break;
> -			case 'p':
> -			    Pattern = PATTERN_PID;
> -			    break;
> -			case 'o':
> -			    Pattern = PATTERN_OFFSET;
> -			    break;
> -			case 'c':
> -			    Pattern = PATTERN_CHKER;
> -			    break;
> -			case 'C':
> -			    Pattern = PATTERN_CNTING;
> -			    break;
> -			case 'r':
> -			    Pattern = PATTERN_RANDOM;
> -			    using_random++;
> -			    break;
> -			case 'z':
> -			    Pattern = PATTERN_ZEROS;
> -			    break;
> -			case 'O':
> -			    Pattern = PATTERN_ONES;
> -			    break;
> -			default:
> -			    fprintf(stderr,
> -				"%s%s: --C option arg invalid, A, a, p, o, c, C, r, z, or 0\n",
> -				Progname, TagName);
> -			    usage();
> -			    exit(1);
> -			}
> -			break;
> -
> -		case 'R':	/* random lseek before write arg: [min-]max*/
> -			if (sscanf(optarg, "%i-%i", &min_lseek, &max_lseek) != 2 ) {
> -			    min_lseek=1;    /* same as default in define */
> -			    if (sscanf(optarg, "%i%c", &max_lseek, &chr) != 1 ) {
> -				fprintf(stderr, "%s%s: --R option arg invalid: [min-]max\n",
> -				    Progname, TagName);
> -				exit(1);
> -			    }
> -			}
> -			if ( max_lseek < LSK_EOFMINUSGROW ) {
> -			    fprintf(stderr, "%s%s: --R option, max_lseek is invalid\n",
> -				Progname, TagName);
> -                            exit(1);
> -			}
> -			Mode |= MODE_RAND_LSEEK;
> -			using_random++;
> -		        break;
> -
> -		case 'r':	/* random io size arg: [min-]max[:mult] */
> -
> -			/* min-max:mult format */
> -			if (sscanf(optarg, "%i-%i:%i%c", &min_size, &max_size,
> -							&mult_size, &chr) != 3 ) {
> -			  min_size=1;   
> -			  /* max:mult format */
> -		  	  if (sscanf(optarg, "%i:%i%c", &max_size,
> -							&mult_size, &chr) != 2 ) {
> -			    /* min-max format */
> -		    	    if (sscanf(optarg, "%i-%i%c", &min_size,
> -							&max_size, &chr) != 2 ) {
> -			      min_size=1;   
> -		      	      if (sscanf(optarg, "%i%c", &max_size, &chr) != 1 ) {
> -				fprintf(stderr,
> -				     "%s%s: --r option arg invalid: [min-]max[:mult]\n",
> -			    	Progname, TagName);
> -				exit(1);
> -		      	      }
> -		    	    }
> -		  	  }
> -			}
> -
> -			if ( max_size < 0 ) {
> -			    fprintf(stderr, "%s%s: --r option, max_size is invalid\n",
> -				Progname, TagName);
> -                            exit(1);
> -			}
> -			/*
> -			 * If min and max are the same, no randomness
> -			 */
> -			if ( min_size != max_size ) {
> -			    Mode |= MODE_RAND_SIZE;
> -			    using_random++;
> - 			}
> -		        break;
> -
> -		case 'S':
> -			if (sscanf(optarg, "%i", &seq_auto_files) != 1 ||
> -				seq_auto_files < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --S option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 's':	/* format: seed[,seed...] */
> -			
> -			/* count the number of seeds */
> -			cptr=optarg;
> -			for(Nseeds=1; *cptr ; Nseeds++) {
> -			    if ( (filename=strchr(cptr, ',')) == NULL )
> -				break;
> -			    cptr=filename;
> -			    cptr++;
> -			}
> -			Seeds=(int *)malloc(Nseeds*sizeof(int));
> -
> -			/*
> -			 * check that each seed is valid and put them in 
> -			 * the newly malloc'ed Seeds arrary.
> -			 */
> -			filename=cptr=optarg;
> -			for(Nseeds=0; *cptr; Nseeds++) {
> -			    if ( (filename=strchr(cptr, ',')) == NULL ) {
> -				if ( sscanf(cptr, "%i", &Seeds[Nseeds]) < 1 ) {
> -                                    fprintf(stderr, "%s%s: --s option arg %s invalid\n",
> -                                        Progname, TagName, cptr);
> -                                    usage();
> -                                    exit(1);
> -				}
> -				Nseeds++;
> -                                break;
> -			    }
> -
> -			    *filename='\0';
> -			    if ( sscanf(cptr, "%i", &Seeds[Nseeds]) < 1 ) {
> -                               fprintf(stderr, "%s%s: --s option arg %s invalid\n",
> -                                        Progname, TagName, cptr);
> -                                usage();
> -                                exit(1);
> -			    }
> -			    *filename=',';   /* restore string */
> -                            cptr=filename;
> -			    cptr++;
> -			}
> -			break;
> -
> -		case 't':
> -			if ((ret=sscanf(optarg, "%i%c", &trunc_incr, &chr)) < 1 ||
> -				trunc_incr < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --t option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			if ( ret == 2 ) {
> -				if ( chr == 'b' || chr == 'B' )
> -					trunc_incr *= 4096;
> -				else {
> -					fprintf(stderr,
> -						"%s%s: --t option arg invalid\n",
> -						Progname, TagName);
> -					usage();
> -					exit(1);
> -				}
> -			}
> -			break;
> -
> -		case 'T':	/* truncate interval */
> -			if (sscanf(optarg, "%i%c", &trunc_inter, &chr) != 1 ||
> -				trunc_inter < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --T option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'u':
> -			remove_files++;
> -			break;
> -
> -		case 'U':   /* how often to unlink file */
> -		       /* 
> -			* formats:   
> -			*      A-B  - randomly pick interval between A and B 
> -			*      X    - unlink file every X iteration
> -			*/
> -                       if (sscanf(optarg, "%i-%i", &unlink_inter, 
> -						&unlink_inter_ran) == 2 ) {
> -
> -			   if ( unlink_inter < 0 || unlink_inter_ran < 0 ) {
> -                                fprintf(stderr, "%s%s: --U option arg invalid\n",
> -                                        Progname, TagName);
> -                                usage();
> -                                exit(1);
> -			   }
> -			   /* ensure unlink_inter contains smaller value */
> -			   if ( unlink_inter > unlink_inter_ran ) {
> -				tmp=unlink_inter_ran;
> -				unlink_inter_ran=unlink_inter;
> -				unlink_inter=tmp;
> -			   }
> -			   using_random++;
> -
> -                       } else if (sscanf(optarg, "%i%c", &unlink_inter, &chr) != 1 ||
> -                                unlink_inter < 0 ) {
> -
> -                            fprintf(stderr, "%s%s: --U option arg invalid\n",
> -                                 Progname, TagName);
> -                            usage();
> -                            exit(1);
> -                        }
> -			break;
> -
> -	        case 'x':
> -			if ( reexec != REXEC_DONE )
> -			    reexec=REXEC_DOIT;
> -			break;
> -
> -		case 'w':
> -			Mode |= MODE_GROW_BY_LSEEK;
> -			break;
> -
> -		case 'W':
> -			sprintf( TagName, "(%.37s)", optarg );
> -			break;
> -
> -		case 'y':
> -			Sync_with_others=1;
> -			break;
> -
> -		case '?':
> -			usage();
> -			exit(1);
> -			break;
> -		}
> -	}
> -
> -	if( Debug == 1 ){
> -		cptr = getenv("TOUTPUT");
> -		if( (cptr != NULL) && (strcmp( cptr, "NOPASS" ) == 0) ){
> -			Debug = 0;
> -		}
> -	}
> -
> -	if ( Pattern == PATTERN_RANDOM ) {
> -	    no_file_check=1;
> -	    if ( write_check_inter || file_check_inter )
> -                printf("%s%s: %d Using random pattern - no data checking will be performed!\n",
> -		    Progname, TagName, (int)getpid());
> -	}
> -	else if ( max_lseek == LSK_EOFPLUSGROW || Mode & MODE_GROW_BY_LSEEK ) {
> -	    no_file_check=1;
> -
> -	    if ( file_check_inter )
> -	        printf("%s%s: %d Using random lseek beyond EOF or lseek grow,\n\
> -no whole file checking will be performed!\n", Progname, TagName, (int)getpid());
> -
> -	}
> -
> -	if ( Mode & MODE_RAND_SIZE )
> -	    grow_incr=max_size;
> -
> -	set_sig();
> -
> -	Opid=getpid();
> -	Pid=Opid;
> -
> -	if ( backgrnd ) {
> -	    if ( Debug > 1 )
> -		printf("%s: %d DEBUG2 forking, returning control to the user\n",
> -		    Progname, Opid);
> -	    background(Progname);	/* give user their prompt back */
> -	}
> -
> -	if ( Debug > 3 ) {
> -#if NEWIO
> -	    lio_set_debug(Debug-3);
> -#else
> -	    set_iowrite_debug(Debug-3);
> -#endif
> -	}
> -
> -	/*
> -	 * Print some program information here if debug is turned on to
> -	 * level 3 or higher.
> -	 */
> -
> -        if ( Debug > 2 ) {
> -	    
> -	    if (  Mode & MODE_GROW_BY_LSEEK )
> -		printf("%s: %d DEBUG lseeking past end of file, writting a \"w\"\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_OFFSET )
> -		printf("%s: %d DEBUG3 %d<byteoffset>%d per word pattern multi-writers.\n",
> -		    Progname, Pid, STATIC_NUM, STATIC_NUM);
> -	    else if ( Pattern == PATTERN_PID )
> -		printf("%s: %d DEBUG3 <pid><byteoffset><pid> per word pattern - 1 writer\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_ASCII )
> -		printf("%s: %d DEBUG3 ascii pattern (vi'able)- allows multiple writers\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_ALT )
> -		printf("%s: %d DEBUG3 alt bit pattern - allows multiple writers\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_CHKER )
> -		printf("%s: %d DEBUG3 checkerboard pattern - allows multiple writers\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_CNTING )
> -		printf("%s: %d DEBUG3 counting pattern - allows multiple writers\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_RANDOM )
> -		printf("%s: %d DEBUG3 random integer pattern - no write/file checking\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_ONES )
> -		printf("%s: %d DEBUG3 all ones pattern - allows multiple writers\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_ZEROS )
> -		printf("%s: %d DEBUG3 all zeros pattern - allows multiple writers\n",
> -		    Progname, Pid);
> -	
> -	    else
> -		printf("%s: %d DEBUG3 unknown pattern\n",
> -		    Progname, Pid);
> -	    if ( bytes_to_consume )
> -	        printf("%s: %d DEBUG3 bytes_to_consume = %d\n",
> -		    Progname, Pid, bytes_to_consume);
> -	    printf("%s: %d DEBUG3 Maxerrs = %d, pre_alloc_space = %d, filelocking = %d\n", 
> -		Progname, Pid, Maxerrs, pre_alloc_space, lockfile);
> -
> -	    printf("%s: %d DEBUG3 Debug = %d, remove files in cleanup : %d\n",
> -		Progname, Pid, Debug, remove_files);
> -
> -	    printf("%s: %d DEBUG3 Mode = %#o\n", Progname, Pid, Mode);
> -
> -	    if ( open_flags == RANDOM_OPEN )
> -	       printf("%s: %d DEBUG3 open_flags = (random), io_type = %#o\n", Progname,
> -		 Pid, io_type);
> -	    else
> -	       printf("%s: %d DEBUG3 open_flags = %#o, io_type = %#o\n", Progname,
> -		 Pid, open_flags, io_type);
> -
> -	    if ( Mode & MODE_RAND_SIZE ) {
> -	        printf("%s: %d DEBUG3 random write/trunc:  min=%d, max=%d, mult = %d\n",
> -		    Progname, Pid, min_size, max_size, mult_size);
> -	    }
> -	    else {
> -		printf("%s: %d DEBUG3 grow_incr = %d\n", 
> -		    Progname, Pid, grow_incr);
> -	    }
> -	    if ( Mode & MODE_RAND_LSEEK ) {
> -		if ( max_lseek == LSK_EOF )
> -	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=<endoffile>\n",
> -		    Progname, Pid, min_lseek);
> -		else if ( max_lseek == LSK_EOFPLUSGROW )
> -	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=<endoffile+iosize>\n",
> -		    Progname, Pid, min_lseek);
> -		else if ( max_lseek == LSK_EOFMINUSGROW )
> -	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=<endoffile-iosize>\n",
> -		    Progname, Pid, min_lseek);
> -		else
> -	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=%d\n",
> -		    Progname, Pid, min_lseek, max_lseek);
> -	    }
> -
> -	    printf("%s: %d DEBUG3 check write interval = %d, check file interval = %d\n",
> -		Progname, Pid, write_check_inter, file_check_inter);
> -
> -	    printf("%s: %d DEBUG3 trunc interval = %d, trunc_incr = %d\n",
> -		Progname, Pid, trunc_inter, trunc_incr);
> -
> -	    if ( no_file_check )
> -		printf("%s: %d DEBUG3 no whole file checking will be done\n",
> -		    Progname, Pid);
> -	    
> -	    if ( unlink_inter_ran == -1 ) {
> -		printf("%s: %d DEBUG3 unlink_inter = %d\n", 
> -		        Progname, Pid, unlink_inter);
> -	    } else {
> -		printf("%s: %d DEBUG3 unlink_inter = %d, unlink_inter_ran = %d\n", 
> -                        Progname, Pid, unlink_inter, unlink_inter_ran);
> -	    }  
> -
> -	    if ( Debug > 8 ) {
> -	       num=sizeof(Open_flags)/sizeof(int);
> -	       printf("%s: %d DEBUG9 random open flags values:\n", Progname, Pid);
> -	       for(ind=0; ind<num; ind++) {
> -		    printf("\t%#o\n", Open_flags[ind]);
> -	       }
> -	    }
> -	}  /* end of DEBUG > 2 */
> -
> -	if ( Debug > 1 && num_procs > 1 ) {
> -	    printf("%s: %d DEBUG2 about to fork %d more copies\n", Progname,
> -		Opid, num_procs-1);
> -	}
> -
> -	fflush(stdout);	/* ensure pending i/o is flushed before forking */
> -	fflush(stderr);
> -
> -	forker(num_procs, forker_mode, Progname);
> -
> -	Pid=getpid();	/* reset after the forks */
> -	/*
> -	 * If user specified random seed(s), get that random seed value.
> -	 * get random seed if it was not specified by the user.
> -	 * This is done after the forks, because pid is used to get the seed.
> -         */
> -	if ( Nseeds == 1 ) {
> -	    /*
> -	     * If only one seed specified, all processes will get that seed. 
> -	     */
> -	    Seed=Seeds[0];
> -	} else if ( Nseeds > 1 ) {
> -	    /*
> -	     * More than one seed was specified.
> -	     * The original process gets the first seed.  Each
> -	     * process will be get the next seed in the specified list.
> -	     */
> -	    if ( Opid == Pid ) {
> -		Seed=Seeds[0];
> -	    } else {
> -		/*
> -		 * If user didn't specify enough seeds, use default method.
> -		 */
> -		if ( Forker_npids >= Nseeds ) 
> -	    	    Seed=time(0) + Pid;  /* default random seed */
> -		else {
> -		    Seed=Seeds[Forker_npids];
> -		}
> -	    }
> -	} else {
> -	    /* 
> -	     * Generate a random seed based on time and pid.
> -	     * It has a good chance of being unique for each pid.
> -	     */
> -	    Seed=time(0) + Pid;  /* default random seed */
> -	}
> -
> -	random_range_seed(Seed);
> -
> -        if ( using_random && Debug > 0 )
> -	    printf("%s%s: %d DEBUG1 Using random seed of %d\n",
> -		Progname, TagName, Pid, Seed);
> -
> -	if ( unlink_inter_ran > 0 ) {
> -	    /*
> -	     * Find unlinking file interval.  This must be done after
> -	     * the seed was set.   This allows multiple copies to
> -	     * get different intervals.
> -	     */
> -	    tmp=unlink_inter;
> -	    unlink_inter=random_range(tmp, unlink_inter_ran, 1, NULL);
> -
> -	    if ( Debug > 2 )
> -		printf("%s: %d DEBUG3 Unlink interval is %d (random %d - %d)\n",
> -		    Progname, Pid, unlink_inter, tmp, unlink_inter_ran);
> -	}
> -
> -	/*
> -	 * re-exec all childern if reexec is set to REXEC_DOIT.
> -	 * This is useful on MPP systems to get the
> -	 * child process on another PE.
> -	 */
> -	if ( reexec == REXEC_DOIT && Opid != Pid ) {
> -	    if ( exec_path == NULL ) {
> -		exec_path = argv[0];
> -		/* Get space for cmd (2 extra, 1 for - and 1 fro NULL */
> -		argv[0] = (char *)malloc(strlen(exec_path) + 2);
> -		sprintf(argv[0], "-%s", exec_path);
> -	    }
> -	  
> -	    if ( Debug > 2 )
> -	        printf("%s: %d DEBUG3 %s/%d: execvp(%s, argv)\n",
> -		    Progname, Pid, __FILE__, __LINE__, argv[0]);
> -
> -	    execvp(argv[0], argv);
> -        }
> -
> -	/*** begin filename stuff here *****/
> -	/*
> -	 * Determine the number of files to be dealt with
> -	 */
> -	if ( optind == argc ) {
> -		/*
> -		 * no cmd line files, therfore, set
> -		 * the default number of auto created files
> -		 */
> -		if ( ! num_auto_files && ! seq_auto_files )
> -			num_auto_files=1;
> -	}
> -	else {
> -		first_file_ind=optind;
> -		num_files += argc-optind;
> -	}
> -
> -	if ( num_auto_files ) {
> -		num_files += num_auto_files;
> -	}
> -
> -	if ( seq_auto_files ) {
> -		num_files += seq_auto_files;
> -	}
> -
> -	/*
> -	 * get space for file names
> -	 */
> -	if ((filenames=(char *)malloc(num_files*PATH_MAX)) == NULL) {
> -		fprintf(stderr, "%s%s: %d %s/%d: malloc(%d) failed: %s\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__, num_files*PATH_MAX,
> -			strerror(errno));
> -		exit(1);
> -	}
> -
> -	/*
> -	 * fill in filename cmd files then auto files.
> -	 */
> -
> -	num=0;
> -	if ( first_file_ind ) {
> -		for(ind=first_file_ind; ind<argc; ind++, num++) {
> -			strcpy((char *)filenames+(num*PATH_MAX), argv[ind]);
> -		}
> -	}
> -
> -	/*
> -	 * construct auto filename and insert them into filenames space
> -	 */
> -	for(ind=0;ind<num_auto_files; ind++, num++) {
> -		sprintf((char *)filenames+(num*PATH_MAX), "%s/%s.%d",
> -			auto_dir, auto_file, ind);
> -	}
> -
> -	/*
> -	 * construct auto seq filenames
> -	 */
> -	for(ind=1; ind<=seq_auto_files; ind++, num++) {
> -		sprintf((char *)filenames+(num*PATH_MAX), "%s/%s%d",
> -			auto_dir, auto_file, ind);
> -	}
> -
> -/**** end filename stuff ****/
> -
> -	if ( time_iterval > 0 )
> -		start_time=time(0);
> -
> -	/*
> -	 * get space for I/O buffer
> -	 */
> -	if ( grow_incr ) {
> -		if ((Buffer=(char *)malloc(grow_incr+Alignment)) == NULL) {
> -			fprintf(stderr, "%s%s: %d %s/%d: malloc(%d) failed: %s\n",
> -				Progname, TagName, Pid, __FILE__, __LINE__, grow_incr, strerror(errno));
> -			exit(1);
> -		}
> -		if ( Alignment )
> -		Buffer = Buffer + Alignment;
> -
> -	}
> -
> -	if ( Debug > 2 ) {
> -		printf("%s: %d DEBUG3 num_files = %d\n",
> -			Progname, Pid, num_files);
> -	}
> -
> -	if ( pre_alloc_space ) {
> -		if ( iterations == 0 ) {
> -		    fprintf(stderr, "%s%s: %d %s/%d: can NOT pre-alloc and grow forever\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__);
> -		    exit(1);
> -		}
> -		if ( Mode & MODE_RAND_SIZE ) {
> -		    fprintf(stderr,
> -			"%s%s: %d %s/%d: can NOT pre-alloc and do random io size\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__);
> -		    exit(1);
> -		}
> -
> -		total_grow_value=grow_incr * iterations;
> -
> -		/*
> -		 * attempt to limit 
> -		 */
> -		if ( bytes_to_consume && bytes_to_consume < total_grow_value ) {
> -			total_grow_value=bytes_to_consume;
> -		}
> -	}
> -
> -	/*
> -	 * If delaying between iterations, get amount time to
> -	 * delaysecs in clocks or usecs.
> -	 */
> -	if ( delaysecs ) {
> -	   delaytime=(int)((float)USECS_PER_SEC * delaysecs);
> -        }
> -
> -	/*
> -	 * This is the main iteration loop.
> -	 * Each iteration, all files can  be opened, written to,
> -	 * read to check the write, check the whole file, 
> -	 * truncated, and closed.   
> -	 */
> -	for(Iter_cnt=1; ! stop ; Iter_cnt++) {
> -
> -	    if ( iterations && Iter_cnt >= iterations+1 ) {
> -		strcpy(reason, "Hit iteration value");
> -		stop=1;
> -		continue;
> -	    }
> -
> -	    if (  (time_iterval > 0) && (start_time + time_iterval < time(0)) ) {
> -		sprintf(reason, "Hit time value of %d", time_iterval);
> -		stop=1;
> -		continue;
> -	    }
> -
> -	    if ( bytes_to_consume && bytes_consumed >= bytes_to_consume) {
> -		sprintf(reason, "Hit bytes consumed value of %d", bytes_to_consume);
> -		stop=1;
> -                continue;
> -            }
> -
> -	    /*
> -	     * This loop will loop through all files.
> -	     * Each iteration, a single file can  be opened, written to,
> -	     * read to check the write, check the whole file, 
> -	     * truncated, and closed.   
> -	     */
> -	    for(ind=0; ind<num_files; ind++) {
> -
> -		fflush(stdout);
> -		fflush(stderr);
> -
> -		filename=(char *)filenames+(ind*PATH_MAX);
> -		Fileinfo.filename=(char *)filenames+(ind*PATH_MAX);
> -
> -
> -		if ( open_flags ==  RANDOM_OPEN ) {
> -		   ret=Open_flags[random_range(0, sizeof(Open_flags)/sizeof(int)-1, 1, NULL)];
> -		}
> -
> -		else
> -		   ret=open_flags;
> -
> -		Fileinfo.openflags=ret;
> -
> -		if ( Debug > 3 ) {
> -		    printf("%s: %d DEBUG3 %s/%d: %d Open filename = %s, open flags = %#o %s\n",
> -			Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename, ret, 
> -		        openflags2symbols(ret, ",", 0));
> -		} else if ( Debug > 2 ) {
> -		    printf("%s: %d DEBUG3 %s/%d: %d filename = %s, open flags = %#o\n",
> -			Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename, ret);
> -		}
> -
> -		/*
> -		 * open file with desired flags.
> -		 */
> -		if ( (fd=open(filename, ret, 0777)) == -1 ) {
> -		    fprintf(stderr,
> -                        "%s%s: %d %s/%d: open(%s, %#o, 0777) returned -1, errno:%d %s\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__, filename, ret, errno, strerror(errno));
> -			handle_error();
> -			continue;
> -		}
> -
> -		Fileinfo.fd=fd;
> -
> -		lkfile(fd, LOCK_EX, LKLVL1);   /* lock if lockfile is LKLVL1 */
> -
> -		/*
> -		 * preallocation is only done once, if specified.
> -		 */
> -		if ( pre_alloc_space ) {
> -			if (pre_alloc(filename, fd, total_grow_value) != 0 ) {
> -				cleanup();
> -				exit(2);
> -			}
> -			if ( Debug > 1 ) {
> -				printf("%s: %d DEBUG2 %s/%d: pre_allocated %d for file %s\n",
> -				    Progname, Pid, __FILE__, __LINE__, total_grow_value, filename);
> -			}
> -			lkfile(fd, LOCK_UN, LKLVL1);   /* release lock */
> -			close(fd);
> -			Iter_cnt=0;	/* reset outside loop to restart from one */
> -			continue;
> -		}
> -
> -		/*
> -		 * grow file by desired amount.
> -		 * growfile() will set the Grow_incr variable and 
> -                 * possiblly update the Mode variable indicating
> -		 * if we are dealing with a FIFO file.
> -		 */
> -
> -		if (growfile(fd, filename, grow_incr, (unsigned char *)Buffer) != 0 ) {
> -			handle_error();
> -			lkfile(fd, LOCK_UN, LKLVL1);   /* release lock */
> -			close(fd);
> -			continue;
> -		}
> -
> -		/*
> -		 * check if last write is not corrupted
> -		 */
> -		if ( check_write(fd, write_check_inter, filename,
> -							Mode) != 0 ) {
> -		    handle_error();
> -                }
> -
> -		/*
> -		 * Check that whole file is not corrupted.
> -		 */
> -		if ( check_file(fd, file_check_inter, filename,
> -						no_file_check) != 0 ) {
> -		    handle_error();
> -		}
> -
> -		/*
> -		 * shrink file by desired amount if it is time 
> -		 */
> -
> -		if ( shrinkfile(fd, filename, trunc_incr, trunc_inter, Mode) != 0 ) {
> -		    handle_error();
> -		}
> -
> -		lkfile(fd, LOCK_UN, LKLVL1);   /* release lock */
> -
> -		if ( Debug > 4 )
> -		    printf("%s: %d DEBUG5 %s/%d: %d Closing file %s fd:%d \n", 
> -			Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename, fd);
> -		close(fd);
> -
> -		/*
> -		 * Unlink the file if that is desired
> -		 */
> -		if ( unlink_inter && (Iter_cnt % unlink_inter == 0) ) {
> -		
> -		    if ( Debug > 4 )
> -			printf("%s: %d DEBUG5 %s/%d: %d Unlinking file %s\n", 
> -			    Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename);
> -
> -		    unlink(filename);
> -		}
> -
> -	        /*
> -	         * delay while staying active for "delaysecs" seconds.
> -	         */
> -	        if ( delaytime ) {
> -		
> -		    int ct, end;
> -		    struct timeval curtime;
> -		    gettimeofday(&curtime, NULL);
> -		    ct=curtime.tv_sec*USECS_PER_SEC + curtime.tv_usec;
> -		    end=ct+delaytime;
> -                    while ( ct < end ) {
> -
> -		        gettimeofday(&curtime, NULL);
> -		        ct=curtime.tv_sec*USECS_PER_SEC + curtime.tv_usec;
> -		    }
> -	        }
> -	    }
> -	    /*
> -	     * if Iter_cnt == 0, then we pre allocated space to all files
> -	     * and we are starting outside loop over.  Set pre_alloc_space
> -	     * to zero otherwise we get in infinite loop
> -	     */
> -	    if ( Iter_cnt == 0 ) {
> -		pre_alloc_space=0;
> -	    }
> -	}   /* end iteration for loop */
> -
> -
> -        if ( Debug ) {
> -	    printf("%s%s: %d %s/%d: DONE %d iterations to %d files. %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, num_files, reason);
> -	}
> -	fflush(stdout);
> -	fflush(stderr);
> -
> -	cleanup();
> -
> -	if ( Errors ) {
> -		if ( Debug > 2 ) {
> -		    printf("%s%s: %d DEBUG3 %d error(s) encountered\n",
> -			Progname, TagName, Pid, Errors);
> -		    printf("%s%s: %d DEBUG3 %s/%d: exiting with value of 1\n", Progname, TagName, Pid, __FILE__, __LINE__);
> -		}
> -		exit(1);
> -	}
> -	if ( Debug > 2 )
> -	    printf("%s%s: %d DEBUG3 %s/%d: no errors, exiting with value of 0\n", Progname, TagName, Pid, __FILE__, __LINE__);
> -	exit(0);
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -set_sig()
> -{
> -   int sig;
> -
> -	
> -        /*
> -         * now loop through all signals and set the handlers
> -         */
> -
> -        for (sig = 1; sig < NSIG; sig++) {
> -            switch (sig) {
> -                case SIGKILL:
> -                case SIGSTOP:
> -                case SIGCONT:
> -#ifdef SIGCKPT
> -	        case SIGCKPT:
> -#endif /* SIGCKPT */
> -#ifdef SIGRESTART
> -	        case SIGRESTART:
> -#endif /* SIGRESTART */
> -                case SIGCHLD:
> -                    break;
> -
> -                default:
> -                    signal(sig, sig_handler);
> -                break;
> -            }
> -        } /* endfor */
> -
> -
> -        return 0;
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -void
> -sig_handler(sig)
> -int sig;
> -{
> -    int exit_stat = 2;
> -
> -    if ( sig == SIGUSR2 ) {
> -	fprintf(stdout, "%s%s: %d %s/%d: received SIGUSR2 (%d) - stopping.\n",
> -	    Progname, TagName, Pid, __FILE__, __LINE__, sig);
> -        signal(sig, sig_handler);	/* allow us to get this signal more than once */
> -        
> -    } else if( sig == SIGINT ){
> -	/* The user has told us to cleanup, don't pretend it's an error. */
> -	exit_stat=0;
> -	if ( Debug != 0 ){
> -		fprintf(stderr, "%s%s: %d %s/%d: received unexpected signal: %d\n", Progname, TagName,
> -		    Pid, __FILE__, __LINE__, sig);
> -	}
> -    } else {
> -	fprintf(stderr, "%s%s: %d %s/%d: received unexpected signal: %d\n", Progname, TagName,
> -	    Pid, __FILE__, __LINE__, sig);
> -    }
> -
> -    notify_others();
> -    cleanup();
> -    if ( Debug > 2 ){
> -	printf("%s%s: %d DEBUG3 %s/%d: Exiting with a value of %d\n",
> -	       Progname, TagName, Pid, __FILE__, __LINE__, exit_stat);
> -    }
> -    exit(exit_stat);
> -}
> -
> -/***********************************************************************
> - * this function attempts to send SIGUSR2 to other growfiles processes
> - * telling them to stop.
> - *  
> - ***********************************************************************/
> -static void
> -notify_others()
> -{
> -    static int send_signals = 0;
> -    int ind;
> -    extern int Forker_pids[];
> -    extern int Forker_npids;
> -
> -    if ( Sync_with_others && send_signals == 0 ) {
> -
> -	send_signals=1; /* only send signals once */
> -
> -        for (ind=0; ind< Forker_npids; ind++) {
> -	    if ( Forker_pids[ind] != Pid ) {
> -	        if ( Debug > 1 )
> -		    printf("%s%s: %d DEBUG2 %s/%d: Sending SIGUSR2 to pid %d\n",
> -		        Progname, TagName, Pid, __FILE__, __LINE__, Forker_pids[ind]);
> -	        kill(Forker_pids[ind], SIGUSR2);
> -	    }
> -        }
> -    }
> -
> -}
> -
> -/***********************************************************************
> - * this function will count the number of errors encountered.
> - * This function will call upanic if wanted or cleanup and
> - * and exit is Maxerrs were encountered.
> - ***********************************************************************/
> -int
> -handle_error()
> -{
> -    Errors++;
> -
> -    if ( Maxerrs && Errors >= Maxerrs ) {
> -	printf("%s%s: %d %s/%d: %d Hit max errors value of %d\n", 
> -	    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, Maxerrs);
> -	notify_others();
> -	cleanup();
> -
> -        if ( Debug > 2 ) {
> -            printf("%s%s: %d DEBUG3 %d error(s) encountered\n",
> -                        Progname, TagName, Pid, Errors);
> -            printf("%s%s: %d DEBUG3 %s/%d: exiting with value of 1\n", Progname, TagName, Pid, __FILE__, __LINE__);
> -        }
> -
> -	exit(1);
> -    }
> -
> -    return 0;
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -cleanup()
> -{
> -    int ind;
> -
> -	if ( remove_files ) {
> -	    if ( Debug > 2 )
> -		printf("%s: %d DEBUG3 Removing all %d files\n", 
> -		    Progname, Pid, num_files);
> -	    for(ind=0; ind<=num_files; ind++) {
> -		unlink(filenames+(ind*PATH_MAX));
> -	    }
> -	}
> -	if ( using_random && Debug > 1 )
> -	    printf("%s%s: %d DEBUG2 Used random seed: %d\n",
> -		Progname, TagName, Pid, Seed);
> -	return 0;
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -void
> -usage()
> -{
> -	fprintf(stderr,
> -	"Usage: %s%s [-bhEluy][[-g grow_incr][-i num][-t trunc_incr][-T trunc_inter]\n",
> -	Progname, TagName );
> -	fprintf(stderr,
> -	"[-d auto_dir][-e maxerrs][-f auto_file][-N num_files][-w][-c chk_inter][-D debug]\n");
> -	fprintf(stderr,
> -	"[-s seed][-S seq_auto_files][-p][-P PANIC][-I io_type][-o open_flags][-B maxbytes]\n");
> -	fprintf(stderr,
> -	"[-r iosizes][-R lseeks][-U unlk_inter][-W tagname] [files]\n");
> -
> -	return;
> -
> -}	/* end of usage */
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -void
> -help()
> -{
> -	usage();
> -
> -fprintf(stdout, "\
> -  -h             Specfied to print this help and exit.\n\
> -  -b             Specfied to execute in sync mode.(def async mode)\n\
> -  -B maxbytes    Max bytes to consume by all files.  growfiles exits when more\n\
> -                 than maxbytes have been consumed. (def no chk)  If maxbytes ends\n\
> -                 with the letter 'b', maxbytes is multiplied by BSIZE\n\
> -  -C write_chk   Specifies how often to check the last write (default 1)\n\
> -  -c file_chk    Specifies how often to check whole file (default 0)\n\
> -  -d auto_dir    Specifies the directory to auto created files. (default .)\n\
> -  -D debug_lvl   Specifies the debug level (default 1)\n\
> -  -E             Print examples and exit\n\
> -  -e errs        The number errors that will terminate this program (def 100)\n\
> -  -f auto_file   Specifies the base filename files created. (default \"gf\")\n\
> -  -g grow_incr   Specfied to grow by incr for each num. (default 4096)\n\
> -                 grow_incr may end in b for blocks\n\
> -		 If -r option is used, this option is ignored and size is random\n\
> -  -H delay       Amount of time to delay between each file (default 0.0)\n\
> -  -I io_type Specifies io type: s - sync, p - polled async, a - async (def s)\n\
> -		 l - listio sync, L - listio async, r - random\n\
> -  -i iteration   Specfied to grow each file num times. 0 means forever (default 1)\n\
> -  -l             Specfied to do file locking around write/read/trunc\n\
> -		 If specified twice, file locking after open to just before close\n\
> -  -L time        Specfied to exit after time secs, must be used with -i.\n\
> -  -N num_files   Specifies the number of files to be created.\n\
> -                 The default is zero if cmd line files.\n\
> -                 The default is one if no cmd line files.\n\
> -  -n num_procs   Specifies the number of copies of this cmd.\n\
> -  -o op_type     Specifies open flages: (def O_RDWR,O_CREAT) op_type can be 'random'\n\
> -  -O offset      adjust i/o buffer alignment by offset bytes\n\
> -  -P PANIC       Specifies to call upanic on error.\n\
> -  -p             Specifies to pre-allocate space\n\
> -  -q pattern     pattern can be a - ascii, p - pid with boff, o boff (def)\n\
> -		 A - Alternating bits, r - random, O - all ones, z - all zeros,\n\
> -		 c - checkboard, C - counting\n\
> -  -R [min-]max   random lseek before write and trunc, max of -1 means filesz,\n\
> -		 -2 means filesz+grow, -3 filesz-grow. (min def is 0)\n\
> -  -r [min-]max   random io write size (min def is 1)\n\
> -  -S seq_auto_files Specifies the number of seqental auto files (default 0)\n\
> -  -s seed[,seed...] Specifies the random number seed (default time(0)+pid)\n\
> -  -t trunc_incr  Specfied the amount to shrink file. (default 4096)\n\
> -                 trunc_inter may end in b for blocks\n\
> -		 If -R option is used, this option is ignored and trunc is random\n\
> -  -T trunc_inter Specfied the how many grows happen before shrink. (default 0)\n\
> -  -u             unlink files before exit\n\
> -  -U ui[-ui2]    Unlink files each ui iteration (def 0)\n\
> -  -w             Specfied to grow via lseek instead of writes.\n\
> -  -W tag-name	 Who-am-i.  My Monster tag name.  (used by Monster).\n\
> -  -x		 Re-exec children before continuing - useful on MPP systems\n\
> -  -y             Attempt to sync copies - if one fails it will send sigusr2 to others\n\
> -  Action to each file every iteration is open, write, write check\n\
> -  file check, trunc and closed.\n");
> -
> -	return;
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -void
> -prt_examples(FILE *stream)
> -{
> -	/* This example creates 200 files in directory dir1.  It writes */
> -	/* 4090 bytes 100 times then truncates 408990 bytes off the file */
> -	/* The file contents are checked every 1000 grow. */
> -    fprintf(stream,
> -	 "# run forever: writes of 4090 bytes then on every 100 iterval\n\
> -# truncate file by 408990 bytes.  Done to 200 files in dir1.\n\
> -%s -i 0 -g 4090 -T 100 -t 408990 -l -C 10 -c 1000 -d dir1 -S 200\n\n", Progname);
> -
> -	/* same as above with 5000 byte grow and a 499990 byte tuncate */
> -    fprintf(stream,
> -	 "# same as above with writes of 5000 bytes and truncs of 499990\n\
> -%s -i 0 -g 5000 -T 100 -t 499990 -l -C 10 -c 1000 -d dir2 -S 200\n\n", Progname);
> -
> -	/* This example beats on opens and closes */
> -    fprintf(stream,
> -	 "# runs forever: beats on opens and closes of file ocfile - no io\n\
> -%s -i 0 -g 0 -c 0 -C 0 ocfile\n\n", Progname);
> -
> -    fprintf(stream,
> -	 "# writes 4096 to files until 50 blocks are written\n\
> -%s -i 0 -g 4096 -B 50b file1 file2\n\n", Progname);
> -	
> -    fprintf(stream,
> -	 "# write one byte to 750 files in gdir then unlinks them\n\
> -%s -g 1 -C 0 -d gdir -u -S 750\n\n", Progname);
> -
> -    fprintf(stream,
> -	"# run 30 secs: random iosize, random lseek up to eof\n\
> -%s -r 1-5000 -R 0--1 -i 0 -L 30 -C 1 g_rand1 g_rand2\n\n", Progname);
> -
> -    fprintf(stream,
> -	"# run 30 secs: grow by lseek then write single byte, trunc every 10 itervals\n\
> -%s -g 5000 -wlu -i 0 -L 30 -C 1 -T 10  g_sleek1 g_lseek2\n\n", Progname);
> -
> -    fprintf(stream, 
> -	"# run forever: 5 copies of random iosize, random lseek to beyond eof,\n\
> -# rand io types doing a trunc every 5 iterations, with unlinks.\n\
> -%s -i0 -r 1-50000 -R 0--2 -I r -C1 -l -n5 -u -U 100-200 gf_rana gf_ranb\n\n", 
> -	    Progname);
> -
> -    fprintf(stream, 
> -	"# run forever: 5 copies of random iosize, random lseek to beyond eof,\n\
> -# random open flags, rand io types doing a trunc every 10 iterations.\n\
> -%s -i0 -r 1-50000 -R 0--2 -o random -I r -C0 -l -T 20 -uU100-200 -n 5 gf_rand1 gf_rand2\n", 
> -	    Progname);
> -
> -
> -	return;
> -}
> -
> -/***********************************************************************
> - *
> - * The file descriptor current offset is assumed to be the end of the
> - * file.  
> - * Woffset will be set to the offset before the write.
> - * Grow_incr will be set to the size of the write or lseek write.
> - ***********************************************************************/
> -int
> -growfile(fd, file, grow_incr, buf)
> -int fd;
> -char *file;
> -int grow_incr;
> -unsigned char *buf;
> -{
> -   int noffset;
> -   int ret;
> -   /* REFERENCED */
> -   int cur_offset;
> -   char *errmsg;
> -   int fsize;		/* current size of file */
> -   int size_grew;	/* size the file grew */
> -   struct stat stbuf;
> -   int tmp = 0;
> -
> -        /*
> -         * Do a stat on the open file.
> -         * If the file is a fifo, set the bit in Mode variable.
> -         * This fifo check must be done prior to growfile() returning.
> -	 * Also get the current size of the file.
> -         */
> -        if ( fstat(fd, &stbuf) != -1 ) {
> -            if ( S_ISFIFO(stbuf.st_mode) ) {
> -		Fileinfo.mode |= MODE_FIFO;
> -                Mode |= MODE_FIFO;
> -                if ( Debug > 3 )
> -                    printf("%s: %d DEBUG4 %s/%d: file is a fifo - no lseek or truncs,\n",
> -                        Progname, Pid, __FILE__, __LINE__);
> -            }
> -	    fsize = stbuf.st_size;
> -
> -        } else {
> -	    fprintf(stderr, "%s%s: %d %s/%d: Unable to fstat(%d, &buf), errno:%d %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, fd, errno, strerror(errno));
> -
> -	    return -1;
> -	}
> -
> -
> -        if ( grow_incr <= 0 ) {   /* don't attempt i/o if grow_incr <= 0 */ 
> -
> -	    Grow_incr=grow_incr;
> -	    if ( Debug > 2 )
> -		printf("%s: %d DEBUG3 %s/%d: Not attempting to grow, growsize == %d\n",
> -		    Progname, Pid, __FILE__, __LINE__, grow_incr);
> -	    return grow_incr;
> -	}
> -
> -	if ( Mode & MODE_RAND_SIZE ) {
> -	    grow_incr=random_range(min_size, max_size, mult_size, &errmsg);
> -	    if (errmsg != NULL) {
> -		fprintf(stderr, "%s%s: %d %s/%d: random_range() failed - %s\n", Progname, TagName, Pid, __FILE__, __LINE__, errmsg);
> -		return -1;
> -	    }
> -	    Grow_incr=grow_incr;
> -	}
> -	else
> -	    Grow_incr=grow_incr;
> -
> -	if ( ! (Mode & MODE_FIFO) ) {
> -	    if ((cur_offset=lseek(fd,0,SEEK_CUR)) == -1 ) {
> -	        fprintf(stderr, "%s%s: %d %s/%d: tell failed: %s\n",
> -		    Progname, TagName, Pid, __FILE__, __LINE__, strerror(errno));
> -	        return -1;
> -	    }
> -        }
> -
> -	if ( Mode & MODE_GROW_BY_LSEEK ) {
> -                Woffset=fsize;
> -		if ( Debug > 2 ) {
> -		    printf("%s: %d DEBUG3 %s/%d: Current size of file is %d\n", Progname,
> -			Pid, __FILE__, __LINE__, Woffset);
> -		    printf("%s: %d DEBUG3 %s/%d: lseeking to %d byte with SEEK_END\n", Progname,
> -			Pid, __FILE__, __LINE__, grow_incr-1);
> -		}
> -
> -		if ((noffset=lseek(fd, grow_incr-1, SEEK_END)) == -1 ) {
> -			fprintf(stderr, "%s%s: %s/%d: lseek(fd, %d, SEEK_END) failed: %s\n",
> -				Progname, TagName, __FILE__, __LINE__, grow_incr-1, strerror(errno));
> -			return -1;
> -		}
> -
> -		lkfile(fd, LOCK_EX, LKLVL0);	 /* get exclusive lock */
> -		
> -#if NEWIO
> -		ret=lio_write_buffer(fd, io_type, "w", 1, SIGUSR1, &errmsg,0);
> -#else
> -		ret=write_buffer(fd, io_type, "w", 1, 0, &errmsg); 
> -#endif
> -
> -		if ( ret != 1 ) {
> -			fprintf(stderr, "%s%s: %d %s/%d: %d %s\n", 
> -			    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
> -			if ( ret == -ENOSPC ) {
> -				cleanup();
> -				exit(2);
> -			}
> -		}
> -/***
> -		write(fd, "w", 1);
> -****/
> -
> -		lkfile(fd, LOCK_UN, LKLVL0);
> -
> -                if ( Debug > 2 )
> -                    printf("%s: %d DEBUG3 %s/%d: %d wrote 1 byte to file\n",
> -                            Progname, Pid, __FILE__, __LINE__, Iter_cnt);
> -
> -	} else {  /* end of grow by lseek */
> -
> -		if ( Fileinfo.openflags & O_APPEND ) {
> -		   /*
> -		    * Deal with special case of the open flag containing O_APPEND.
> -		    * If it does, the current offset does not matter since the write
> -		    * will be done end of the file.
> -		    */
> -		    if ( Debug > 4 )
> -			printf("%s: %d DEBUG5 %s/%d: dealing with O_APPEND condition\n",
> -			    Progname, Pid, __FILE__, __LINE__ );
> -		    lkfile(fd, LOCK_EX, LKLVL0);	 /* get exclusive lock */
> -
> -		    /*
> -		     * do fstat again to get size of the file.
> -		     * This is done inside a file lock (if locks are being used).
> -		     */
> -        	    if ( fstat(fd, &stbuf) != -1 ) {
> -            		Woffset = stbuf.st_size;
> -        	    } else {
> -            		fprintf(stderr, "%s%s: %d %s/%d: Unable to fstat(%d, &buf), errno:%d %s\n",
> -                	Progname, TagName, Pid, __FILE__, __LINE__, fd, errno, strerror(errno));
> -	
> -			lkfile(fd, LOCK_UN, LKLVL0);     /* release lock */
> -            		return -1;
> -        	    }
> -		    if ( Debug > 2 )
> -			printf("%s: %d DEBUG3 %s/%d: dealing with O_APPEND condition (offset:fsz:%d)\n",
> -			    Progname, Pid, __FILE__, __LINE__, (int)stbuf.st_size);
> -
> -
> -		} else if ( Mode & MODE_RAND_LSEEK ) {
> -                   if ( max_lseek == LSK_EOF ) {	/* within file size */
> -                        noffset=random_range(min_lseek, fsize, 1, NULL);
> -                   }		
> -		   else if ( max_lseek == LSK_EOFPLUSGROW ) {	
> -		        /* max to beyond file size */
> -			noffset=random_range(min_lseek, fsize+grow_incr, 1, NULL);
> -		   }
> -		   else if ( max_lseek == LSK_EOFMINUSGROW ) {	
> -		        /* 
> -			 * Attempt to not grow the file.
> -			 * If the i/o will fit from min_lseek to EOF,
> -			 * pick offset to allow it to fit.
> -			 * Otherwise, pick the min_lseek offset and grow
> -			 * file by smallest amount.
> -			 * If min_lseek is != 0, there will be a problem
> -			 * with whole file checking if file is ever smaller
> -			 * than min_lseek.
> -			 */
> -			if ( fsize <= min_lseek + grow_incr )
> -			    noffset=min_lseek;  /* file will still grow */
> -			else
> -			    noffset=random_range(min_lseek, fsize-grow_incr, 1, NULL);
> -		   }
> -                   else {
> -                        noffset=random_range(min_lseek, max_lseek, 1, NULL);
> -                   }
> -
> -		   if ((Woffset=lseek(fd, noffset, SEEK_SET)) == -1 ) {
> -                        fprintf(stderr, "%s%s: %d %s/%d: lseek(%d, %d, SEEK_SET) l2 failed: %s\n",
> -                                Progname, TagName, Pid, __FILE__, __LINE__, fd, noffset, strerror(errno));
> -                        return -1;
> -		   }
> -                   else if ( Debug > 2 )
> -                        printf("%s: %d DEBUG3 %s/%d: lseeked to random offset %d (fsz:%d)\n",
> -                            Progname, Pid, __FILE__, __LINE__, Woffset,
> -			    (int)stbuf.st_size);
> -
> -                }
> -
> -		/*
> -		 * lseek to end of file only if not fifo
> -		 */
> -		else if ( ! (Mode & MODE_FIFO) ) {
> -		    if ((Woffset=lseek(fd, 0, SEEK_END)) == -1 ) {
> -			fprintf(stderr, "%s%s: %d %s/%d: lseek(fd, 0, SEEK_END) failed: %s\n",
> -				Progname, TagName, Pid, __FILE__, __LINE__, strerror(errno));
> -			return -1;
> -		    }
> -                    else if ( Debug > 2 )
> -                        printf("%s: %d DEBUG3 %s/%d: lseeked to end of file, offset %d\n",
> -                            Progname, Pid, __FILE__, __LINE__, Woffset);
> -		}
> -
> -		if ( Pattern == PATTERN_OFFSET )
> -		    datapidgen(STATIC_NUM, buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_PID )
> -		    datapidgen(Pid, buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_ASCII )
> -		    dataasciigen(NULL, (char *)buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_RANDOM )
> -		    databingen('r', buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_ALT )
> -		    databingen('a', buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_CHKER )
> -		    databingen('c', buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_CNTING )
> -		    databingen('C', buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_ZEROS )
> -		    databingen('z', buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_ONES )
> -		    databingen('o', buf, grow_incr, Woffset);
> -		else
> -		    dataasciigen(NULL, (char *)buf, grow_incr, Woffset);
> -
> -		if ( Debug > 2 )
> -		    printf("%s: %d DEBUG3 %s/%d: attempting to write %d bytes\n",
> -			Progname, Pid, __FILE__, __LINE__, grow_incr);
> -
> -		lkfile(fd, LOCK_EX, LKLVL0);	 /* get exclusive lock */
> -
> -/*****
> -		ret=write(fd, buf, grow_incr);
> -
> -		tmp=tell(fd);
> -
> -		lkfile(fd, LOCK_UN, LKLVL0);	
> -
> -		if ( ret != grow_incr) {
> -			fprintf(stderr, "%s: %s/%d: write failed: %s\n",
> -				Progname, __FILE__, __LINE__, strerror(errno));
> -			return -1;
> -		}
> -*****/
> -
> -#if NEWIO
> -		ret=lio_write_buffer(fd, io_type, (char *)buf, grow_incr,
> -			 SIGUSR1, &errmsg,0);
> -#else
> -		ret=write_buffer(fd, io_type, buf, grow_incr, 0, &errmsg);
> -#endif
> -
> -		if( Mode & MODE_FIFO ){
> -			/* If it is a fifo then just pretend the file
> -			 * offset is where we think it should be.
> -			 */
> -			tmp = Woffset + grow_incr;
> -		}
> -		else{
> -			if( (tmp=lseek(fd,0,SEEK_CUR)) < 0 ){ /* get offset after the write */
> -				fprintf(stderr, "%s%s: %s/%d: tell(2) failed: %d  %s\n",
> -					Progname, TagName, __FILE__, __LINE__, errno, strerror(errno) );
> -				return -1;
> -			}
> -		}
> -
> -		lkfile(fd, LOCK_UN, LKLVL0);	
> -
> -		if ( ret != grow_incr ) {
> -			fprintf(stderr, "%s%s: %d %s/%d: %d %s\n", 
> -			    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
> -			if ( ret == -ENOSPC ) {
> -				cleanup();
> -				exit(2);
> -			}
> -			return -1;
> -		}
> -
> -		/*
> -		 * Check for a condition where the file was truncated just before
> -		 * the write. 
> -		 */
> -		if ( tmp != Woffset + grow_incr) {
> -		    /*
> -		     * The offset after the write was not as expected.
> -		     * This could be caused by the following:
> -		     *  - file truncated after the lseek and before the write.
> -		     *  - the file was written to after fstat and before the write
> -		     *    and the file was opened with O_APPEND.
> -		     *
> -		     * The pattern written to the file will be considered corrupted.
> -		     */
> -		    if ( Debug > 0 && lockfile ) {
> -		        printf("%s%s: %d DEBUG1 %s/%d: offset after write(%d) not as exp(%d+%d=%d)\n", 	
> -			    Progname, TagName, Pid, __FILE__, __LINE__, tmp, Woffset, grow_incr, Woffset+grow_incr);
> -			printf("%s%s: %d DEBUG1 %s/%d: %d Assuming file changed by another process, resetting offset:%d (expect pattern mismatch)\n",
> -				Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, tmp-grow_incr);
> -		    }
> -		    if( Debug > 4 ){
> -			printf("%s: %d DEBUG5 %s/%d: about to chop Woffset.  tmp=%d, grow_incr=%d, Woffset was %d\n",
> -			       Progname, Pid, __FILE__, __LINE__, tmp, grow_incr, Woffset);
> -		    }
> -		    Woffset=tmp-grow_incr;
> -		    if( Woffset < 0 )
> -			Woffset = 0;
> -		}
> -
> -	}  /* end of grow by write */
> -
> -
> -	/*
> -	 * Woffset - holds start of grow (start of write expect in grow by lseek)
> -	 * Grow_incr - holds size of grow (write).
> -	 * fsize - holds size of file before write
> -	 */
> -	size_grew=(Woffset + Grow_incr) - fsize;
> -	if ( Debug > 1) {
> -	     if ( Mode & MODE_FIFO ) {
> -		printf("%s: %d DEBUG2 %s/%d: file is fifo, %d wrote %d bytes\n",
> -		    Progname, Pid, __FILE__, __LINE__, Grow_incr, Iter_cnt);
> -	     }
> -
> -	     else if ( size_grew > 0 )
> -		printf("%s: %d DEBUG2 %s/%d: %d wrote %d bytes(off:%d), grew file by %d bytes\n",
> -                        Progname, Pid, __FILE__, __LINE__, Iter_cnt, Grow_incr, Woffset, size_grew);
> -	     else
> -		printf("%s: %d DEBUG2 %s/%d: %d wrote %d bytes(off:%d), did not grow file\n",
> -                        Progname, Pid, __FILE__, __LINE__, Iter_cnt, Grow_incr, Woffset);
> -	}
> -
> -    	bytes_consumed += size_grew;
> -	return 0;
> -
> -}	/* end of growfile */
> -
> -/***********************************************************************
> - * shrinkfile file by trunc_incr.  file can not be made smaller than
> - * size zero.  Therefore, if trunc_incr is larger than file size,
> - * file will be truncated to zero.
> - * The file descriptor current offset is assumed to be the end of the
> - * file.
> - *
> - ***********************************************************************/
> -int
> -shrinkfile(fd, filename, trunc_incr, trunc_inter, just_trunc)
> -int fd;
> -char *filename;
> -int trunc_incr;
> -int trunc_inter;	/* interval */
> -int just_trunc;		/* lseek has already been done for you */
> -{
> -    static int shrink_cnt = 0;
> -    int cur_offset;
> -    int new_offset;
> -    int ret;
> -
> -	shrink_cnt++;
> -
> -	if ( trunc_inter == 0 || (shrink_cnt % trunc_inter != 0))  {
> -	    if ( Debug > 3 )
> -		printf("%s: %d DEBUG4 %s/%d: Not shrinking file - not time, iter=%d, cnt=%d\n",
> -		    Progname, Pid, __FILE__, __LINE__, trunc_inter, shrink_cnt);
> -	    return 0;	/* not this time */
> -	}
> -
> -	if ( Mode & MODE_FIFO ) {
> -	    if ( Debug > 5 )
> -		printf("%s: %d DEBUG5 %s/%d: Not attempting to shrink a FIFO\n",
> -		    Progname, Pid, __FILE__, __LINE__);
> -	    return 0;	/* can not truncate fifo */
> -	}
> -
> -	lkfile(fd, LOCK_EX, LKLVL0);
> -
> -	if ((cur_offset=lseek(fd,0,SEEK_CUR)) == -1 ) {
> -	    fprintf(stderr, "%s%s: %d %s/%d: tell(%d) failed: %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, fd, strerror(errno));
> -	    lkfile(fd, LOCK_UN, LKLVL0);
> -	    return -1;
> -	}
> -
> -        if ( Mode & MODE_RAND_LSEEK ) {
> -            if ( max_lseek <= -1 ) {
> -                if ( (new_offset=file_size(fd)) == -1 ) {
> -	            lkfile(fd, LOCK_UN, LKLVL0);
> -		    return -1;
> -		}
> -			
> -		if ( new_offset < min_lseek )
> -		    new_offset=min_lseek;
> -		else
> -                    new_offset=random_range(min_lseek, new_offset, 1, NULL);
> -            }
> -            else {
> -                new_offset=random_range(min_lseek, max_lseek, 1, NULL);
> -            }
> -        }
> -
> -	else {	/* remove trunc_incr from file */
> -
> -	    new_offset = cur_offset-trunc_incr;
> -
> -	    if ( new_offset < 0 )
> -		new_offset=0;
> -	}
> -
> -	ret=ftruncate(fd, new_offset );
> -	if( (ret == 0) && (Debug > 3) ){
> -                printf("%s: %d DEBUG4 %s/%d: ftruncated to offset %d, %d bytes from end\n",
> -                    Progname, Pid, __FILE__, __LINE__, new_offset, trunc_incr);
> -	}
> -
> -	lkfile(fd, LOCK_UN, LKLVL0);
> -
> -	if ( ret == -1 ) {
> -		fprintf(stderr, "%s%s: %d %s/%d: ftruncate failed: %s\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__, strerror(errno));
> -		return -1;
> -	}
> -
> -	if ( Debug > 2 ) {
> -	    printf("%s: %d DEBUG2 %s/%d: trunc file by %d bytes, to size of = %d bytes\n",
> -		Progname, Pid, __FILE__, __LINE__, cur_offset-new_offset, new_offset);
> -	}
> -	
> -
> -        bytes_consumed -= (cur_offset - new_offset);
> -	return 0;
> -
> -}	/* end of shrinkfile */
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -check_write(fd, cf_inter, filename, mode)
> -int fd;
> -int cf_inter;   /* check file interval */
> -char *filename; /* needed for error messages */
> -int mode;       /* write mode */
> -{
> -    int fsize;
> -    static int cf_count = 0;
> -    int ret = 0;
> -    int tmp;
> -    char *errmsg;
> -    char *ptr;
> -
> -    cf_count++;
> -
> -    if ( cf_inter == 0 || (cf_count % cf_inter != 0)) {
> -	if ( Debug > 4 )
> -	    printf("%s: %d DEBUG5 %s/%d: no write check, not time iter=%d, cnt=%d\n",
> -		Progname, Pid, __FILE__, __LINE__, cf_inter, cf_count);
> -	return 0;	 /* no check done */
> -    }
> -
> -    if ( Grow_incr <= 0 ) {
> -        if ( Debug > 3 )
> -	    printf("%s: %d DEBUG4 %s/%d: No write validation,  Grow_incr = %d, offset = %d\n",
> -	        Progname, Pid, __FILE__, __LINE__, Grow_incr, Woffset);
> -        return 0;	/* no check */
> -    }
> -
> -
> -    
> -    /*	
> -     * Get the shared file lock.  We need to hold the lock from before
> -     * we do the stat until after the read.
> -     */
> -    lkfile(fd, LOCK_SH, LKLVL0);
> -
> -    if ((fsize=file_size(fd)) == -1 )  {
> -        lkfile(fd, LOCK_UN, LKLVL0);
> -        return -1;
> -
> -    } else if ( fsize <= Woffset ) {
> -	/*
> -	 * The file was truncated between write and now.
> -	 * The contents of our last write is totally gone, no check.
> -	 */
> -	if ( Debug > 1 )
> -	    printf("%s%s: %d DEBUG2 %s/%d: %d File size (%d) smaller than where last wrote (%d)- no write validation\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, fsize, Woffset);
> -        lkfile(fd, LOCK_UN, LKLVL0);
> -        return 0;	/* no validation, but not an error */
> - 
> -    } else if ( fsize < (Woffset + Grow_incr)) {
> -	/*
> -	 * The file was truncated between write and now.
> -	 * Part of our last write has been truncated, adjust our Grow_incr
> -	 * to reflect this.
> -	 */
> -
> -	tmp=Grow_incr;
> -	Grow_incr=fsize-Woffset;
> -
> -	if ( Debug > 1 )  {
> -
> -	    printf("%s%s: %d DEBUG2 %s/%d: %d fsz:%d, lost(%d)of wrt(off:%d, sz:%d), adj=%d\n",
> -	    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, fsize, tmp-Grow_incr, Woffset, tmp, Grow_incr);
> -	}
> -
> -    }
> -
> -    if ( Debug > 2 )
> -        printf("%s: %d DEBUG3 %s/%d: about to do write validation, offset = %d, size = %d\n",
> -	    Progname, Pid, __FILE__, __LINE__, Woffset, Grow_incr);
> -
> -    if ( ! (mode & MODE_FIFO)  ) {
> -
> -        if ( lseek(fd, Woffset, 0) == -1 ) {
> -            fprintf(stderr, "%s%s: %d %s/%d: lseek(fd, %d, 0) failed: %s\n",
> -	        Progname, TagName, Pid, __FILE__, __LINE__, Woffset, strerror(errno));
> -        }
> -        if ( Debug > 3 )
> -	    printf("%s: %d DEBUG4 %s/%d: lseeked to offset:%d\n",
> -	        Progname, Pid, __FILE__, __LINE__, Woffset);
> -    }
> -
> -    /*
> -     * Read last writes data
> -     */
> -#if NEWIO
> -    ret=lio_read_buffer(fd, io_type, Buffer, Grow_incr, SIGUSR1, &errmsg,0);
> -#else
> -    ret=read_buffer(fd, io_type, Buffer, Grow_incr, 0, &errmsg);
> -#endif
> -
> -    /*
> -     * report the error and debug information before releasing
> -     * the file lock
> -     */
> -    if ( ret != Grow_incr ) {
> -        fprintf(stderr, "%s%s: %d %s/%d: %d CW %s\n", Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
> -        {
> -	    struct stat stbuf;
> -	    fstat(fd, &stbuf);
> -	    if ( Debug > 2 )
> -	        printf("%s%s: %d DEBUG3 %s/%d: fd:%d, offset:%d, fsize:%d, openflags:%#o\n",
> -	            Progname, TagName, Pid, __FILE__, __LINE__, fd,
> -		    (int)lseek(fd,SEEK_CUR,0),	/* FIXME: 64bit/LFS ? */
> -		    (int)stbuf.st_size,
> -		    Fileinfo.openflags);
> -        }
> -
> -	lkfile(fd, LOCK_UN, LKLVL0);
> -	return 1;
> -    }
> -
> -
> -    lkfile(fd, LOCK_UN, LKLVL0);
> -
> -    if ( Mode & MODE_GROW_BY_LSEEK ) {
> -	/* check that all zeros upto last character */
> -	for(ptr=Buffer; ptr < (Buffer+Grow_incr-1); ptr++) {
> -	    if ( *ptr != '\0' ) {
> -	        fprintf(stderr,
> -		    "%s%s: %d %s/%d: data mismatch at offset %d, exp:%#o(zerofilled), act:%#o in file %s\n",
> -		    Progname, TagName, Pid, __FILE__, __LINE__, 
> -		    (int)(Woffset+(Grow_incr-(Buffer-ptr))),
> -		    0, *ptr, filename);
> -	        fflush(stderr);
> -		return 1;
> -	    }
> -	}
> -	/* check that the last char is a 'w' */
> -	if ( *ptr != 'w' ) {
> -	    fprintf(stderr,
> -	  "%s%s: %d %s/%d: data mismatch at offset %d, exp:%#o(zerofilled), act:%#o in file %s\n",
> -	        Progname, TagName, Pid, __FILE__, __LINE__, 
> -		(int)(Woffset+(Grow_incr-(Buffer-ptr))), 'w',
> -		*ptr, filename);
> -	    fflush(stderr);
> -	    return 1;
> -	}
> -	return 0;   /* all is well */
> -	
> -    }
> -    else if ( Pattern == PATTERN_OFFSET )
> -	ret=datapidchk(STATIC_NUM, Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_PID )
> -	ret=datapidchk(Pid, Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_ASCII )
> -        ret=dataasciichk(NULL, Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_RANDOM )
> -	;	/* no check for random */
> -    else if ( Pattern == PATTERN_ALT )
> -        ret=databinchk('a', Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_CHKER )
> -        ret=databinchk('c', Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_CNTING )
> -  	ret=databinchk('C', Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_ZEROS )
> -    	ret=databinchk('z', Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_ONES )
> -    	ret=databinchk('o', Buffer, Grow_incr, Woffset, &errmsg);
> -    else
> -	ret=dataasciichk(NULL, Buffer, Grow_incr, Woffset, &errmsg);
> -
> -    if ( ret >= 0 ) {
> -	fprintf(stderr, "%s%s: %d %s/%d: %d CW %s in file %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg, filename);
> -
> -	if ( Debug > 0 )
> -	    printf("%s%s: %d DEBUG1 %s/%d: **fd:%d, lk:%d, offset:%d, sz:%d open flags:%#o %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, fd, lockfile, 
> -		Woffset, Grow_incr, Fileinfo.openflags, openflags2symbols(Fileinfo.openflags, ",", 0));
> -
> -	fflush(stderr);
> -	return 1;
> -    }
> -
> -    if ( Debug > 6 )
> -        printf("%s: %d DEBUG7 %s/%d: No corruption detected on write validation , offset = %d, size = %d\n",
> -            Progname, Pid, __FILE__, __LINE__, Woffset, Grow_incr);
> -
> -    return 0;	/* all is well */
> -}
> -
> -
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -check_file(fd, cf_inter, filename, no_file_check)
> -int fd;
> -int cf_inter;	/* check file interval */
> -char *filename;	/* needed for error messages */
> -int no_file_check;	/* if set, do not do file content check */
> -{
> -    int fsize;
> -    static int cf_count = 0;
> -    char *buf;
> -    int ret;
> -    int ret_val = 0;
> -    int rd_cnt;
> -    int rd_size;
> -    char *errmsg;
> -
> -	cf_count++;
> -
> -	if ( cf_inter == 0 || (cf_count % cf_inter != 0)) {
> -		if ( Debug > 4 )
> -		    printf("%s: %d DEBUG5 %s/%d: No file check - not time, iter=%d, cnt=%d\n",
> -			Progname, Pid, __FILE__, __LINE__, cf_inter, cf_count);
> -		return 0;	 /* no check done */
> -	}
> -
> -	/*
> -	 * if we can't determine file content, don't bother checking
> -	 */
> -        if ( no_file_check ) {
> -		if ( Debug > 4 )
> -		    printf("%s: %d DEBUG5 %s/%d: No file check, lseek grow or random lseeks\n",
> -			Progname, Pid, __FILE__, __LINE__);
> -		return 0;
> -	}
> -
> -	/*
> -	 * Lock the file.  We need to have the file lock before
> -	 * the stat and until after the last read to prevent
> -	 * a trunc/truncate from "corrupting" our data.
> -	 */
> -	lkfile(fd, LOCK_SH, LKLVL0);
> -	
> -	if ((fsize=file_size(fd)) == -1 )  {
> -	    lkfile(fd, LOCK_UN, LKLVL0);
> -	    return -1;
> -	}
> -
> -        if ( fsize == 0 ) {
> -	    if ( Debug > 2 )
> -            printf("%s: %d DEBUG3 %s/%d: No file validation, file size == 0\n",
> -                Progname, Pid, __FILE__, __LINE__);
> -
> -	    lkfile(fd, LOCK_UN, LKLVL0);
> -	    return 0;
> -	}
> -
> -	if ( Debug > 2 )
> -            printf("%s: %d DEBUG3 %s/%d: about to do file validation\n",
> -	        Progname, Pid, __FILE__, __LINE__);
> -
> -        if ( fsize > MAX_FC_READ ) {
> -	    /*
> -	     * read the file in MAX_FC_READ chuncks.
> -	     */
> -
> -	    if ((buf=(char *)malloc(MAX_FC_READ)) == NULL ) {
> -	        fprintf(stderr, "%s%s: %s/%d: malloc(%d) failed: %s\n", Progname, TagName,
> -		    __FILE__, __LINE__, MAX_FC_READ, strerror(errno));
> -	       lkfile(fd, LOCK_UN, LKLVL0);
> -	       return -1;
> -	    }
> -
> -	    lseek(fd, 0, SEEK_SET);
> -
> -	    lkfile(fd, LOCK_SH, LKLVL0);  /* get lock on file before getting file size */
> -
> -	    rd_cnt=0;
> -	    while (rd_cnt < fsize ) {
> -	        if ( fsize - rd_cnt > MAX_FC_READ )
> -		    rd_size=MAX_FC_READ;
> -	        else
> -		    rd_size=fsize - rd_cnt;
> -				
> -#if NEWIO
> -	        ret=lio_read_buffer(fd, io_type, buf, rd_size,
> -		    SIGUSR1, &errmsg,0);
> -#else
> -	        ret=read_buffer(fd, io_type, buf, rd_size, 0, &errmsg);
> -#endif
> -
> -	        if (ret != rd_size ) {
> -		    fprintf(stderr, "%s%s: %d %s/%d: %d CFa %s\n", 
> -			Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
> -		    free(buf);
> -		    lkfile(fd, LOCK_UN, LKLVL0);
> -		    return -1;
> -	        }
> -/**
> -	        read(fd, buf, rd_size);
> -***/
> -
> -	        if ( Pattern == PATTERN_OFFSET )
> -	            ret=datapidchk(STATIC_NUM, buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_PID )
> -	            ret=datapidchk(Pid, buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_ASCII )
> -	            ret=dataasciichk(NULL, buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_RANDOM )
> -	   	  	;  /* no checks for random */
> -	        else if ( Pattern == PATTERN_ALT )
> -	            ret=databinchk('a', buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_CHKER )
> -	            ret=databinchk('c', buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_CNTING )
> -	            ret=databinchk('C', buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_ZEROS )
> -	            ret=databinchk('z', buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_ONES )
> -	            ret=databinchk('o', buf, rd_size, rd_cnt, &errmsg);
> -	        else
> -	            ret=dataasciichk(NULL, buf, rd_size, rd_cnt, &errmsg);
> -		
> -		    
> -	        if ( ret >= 0 ) {
> -		    fprintf(stderr,
> -		        "%s%s: %d %s/%d: %d CFp %s in file %s\n",
> -		        Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg, filename);
> -		    fflush(stderr);
> -		    ret_val=1;
> -		    lkfile(fd, LOCK_UN, LKLVL0);
> -		    break;
> -	        }
> -	        rd_cnt += rd_size;
> -	    }
> -
> -	    lkfile(fd, LOCK_UN, LKLVL0);
> -
> -	    free(buf);
> -
> -	}
> -	else {
> -	    /*
> -	     * Read the whole file in a single read 
> -	     */
> -	    if((buf=(char *)malloc(fsize)) == NULL ) {
> -			fprintf(stderr, "%s%s: %s/%d: malloc(%d) failed: %s\n", Progname, TagName,
> -				__FILE__, __LINE__, fsize, strerror(errno));
> -			fflush(stderr);
> -			return -1;
> -	    }
> -
> -	    lseek(fd, 0, SEEK_SET);
> -
> -/****
> -	    read(fd, buf, fsize);
> -****/
> -#if NEWIO
> -	    ret=lio_read_buffer(fd, io_type, buf, fsize, SIGUSR1, &errmsg,0);
> -#else
> -	    ret=read_buffer(fd, io_type, buf, fsize, 0, &errmsg);
> -#endif
> -
> -	    /* unlock the file as soon as we can */
> -	    lkfile(fd, LOCK_UN, LKLVL0);
> -
> -
> -	    if ( ret != fsize ) {
> -		fprintf(stderr, "%s%s: %d %s/%d: %d CFw %s\n", 
> -		    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
> -		ret_val=1;
> -	    }
> -	    else  {
> -	        if ( Pattern == PATTERN_OFFSET )
> -		    ret=datapidchk(STATIC_NUM, buf, fsize, 0, &errmsg);
> -	        else if ( Pattern == PATTERN_PID )
> -		    ret=datapidchk(Pid, buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_ASCII )
> -		    ret=dataasciichk(NULL, buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_RANDOM )
> -		    ;	/* no check for random */
> -		else if ( Pattern == PATTERN_ALT )
> -		    ret=databinchk('a', buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_CHKER )
> -		    ret=databinchk('c', buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_CNTING )
> -		    ret=databinchk('C', buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_ZEROS )
> -		    ret=databinchk('z', buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_ONES )
> -		    ret=databinchk('o', buf, fsize, 0, &errmsg);
> -		else
> -		    ret=dataasciichk(NULL, buf, fsize, 0, &errmsg);
> -
> -		if ( ret >= 0 ) {
> -		    fprintf(stderr, "%s%s: %d %s/%d: %d CFw %s in file %s\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg, filename);
> -		    fflush(stderr);
> -		    ret_val=1;
> -		}
> -	    }
> -	    free(buf);
> -	}
> -
> -	return ret_val;
> -
> -}	/* end of check_file */
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -file_size(int fd)
> -{
> -    struct stat sb;
> -
> -        if (fstat(fd, &sb) < 0) {
> -            fprintf(stderr, "%s%s: %d %s/%d: Unable to fstat(%d, &buf), errno:%d %s\n",
> -                Progname, TagName, Pid, __FILE__, __LINE__, fd, errno, strerror(errno));
> -	    return -1;
> -	
> -        }
> -
> -        return sb.st_size;
> -}
> -
> -/***********************************************************************
> - *  do file lock/unlock action.
> - ***********************************************************************/
> -int
> -lkfile(int fd, int operation, int lklevel)
> -{
> -    char *errmsg;
> -
> -    
> -    if ( lockfile == lklevel) {
> -	
> -        if ( Debug > 5 ) {
> -	    switch (operation) {
> - 	    case LOCK_UN:
> -	        printf("%s: %d DEBUG6 %s/%d: Attempting to release lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -
> - 	    case LOCK_SH:
> -	        printf("%s: %d DEBUG6 %s/%d: Attempting to get read/shared lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -
> - 	    case LOCK_EX:
> -	        printf("%s: %d DEBUG6 %s/%d: Attempting to get write/exclusive lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -	    }
> -	}
> -
> -	/*
> -	 * Attempt to get/release desired lock.
> -	 * file_lock will attempt to do action over and over again until
> -	 * either an unretryable error or the action is completed.
> -	 */
> -
> -        if ( file_lock(fd, operation, &errmsg) != 0 ) {
> -	    printf("%s%s: %d %s/%d: Unable to perform lock operation. %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, errmsg);
> -
> -	    /* do we count this as an error? handle_error();  */
> -	    return -1;
> -        }
> -
> -        if ( Debug > 2 ) {
> -	    switch (operation) {
> - 	    case LOCK_UN:
> -	        printf("%s: %d DEBUG3 %s/%d: Released lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -
> - 	    case LOCK_SH:
> -	        printf("%s: %d DEBUG3 %s/%d: Got read/shared lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -
> - 	    case LOCK_EX:
> -	        printf("%s: %d DEBUG3 %s/%d: Got write/exclusive lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -	
> -	    default:
> -	        printf("%s: %d DEBUG3 %s/%d: Completed action %d on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, operation, fd);
> -		break;
> -	    }
> -	}
> -   }
> -
> -   return 0;
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -pre_alloc(file, fd, size)
> -char *file;
> -int fd;
> -int size;
> -{
> -
> -#ifdef XFS_IOC_RESVSP
> -    struct xfs_flock64 f;
> -
> -	f.l_whence = 0;
> -	f.l_start = 0;
> -	f.l_len = size;
> -
> -	/* non-zeroing reservation */
> -	if( xfsctl( file, fd, XFS_IOC_RESVSP, &f ) == -1 ){
> -                fprintf(stderr, "%s%s %s/%d: Unable to pre-alloc space: xfsctl(XFS_IOC_RESVSP) failed: %d  %s\n",
> -			Progname, TagName,
> -                        __FILE__, __LINE__, errno, strerror(errno));
> -		return -1;
> -	}
> -#else
> -    struct flock64 f;
> -
> -	f.l_whence = 0;
> -	f.l_start = 0;
> -	f.l_len = size;
> -
> -	/* non-zeroing reservation */
> -	if( fcntl( fd, F_RESVSP64, &f ) == -1 ){
> -                fprintf(stderr, "%s%s %s/%d: Unable to pre-alloc space: fcntl(F_RESVSP) failed: %d  %s\n",
> -			Progname, TagName,
> -                        __FILE__, __LINE__, errno, strerror(errno));
> -		return -1;
> -	}
> -#endif
> -
> -	return 0;
> -}
> -- 
> 2.47.1
> 
>
Zorro Lang Feb. 20, 2025, 8:06 p.m. UTC | #2
On Wed, Feb 19, 2025 at 10:52:28PM +0100, David Sterba wrote:
> This utility is not used by any current test and seems that it's never
> been used in xfstests, so remove it. Appending files can be simply done
> by 'xfs_io' command too.
> 
> Signed-off-by: David Sterba <dsterba@suse.com>
> ---

I think this program was just copied from ltp project directly with other
programs by commit 332ee29d1a. From the commit history, I found it was updated
several times, but never be used by fstests. Maybe someone use it manually.
Anyway, I'm good to remove it. Thanks for doing it.

Reviewed-by: Zorro Lang <zlang@redhat.com>

>  .gitignore      |    1 -
>  lib/tlibio.c    |    2 +-
>  ltp/Makefile    |    2 +-
>  ltp/growfiles.c | 2607 -----------------------------------------------
>  4 files changed, 2 insertions(+), 2610 deletions(-)
>  delete mode 100644 ltp/growfiles.c
> 
> diff --git a/.gitignore b/.gitignore
> index 7060f52cf6b87e..4fd817243dca37 100644
> --- a/.gitignore
> +++ b/.gitignore
> @@ -50,7 +50,6 @@ tags
>  /ltp/doio
>  /ltp/fsstress
>  /ltp/fsx
> -/ltp/growfiles
>  /ltp/iogen
>  
>  # src/ binaries
> diff --git a/lib/tlibio.c b/lib/tlibio.c
> index f7259734af97c7..5b81005952119d 100644
> --- a/lib/tlibio.c
> +++ b/lib/tlibio.c
> @@ -211,7 +211,7 @@ lio_set_debug(int level)
>   * Only the first character of the string is used.
>   *
>   * This function does not provide for meaningful option arguments,
> - * but it supports current growfiles/btlk interface.
> + * but it supports current btlk interface.
>   *
>   *  (rrl 04/96)
>   ***********************************************************************/
> diff --git a/ltp/Makefile b/ltp/Makefile
> index 0611c5efe96b14..b707924c808042 100644
> --- a/ltp/Makefile
> +++ b/ltp/Makefile
> @@ -5,7 +5,7 @@
>  TOPDIR = ..
>  include $(TOPDIR)/include/builddefs
>  
> -TARGETS = doio fsstress fsx growfiles iogen
> +TARGETS = doio fsstress fsx iogen
>  SCRIPTS = rwtest.sh
>  CFILES = $(TARGETS:=.c)
>  HFILES = doio.h
> diff --git a/ltp/growfiles.c b/ltp/growfiles.c
> deleted file mode 100644
> index 7ac44aba0bede0..00000000000000
> --- a/ltp/growfiles.c
> +++ /dev/null
> @@ -1,2607 +0,0 @@
> -// SPDX-License-Identifier: GPL-2.0
> -/*
> - * Copyright (c) 2000 Silicon Graphics, Inc.
> - * All Rights Reserved.
> - */
> -/*
> - * This program will grow a list of files.
> - * Each file will grow by grow_incr before the same
> - * file grows twice.  Each file is open and closed before next file is opened.
> - *
> - * To just verify file contents: growfiles -g 0 -c 1 filename
> - *
> - * See help and prt_examples functions below.
> - *
> - * Basic code layout
> - *  process cmdline 
> - *  print debug message about options used
> - *  setup signal handlers
> - *  return control to user (if wanted - default action)
> - *  fork number of desired childern (if wanted)
> - *  re-exec self (if wanted)
> - *  Determine number of files
> - *  malloc space or i/o buffer
> - *  Loop until stop is set
> - *    Determine if hit iteration, time, max errors or num bytes reached
> - *    Loop through each file
> - *	open file
> - *	fstat file - to determine if file is a fifo
> - *	prealloc file space (if wanted)
> - *      growfile
> - *	check last write
> - *	check whole file
> - *	shrink file
> - *	close file
> - *	delay (if wanted)
> - *    End loop
> - *  End loop
> - *  remove all files (if wanted)
> - *
> - * Author: Richard Logan
> - *
> - */
> -
> -#include "global.h"
> -
> -#ifdef HAVE_SYS_FILE_H
> -#include <sys/file.h>
> -#endif
> -
> -#include "dataascii.h"
> -#include "random_range.h"
> -#include "databin.h"
> -#include "open_flags.h"
> -#include "forker.h"
> -#include "file_lock.h"
> -
> -extern int datapidgen(int pid, unsigned char *buffer, int bsize, int offset);
> -extern void databingen(int mode, unsigned char *buffer, int bsize, int offset);
> -extern int datapidchk(int pid, char *buffer, int bsize, int offset, char **errmsg);
> -extern int databinchk(int mode, char *buffer, int bsize, int offset, char **errmsg);
> -
> -int file_size(int fd);
> -int check_write(int fd, int cf_inter, char *filename, int mode);
> -int shrinkfile(int fd, char *filename, int trunc_incr, int trunc_inter, int just_trunc);
> -int check_file(int fd, int cf_inter, char *filename, int no_file_check);
> -int growfile(int fd, char *file, int grow_incr, unsigned char *buf);
> -int cleanup();
> -int handle_error();
> -int lkfile(int fd, int operation, int lklevel);
> -void usage();
> -void help();
> -void prt_examples(FILE *stream);
> -int set_sig();
> -void sig_handler();
> -static void notify_others();
> -int pre_alloc(char *file, int fd, int size);
> -
> -
> -#define NEWIO	1	/* Use the tlibio.c functions */
> -
> -#ifndef NEWIO
> -#define NEWIO	0	/* specifies to use original iowrite.c */
> -			/* functions instead of tlibio.c functions */
> -			/* Once it is proven tlibio.c functions work properly, */
> -			/* only tlibio.c functions will be used */
> -#else
> -#include "tlibio.h"
> -#endif
> -
> -#ifndef PATH_MAX
> -#define PATH_MAX	1023
> -#endif
> -
> -
> -#define DEF_DIR		"."
> -#define DEF_FILE	"gf"
> -
> -char *Progname;
> -int Debug  = 1;
> -
> -int Pid=0;
> -
> -int io_type = 0;			/* I/O type -sync */
> -int open_flags = O_RDWR|O_CREAT;	/* open flags */
> -
> -#define MAX_FC_READ	196608		/* 4096 * 48 - 48 blocks */
> -
> -#define PATTERN_ASCII	1	/* repeating alphabet letter pattern */
> -				/* allows multiple writers and to be checked */
> -#define PATTERN_PID	2	/* <pid><words byte offset><pid> */
> -				/* Assumes 64 bit word. Only allows single */
> -				/* process to write and check */
> -/*
> - *	1234567890123456789012345678901234567890123456789012345678901234
> - *	________________________________________________________________
> - *	<    pid       >< offset in file of this word  ><    pid       >
> - */
> -	
> -#define PATTERN_OFFSET	3	/* Like PATTERN_PID but has a fixed number */
> -				/* (STATIC_NUM) instead of pid. */
> -				/* Allows multiple processes to write/read */
> -#define PATTERN_ALT	4	/* alternating bit pattern (i.e. 0x5555555...) */
> -#define PATTERN_CHKER	5	/* checkerboard pattern (i.e. 0xff00ff00ff00...) */
> -#define PATTERN_CNTING  6	/* counting pattern (i.e. 0 - 07, 0 - 07, ...) */
> -#define PATTERN_ONES	7	/* all bits set (i.e. 0xffffffffffffff...) */
> -#define PATTERN_ZEROS	8	/* all bits cleared (i.e. 0x000000000...) */
> -#define PATTERN_RANDOM	9	/* random integers - can not be checked */
> -#define STATIC_NUM	221849	/* used instead of pid when PATTERN_OFFSET */
> -
> -#define MODE_RAND_SIZE	1	/* random write and trunc */
> -#define MODE_RAND_LSEEK	2	/* random lseek before write */
> -#define MODE_GROW_BY_LSEEK 4	/* lseek beyond end of file then write a byte */
> -#define RANDOM_OPEN	999876	/* if Open_flags set to this value, open flags */
> -				/* will be randomly choosen from Open_flags[] */
> -#define MODE_FIFO	S_IFIFO	/* defined in stat.h  0010000 */
> -
> -int num_files = 0;		/* num_auto_files + cmd line files */
> -char *filenames;		/* pointer to space containing filenames */
> -int remove_files = 0;		/* if set, cleanup default is not to cleanup */
> -int bytes_consumed = 0;		/* total bytes consumed, all files */
> -int bytes_to_consume = 0;   	/* non-zero if -B was specified, total bytes */
> -int Maxerrs = 100;		/* Max number errors before forced exit */
> -int Errors = 0;			/* number of encountered errors */
> -int Upanic_on_error = 0;	/* call upanic if error and this variable set */
> -
> -/* The *_size variables are only used when random iosize option (-r) is used */
> -int max_size=5000;
> -int min_size=1;			/* also set in option parsing */
> -int mult_size=1;		/* when random iosz, iosz must be mult of mult_size */
> -/* the *_lseek variables are only used when radon lseek option (-R) is used */
> -int min_lseek=0;		/* also set in option parsing */
> -int max_lseek=-1;		/* -1 means size of file */
> -int Pattern=PATTERN_ASCII;
> -int Seed=-1;			/* random number seed, < 0 == uninitialized  */
> -int Nseeds=0;			/* Number of seed specified by the user */
> -int *Seeds;			/* malloc'ed arrary of ints holding user spec seeds */
> -
> -int using_random=0;		/* flag indicating randomization is being used */
> -float delaysecs=0.0;		/* delay between iterations (in seconds) */
> -int delaytime;			/* delay between iterations in clocks/uses */
> -int lockfile=0;			/* if set, do file locking */
> -				/* 1 = do file locking around write, trunc */
> -				/* and reads. */
> -				/* 2 = write lock around all file operations */
> -
> -int Woffset=0;			/* offset before last write */
> -int Grow_incr=4096;		/* sz of last write */
> -int Mode=0;			/* bitmask of write/trunc mode */
> -				/* also knows if dealing with fifo */
> -char *Buffer = NULL;		/* buffer used by write and write check */
> -int Alignment=0;		/* if non word multiple, io will not be word aligned */
> -int Opid=0;			/* original pid */
> -
> -int Sync_with_others = 0;	/* Flag indicating to stop other if we stop before DONE */
> -int Iter_cnt = 0;		/* contains current iteration count value */
> -char	TagName[40];		/* name of this growfiles (see Monster)	    */
> -
> -struct fileinfo_t {
> -    char *filename;
> -    int fd;
> -    int openflags;
> -    int mode;
> -}  Fileinfo;
> -
> -/*
> - * Define open flags that will be used when '-o random' option is used.
> - * Note: If there is more than one growfiles doing its thing to the same
> - * file, O_TRUNC will cause data mismatches.  How you ask?
> - * timing of events, example:
> - *   Process one		Process two
> - *   ---------------		-------------
> - *   get write lock
> - *   fstat file
> - *   lseek
> - *   generate pattern
> - *				open with O_TRUNC 
> - *   write with wrong pattern
> - *	because offset is wrong
> - *
> - *  The second process truncated the file after the pattern was
> - *  determined, thus the pattern is wrong for the file location.
> - *
> - * There can also be a timing problem with open flag O_APPEND if
> - * file locks are not being used (-l option).  Things could happen
> - * between the fstat and the write. Thus, writing the wrong pattern.
> - * If all processes observe the file locks, O_APPEND should be ok
> - * to use.
> - */
> -int Open_flags[] = { 
> -	O_RDWR|O_CREAT,
> -	O_RDWR|O_CREAT|O_APPEND,
> -	O_RDWR|O_CREAT|O_NDELAY,
> -	O_RDWR|O_CREAT|O_SYNC,
> -	O_RDWR|O_CREAT|O_SYNC|O_NDELAY,
> -	O_RDWR|O_CREAT|O_APPEND|O_NDELAY,
> -
> -};
> -
> -#define REXEC_INIT	0	/* don't do re-exec of childern */
> -#define REXEC_DOIT	1	/* Do re-exec of childern */
> -#define REXEC_DONE	2	/* We've already been re-exec'ed */
> -
> -#ifndef BSIZE
> -#define BSIZE	512
> -#endif  /* BSIZE */
> -
> -#define USECS_PER_SEC	1000000  /* microseconds per second */
> -
> -/*
> - * Define marcos used when dealing with file locks.
> - */
> -#define LKLVL0		1	/* file lock around write/read/trunc */
> -#define LKLVL1		2	/* file lock after open to before close */
> -
> -/*
> - * Define special max lseek values
> - */
> -#define LSK_EOF       	    -1	/* set fptr up to EOF */
> -#define LSK_EOFPLUSGROW	    -2	/* set fptr up to EOF + grow - leave whole */
> -#define LSK_EOFMINUSGROW    -3	/* set fptr up to EOF-grow - no grow */
> -
> -
> -/***********************************************************************
> - * MAIN
> - ***********************************************************************/
> -int
> -main(argc, argv)
> -int argc;
> -char **argv;
> -{
> -extern char *optarg;            /* used by getopt */
> -extern int optind;
> -extern int opterr;
> -
> -int ind;
> -int first_file_ind = 0;
> -int num_auto_files = 0;		/* files created by tool */
> -int seq_auto_files = 0;		/* auto files created by tool created by tool */
> -char *auto_dir = DEF_DIR;
> -char *auto_file = DEF_FILE;
> -int grow_incr = 4096;
> -int trunc_incr = 4096;
> -int trunc_inter = 0;		/* 0 means none, */
> -int unlink_inter = 0;		/* 0 means none, 1 means always unlink */
> -int unlink_inter_ran = -1;	/* -1 -use unlink_inter, otherwise randomly choose */
> -				/* between unlink_inter and unlink_inter_ran */
> -int file_check_inter = 0;	/* 0 means never, 1 means always */
> -int write_check_inter = 1;	/* 0 means never, 1 means always */
> -int iterations = 1;		/* number of increments to be added */
> -int no_file_check = 0;		/* if set, no whole file checking will be done */
> -int num;
> -int fd;				/* file descriptor */
> -int stop = 0;			/* loop stopper if set */
> -int tmp;
> -char chr;
> -int ret;
> -int pre_alloc_space = 0;
> -int total_grow_value = 0;	/* used in pre-allocations */
> -int backgrnd = 1;		/* return control to user */
> -struct stat statbuf;
> -int time_iterval = -1;
> -time_t start_time = 0;
> -char reason[40];		/* reason for loop termination */
> -int num_procs=1;
> -int forker_mode=0;
> -int reexec=REXEC_INIT;		/* reexec info */
> -char *exec_path=NULL;
> -
> -char *strrchr();
> -
> -char *filename;                 /* name of file specified by user */
> -char *cptr;			/* temp char pointer */
> -extern int Forker_npids;	/* num of forked pid, defined in forker.c */
> -
> -
> -	if ( argv[0][0] == '-' )
> -	   reexec=REXEC_DONE;
> -	/*
> -	 * Determine name of file used to invoke this program
> -	 */
> -	if ((Progname=strrchr(argv[0], '/')) != NULL)
> -		Progname++;
> -	else
> -		Progname=argv[0];
> -
> -	TagName[0] = '\0';
> -
> -	/*
> -	 * Process options
> -	 */
> -	while ((ind=getopt(argc, argv, 
> -	    "hB:C:c:bd:D:e:Ef:g:H:I:i:lL:n:N:O:o:pP:q:wt:r:R:s:S:T:uU:W:xy")) != EOF) {
> -		switch(ind) {
> -
> -		case 'h' :
> -			help();
> -			exit(0);
> -
> -		case 'B':
> -			switch (sscanf(optarg, "%i%c",
> -				   &bytes_to_consume, &chr)) {
> -			case 1: /* noop */
> -			        break;
> -
> -			case 2:
> -				if (chr == 'b') {
> -				    bytes_to_consume *= BSIZE;
> -				} else {
> -				    fprintf(stderr,
> -					"%s%s:  --B option arg invalid\n",
> -					Progname, TagName);
> -				    usage();
> -				    exit(1);
> -				}
> -				break;
> -
> -			default:
> -				fprintf(stderr, "%s%s: --B option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -				break;
> -			}
> -
> -			break;
> -
> -		case 'E' :
> -			prt_examples(stdout);
> -			exit(0);
> -
> -		case 'b' :	/* batch */
> -			backgrnd=0;
> -			break;
> -
> -		case 'C':
> -			if (sscanf(optarg, "%i", &write_check_inter) != 1 ) {
> -				fprintf(stderr, "%s%s: --c option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -		       break;
> -
> -		case 'c':
> -			if (sscanf(optarg, "%i", &file_check_inter) != 1 ) {
> -				fprintf(stderr, "%s%s: --c option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -
> -		case 'd':
> -			auto_dir=optarg;
> -			if ( stat(auto_dir, &statbuf) == -1 ) {
> -			    if ( mkdir(auto_dir, 0777) == -1 ) {
> -				if ( errno != EEXIST ) {
> -				    fprintf(stderr,
> -				        "%s%s: Unable to make dir %s\n", 
> -				        Progname, TagName, auto_dir);
> -				    exit(1);
> -			        }
> -			    }
> -			}
> -			else {
> -			    if ( ! (statbuf.st_mode & S_IFDIR) )  {
> -				fprintf(stderr,
> -				    "%s%s: %s already exists and is not a directory\n",
> -				    Progname, TagName, auto_dir);
> -				exit(1);
> -			    }
> -			}
> -			break;
> -
> -		case 'D':
> -			if (sscanf(optarg, "%i", &Debug) != 1 ) {
> -				fprintf(stderr, "%s%s: --D option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'e':
> -			if (sscanf(optarg, "%i", &Maxerrs) != 1 ) {
> -				fprintf(stderr, "%s%s: --e option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'f':
> -			auto_file=optarg;
> -			break;
> -
> -		case 'g':
> -			if ((ret=sscanf(optarg, "%i%c", &grow_incr, &chr)) < 1 ||
> -				grow_incr < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --g option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			if ( ret == 2 ) {
> -				if ( chr == 'b' || chr == 'B' )
> -					grow_incr *= 4096;
> -				else {
> -					fprintf(stderr,
> -						"%s%s: --g option arg invalid\n",
> -						Progname, TagName);
> -					usage();
> -					exit(1);
> -				}
> -			}
> -			break;
> -
> -		case 'H':
> -			if (sscanf(optarg, "%f", &delaysecs) != 1 || delaysecs < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --H option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'i':
> -			if (sscanf(optarg, "%i", &iterations) != 1 ||
> -				iterations < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --i option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'I':
> -#if NEWIO
> -			if((io_type=lio_parse_io_arg1(optarg)) == -1 ) {
> -			    fprintf(stderr,
> -				"%s%s: --I arg is invalid, must be s, p, f, a, l, L or r.\n",
> -				Progname, TagName);
> -			    exit(1);
> -			}
> -			if( io_type & LIO_RANDOM )
> -				using_random++;
> -#else
> -			if((io_type=parse_io_arg(optarg)) == -1 ) {
> -			    fprintf(stderr,
> -				"%s%s: --I arg is invalid, must be s, p, f, a, l, L or r.\n",
> -				Progname, TagName);
> -			    exit(1);
> -			}
> -			if( io_type == 99 ) /* hold-over until tlibio.h */
> -				using_random++;
> -#endif
> -			break;
> -
> -		case 'l':
> -			lockfile++;
> -			if ( lockfile > 2 )
> -			   lockfile=2;	/* lockfile can only be 1 or 2 */
> -			break;
> -
> -		case 'L':
> -			if (sscanf(optarg, "%i", &time_iterval) != 1 ||
> -				time_iterval < 0 ) {
> -				fprintf(stderr, "%s%s: --L option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'n':
> -			if (sscanf(optarg, "%i:%i", &num_procs, &forker_mode) < 1 ||
> -                                num_procs < 0 ) {
> -
> -                                fprintf(stderr, "%s%s: --n option arg invalid\n",
> -                                        Progname, TagName);
> -                                usage();
> -                                exit(1);
> -                        }
> -
> -			break;
> -
> -		case 'N':
> -			if (sscanf(optarg, "%i", &num_auto_files) != 1 ||
> -				num_auto_files < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --N option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'O':
> -			if (sscanf(optarg, "%i", &Alignment) != 1 ||
> -				num_auto_files < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --O option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'o':
> -		        if ( strcmp(optarg, "random") == 0 ){
> -			    open_flags=RANDOM_OPEN;
> -			    using_random++;
> -
> -		        } else if ((open_flags=parse_open_flags(optarg, NULL)) == -1 ) {
> -		            fprintf(stderr, "%s%s: --o arg contains invalid flag\n",
> -				Progname, TagName);
> -		            exit(1);
> -		        }
> -		        break;
> -
> -
> -		case 'p' :	/* pre allocate space */
> -			printf("%s%s: --p is illegal option on this system\n",
> -				Progname, TagName);
> -			exit(1);
> -			break;
> -
> -		case 'P':
> -			printf("%s%s: --P is illegal option on non-cray system\n",
> -				Progname, TagName);
> -			exit(1);
> -			break;
> -
> -		case 'q':	/* file content or pattern */
> -			switch(optarg[0]) {
> -			case 'A':
> -			    Pattern = PATTERN_ALT;
> -			    break;
> -			case 'a':
> -			    Pattern = PATTERN_ASCII;
> -			    break;
> -			case 'p':
> -			    Pattern = PATTERN_PID;
> -			    break;
> -			case 'o':
> -			    Pattern = PATTERN_OFFSET;
> -			    break;
> -			case 'c':
> -			    Pattern = PATTERN_CHKER;
> -			    break;
> -			case 'C':
> -			    Pattern = PATTERN_CNTING;
> -			    break;
> -			case 'r':
> -			    Pattern = PATTERN_RANDOM;
> -			    using_random++;
> -			    break;
> -			case 'z':
> -			    Pattern = PATTERN_ZEROS;
> -			    break;
> -			case 'O':
> -			    Pattern = PATTERN_ONES;
> -			    break;
> -			default:
> -			    fprintf(stderr,
> -				"%s%s: --C option arg invalid, A, a, p, o, c, C, r, z, or 0\n",
> -				Progname, TagName);
> -			    usage();
> -			    exit(1);
> -			}
> -			break;
> -
> -		case 'R':	/* random lseek before write arg: [min-]max*/
> -			if (sscanf(optarg, "%i-%i", &min_lseek, &max_lseek) != 2 ) {
> -			    min_lseek=1;    /* same as default in define */
> -			    if (sscanf(optarg, "%i%c", &max_lseek, &chr) != 1 ) {
> -				fprintf(stderr, "%s%s: --R option arg invalid: [min-]max\n",
> -				    Progname, TagName);
> -				exit(1);
> -			    }
> -			}
> -			if ( max_lseek < LSK_EOFMINUSGROW ) {
> -			    fprintf(stderr, "%s%s: --R option, max_lseek is invalid\n",
> -				Progname, TagName);
> -                            exit(1);
> -			}
> -			Mode |= MODE_RAND_LSEEK;
> -			using_random++;
> -		        break;
> -
> -		case 'r':	/* random io size arg: [min-]max[:mult] */
> -
> -			/* min-max:mult format */
> -			if (sscanf(optarg, "%i-%i:%i%c", &min_size, &max_size,
> -							&mult_size, &chr) != 3 ) {
> -			  min_size=1;   
> -			  /* max:mult format */
> -		  	  if (sscanf(optarg, "%i:%i%c", &max_size,
> -							&mult_size, &chr) != 2 ) {
> -			    /* min-max format */
> -		    	    if (sscanf(optarg, "%i-%i%c", &min_size,
> -							&max_size, &chr) != 2 ) {
> -			      min_size=1;   
> -		      	      if (sscanf(optarg, "%i%c", &max_size, &chr) != 1 ) {
> -				fprintf(stderr,
> -				     "%s%s: --r option arg invalid: [min-]max[:mult]\n",
> -			    	Progname, TagName);
> -				exit(1);
> -		      	      }
> -		    	    }
> -		  	  }
> -			}
> -
> -			if ( max_size < 0 ) {
> -			    fprintf(stderr, "%s%s: --r option, max_size is invalid\n",
> -				Progname, TagName);
> -                            exit(1);
> -			}
> -			/*
> -			 * If min and max are the same, no randomness
> -			 */
> -			if ( min_size != max_size ) {
> -			    Mode |= MODE_RAND_SIZE;
> -			    using_random++;
> - 			}
> -		        break;
> -
> -		case 'S':
> -			if (sscanf(optarg, "%i", &seq_auto_files) != 1 ||
> -				seq_auto_files < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --S option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 's':	/* format: seed[,seed...] */
> -			
> -			/* count the number of seeds */
> -			cptr=optarg;
> -			for(Nseeds=1; *cptr ; Nseeds++) {
> -			    if ( (filename=strchr(cptr, ',')) == NULL )
> -				break;
> -			    cptr=filename;
> -			    cptr++;
> -			}
> -			Seeds=(int *)malloc(Nseeds*sizeof(int));
> -
> -			/*
> -			 * check that each seed is valid and put them in 
> -			 * the newly malloc'ed Seeds arrary.
> -			 */
> -			filename=cptr=optarg;
> -			for(Nseeds=0; *cptr; Nseeds++) {
> -			    if ( (filename=strchr(cptr, ',')) == NULL ) {
> -				if ( sscanf(cptr, "%i", &Seeds[Nseeds]) < 1 ) {
> -                                    fprintf(stderr, "%s%s: --s option arg %s invalid\n",
> -                                        Progname, TagName, cptr);
> -                                    usage();
> -                                    exit(1);
> -				}
> -				Nseeds++;
> -                                break;
> -			    }
> -
> -			    *filename='\0';
> -			    if ( sscanf(cptr, "%i", &Seeds[Nseeds]) < 1 ) {
> -                               fprintf(stderr, "%s%s: --s option arg %s invalid\n",
> -                                        Progname, TagName, cptr);
> -                                usage();
> -                                exit(1);
> -			    }
> -			    *filename=',';   /* restore string */
> -                            cptr=filename;
> -			    cptr++;
> -			}
> -			break;
> -
> -		case 't':
> -			if ((ret=sscanf(optarg, "%i%c", &trunc_incr, &chr)) < 1 ||
> -				trunc_incr < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --t option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			if ( ret == 2 ) {
> -				if ( chr == 'b' || chr == 'B' )
> -					trunc_incr *= 4096;
> -				else {
> -					fprintf(stderr,
> -						"%s%s: --t option arg invalid\n",
> -						Progname, TagName);
> -					usage();
> -					exit(1);
> -				}
> -			}
> -			break;
> -
> -		case 'T':	/* truncate interval */
> -			if (sscanf(optarg, "%i%c", &trunc_inter, &chr) != 1 ||
> -				trunc_inter < 0 ) {
> -
> -				fprintf(stderr, "%s%s: --T option arg invalid\n",
> -					Progname, TagName);
> -				usage();
> -				exit(1);
> -			}
> -			break;
> -
> -		case 'u':
> -			remove_files++;
> -			break;
> -
> -		case 'U':   /* how often to unlink file */
> -		       /* 
> -			* formats:   
> -			*      A-B  - randomly pick interval between A and B 
> -			*      X    - unlink file every X iteration
> -			*/
> -                       if (sscanf(optarg, "%i-%i", &unlink_inter, 
> -						&unlink_inter_ran) == 2 ) {
> -
> -			   if ( unlink_inter < 0 || unlink_inter_ran < 0 ) {
> -                                fprintf(stderr, "%s%s: --U option arg invalid\n",
> -                                        Progname, TagName);
> -                                usage();
> -                                exit(1);
> -			   }
> -			   /* ensure unlink_inter contains smaller value */
> -			   if ( unlink_inter > unlink_inter_ran ) {
> -				tmp=unlink_inter_ran;
> -				unlink_inter_ran=unlink_inter;
> -				unlink_inter=tmp;
> -			   }
> -			   using_random++;
> -
> -                       } else if (sscanf(optarg, "%i%c", &unlink_inter, &chr) != 1 ||
> -                                unlink_inter < 0 ) {
> -
> -                            fprintf(stderr, "%s%s: --U option arg invalid\n",
> -                                 Progname, TagName);
> -                            usage();
> -                            exit(1);
> -                        }
> -			break;
> -
> -	        case 'x':
> -			if ( reexec != REXEC_DONE )
> -			    reexec=REXEC_DOIT;
> -			break;
> -
> -		case 'w':
> -			Mode |= MODE_GROW_BY_LSEEK;
> -			break;
> -
> -		case 'W':
> -			sprintf( TagName, "(%.37s)", optarg );
> -			break;
> -
> -		case 'y':
> -			Sync_with_others=1;
> -			break;
> -
> -		case '?':
> -			usage();
> -			exit(1);
> -			break;
> -		}
> -	}
> -
> -	if( Debug == 1 ){
> -		cptr = getenv("TOUTPUT");
> -		if( (cptr != NULL) && (strcmp( cptr, "NOPASS" ) == 0) ){
> -			Debug = 0;
> -		}
> -	}
> -
> -	if ( Pattern == PATTERN_RANDOM ) {
> -	    no_file_check=1;
> -	    if ( write_check_inter || file_check_inter )
> -                printf("%s%s: %d Using random pattern - no data checking will be performed!\n",
> -		    Progname, TagName, (int)getpid());
> -	}
> -	else if ( max_lseek == LSK_EOFPLUSGROW || Mode & MODE_GROW_BY_LSEEK ) {
> -	    no_file_check=1;
> -
> -	    if ( file_check_inter )
> -	        printf("%s%s: %d Using random lseek beyond EOF or lseek grow,\n\
> -no whole file checking will be performed!\n", Progname, TagName, (int)getpid());
> -
> -	}
> -
> -	if ( Mode & MODE_RAND_SIZE )
> -	    grow_incr=max_size;
> -
> -	set_sig();
> -
> -	Opid=getpid();
> -	Pid=Opid;
> -
> -	if ( backgrnd ) {
> -	    if ( Debug > 1 )
> -		printf("%s: %d DEBUG2 forking, returning control to the user\n",
> -		    Progname, Opid);
> -	    background(Progname);	/* give user their prompt back */
> -	}
> -
> -	if ( Debug > 3 ) {
> -#if NEWIO
> -	    lio_set_debug(Debug-3);
> -#else
> -	    set_iowrite_debug(Debug-3);
> -#endif
> -	}
> -
> -	/*
> -	 * Print some program information here if debug is turned on to
> -	 * level 3 or higher.
> -	 */
> -
> -        if ( Debug > 2 ) {
> -	    
> -	    if (  Mode & MODE_GROW_BY_LSEEK )
> -		printf("%s: %d DEBUG lseeking past end of file, writting a \"w\"\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_OFFSET )
> -		printf("%s: %d DEBUG3 %d<byteoffset>%d per word pattern multi-writers.\n",
> -		    Progname, Pid, STATIC_NUM, STATIC_NUM);
> -	    else if ( Pattern == PATTERN_PID )
> -		printf("%s: %d DEBUG3 <pid><byteoffset><pid> per word pattern - 1 writer\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_ASCII )
> -		printf("%s: %d DEBUG3 ascii pattern (vi'able)- allows multiple writers\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_ALT )
> -		printf("%s: %d DEBUG3 alt bit pattern - allows multiple writers\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_CHKER )
> -		printf("%s: %d DEBUG3 checkerboard pattern - allows multiple writers\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_CNTING )
> -		printf("%s: %d DEBUG3 counting pattern - allows multiple writers\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_RANDOM )
> -		printf("%s: %d DEBUG3 random integer pattern - no write/file checking\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_ONES )
> -		printf("%s: %d DEBUG3 all ones pattern - allows multiple writers\n",
> -		    Progname, Pid);
> -	    else if ( Pattern == PATTERN_ZEROS )
> -		printf("%s: %d DEBUG3 all zeros pattern - allows multiple writers\n",
> -		    Progname, Pid);
> -	
> -	    else
> -		printf("%s: %d DEBUG3 unknown pattern\n",
> -		    Progname, Pid);
> -	    if ( bytes_to_consume )
> -	        printf("%s: %d DEBUG3 bytes_to_consume = %d\n",
> -		    Progname, Pid, bytes_to_consume);
> -	    printf("%s: %d DEBUG3 Maxerrs = %d, pre_alloc_space = %d, filelocking = %d\n", 
> -		Progname, Pid, Maxerrs, pre_alloc_space, lockfile);
> -
> -	    printf("%s: %d DEBUG3 Debug = %d, remove files in cleanup : %d\n",
> -		Progname, Pid, Debug, remove_files);
> -
> -	    printf("%s: %d DEBUG3 Mode = %#o\n", Progname, Pid, Mode);
> -
> -	    if ( open_flags == RANDOM_OPEN )
> -	       printf("%s: %d DEBUG3 open_flags = (random), io_type = %#o\n", Progname,
> -		 Pid, io_type);
> -	    else
> -	       printf("%s: %d DEBUG3 open_flags = %#o, io_type = %#o\n", Progname,
> -		 Pid, open_flags, io_type);
> -
> -	    if ( Mode & MODE_RAND_SIZE ) {
> -	        printf("%s: %d DEBUG3 random write/trunc:  min=%d, max=%d, mult = %d\n",
> -		    Progname, Pid, min_size, max_size, mult_size);
> -	    }
> -	    else {
> -		printf("%s: %d DEBUG3 grow_incr = %d\n", 
> -		    Progname, Pid, grow_incr);
> -	    }
> -	    if ( Mode & MODE_RAND_LSEEK ) {
> -		if ( max_lseek == LSK_EOF )
> -	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=<endoffile>\n",
> -		    Progname, Pid, min_lseek);
> -		else if ( max_lseek == LSK_EOFPLUSGROW )
> -	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=<endoffile+iosize>\n",
> -		    Progname, Pid, min_lseek);
> -		else if ( max_lseek == LSK_EOFMINUSGROW )
> -	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=<endoffile-iosize>\n",
> -		    Progname, Pid, min_lseek);
> -		else
> -	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=%d\n",
> -		    Progname, Pid, min_lseek, max_lseek);
> -	    }
> -
> -	    printf("%s: %d DEBUG3 check write interval = %d, check file interval = %d\n",
> -		Progname, Pid, write_check_inter, file_check_inter);
> -
> -	    printf("%s: %d DEBUG3 trunc interval = %d, trunc_incr = %d\n",
> -		Progname, Pid, trunc_inter, trunc_incr);
> -
> -	    if ( no_file_check )
> -		printf("%s: %d DEBUG3 no whole file checking will be done\n",
> -		    Progname, Pid);
> -	    
> -	    if ( unlink_inter_ran == -1 ) {
> -		printf("%s: %d DEBUG3 unlink_inter = %d\n", 
> -		        Progname, Pid, unlink_inter);
> -	    } else {
> -		printf("%s: %d DEBUG3 unlink_inter = %d, unlink_inter_ran = %d\n", 
> -                        Progname, Pid, unlink_inter, unlink_inter_ran);
> -	    }  
> -
> -	    if ( Debug > 8 ) {
> -	       num=sizeof(Open_flags)/sizeof(int);
> -	       printf("%s: %d DEBUG9 random open flags values:\n", Progname, Pid);
> -	       for(ind=0; ind<num; ind++) {
> -		    printf("\t%#o\n", Open_flags[ind]);
> -	       }
> -	    }
> -	}  /* end of DEBUG > 2 */
> -
> -	if ( Debug > 1 && num_procs > 1 ) {
> -	    printf("%s: %d DEBUG2 about to fork %d more copies\n", Progname,
> -		Opid, num_procs-1);
> -	}
> -
> -	fflush(stdout);	/* ensure pending i/o is flushed before forking */
> -	fflush(stderr);
> -
> -	forker(num_procs, forker_mode, Progname);
> -
> -	Pid=getpid();	/* reset after the forks */
> -	/*
> -	 * If user specified random seed(s), get that random seed value.
> -	 * get random seed if it was not specified by the user.
> -	 * This is done after the forks, because pid is used to get the seed.
> -         */
> -	if ( Nseeds == 1 ) {
> -	    /*
> -	     * If only one seed specified, all processes will get that seed. 
> -	     */
> -	    Seed=Seeds[0];
> -	} else if ( Nseeds > 1 ) {
> -	    /*
> -	     * More than one seed was specified.
> -	     * The original process gets the first seed.  Each
> -	     * process will be get the next seed in the specified list.
> -	     */
> -	    if ( Opid == Pid ) {
> -		Seed=Seeds[0];
> -	    } else {
> -		/*
> -		 * If user didn't specify enough seeds, use default method.
> -		 */
> -		if ( Forker_npids >= Nseeds ) 
> -	    	    Seed=time(0) + Pid;  /* default random seed */
> -		else {
> -		    Seed=Seeds[Forker_npids];
> -		}
> -	    }
> -	} else {
> -	    /* 
> -	     * Generate a random seed based on time and pid.
> -	     * It has a good chance of being unique for each pid.
> -	     */
> -	    Seed=time(0) + Pid;  /* default random seed */
> -	}
> -
> -	random_range_seed(Seed);
> -
> -        if ( using_random && Debug > 0 )
> -	    printf("%s%s: %d DEBUG1 Using random seed of %d\n",
> -		Progname, TagName, Pid, Seed);
> -
> -	if ( unlink_inter_ran > 0 ) {
> -	    /*
> -	     * Find unlinking file interval.  This must be done after
> -	     * the seed was set.   This allows multiple copies to
> -	     * get different intervals.
> -	     */
> -	    tmp=unlink_inter;
> -	    unlink_inter=random_range(tmp, unlink_inter_ran, 1, NULL);
> -
> -	    if ( Debug > 2 )
> -		printf("%s: %d DEBUG3 Unlink interval is %d (random %d - %d)\n",
> -		    Progname, Pid, unlink_inter, tmp, unlink_inter_ran);
> -	}
> -
> -	/*
> -	 * re-exec all childern if reexec is set to REXEC_DOIT.
> -	 * This is useful on MPP systems to get the
> -	 * child process on another PE.
> -	 */
> -	if ( reexec == REXEC_DOIT && Opid != Pid ) {
> -	    if ( exec_path == NULL ) {
> -		exec_path = argv[0];
> -		/* Get space for cmd (2 extra, 1 for - and 1 fro NULL */
> -		argv[0] = (char *)malloc(strlen(exec_path) + 2);
> -		sprintf(argv[0], "-%s", exec_path);
> -	    }
> -	  
> -	    if ( Debug > 2 )
> -	        printf("%s: %d DEBUG3 %s/%d: execvp(%s, argv)\n",
> -		    Progname, Pid, __FILE__, __LINE__, argv[0]);
> -
> -	    execvp(argv[0], argv);
> -        }
> -
> -	/*** begin filename stuff here *****/
> -	/*
> -	 * Determine the number of files to be dealt with
> -	 */
> -	if ( optind == argc ) {
> -		/*
> -		 * no cmd line files, therfore, set
> -		 * the default number of auto created files
> -		 */
> -		if ( ! num_auto_files && ! seq_auto_files )
> -			num_auto_files=1;
> -	}
> -	else {
> -		first_file_ind=optind;
> -		num_files += argc-optind;
> -	}
> -
> -	if ( num_auto_files ) {
> -		num_files += num_auto_files;
> -	}
> -
> -	if ( seq_auto_files ) {
> -		num_files += seq_auto_files;
> -	}
> -
> -	/*
> -	 * get space for file names
> -	 */
> -	if ((filenames=(char *)malloc(num_files*PATH_MAX)) == NULL) {
> -		fprintf(stderr, "%s%s: %d %s/%d: malloc(%d) failed: %s\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__, num_files*PATH_MAX,
> -			strerror(errno));
> -		exit(1);
> -	}
> -
> -	/*
> -	 * fill in filename cmd files then auto files.
> -	 */
> -
> -	num=0;
> -	if ( first_file_ind ) {
> -		for(ind=first_file_ind; ind<argc; ind++, num++) {
> -			strcpy((char *)filenames+(num*PATH_MAX), argv[ind]);
> -		}
> -	}
> -
> -	/*
> -	 * construct auto filename and insert them into filenames space
> -	 */
> -	for(ind=0;ind<num_auto_files; ind++, num++) {
> -		sprintf((char *)filenames+(num*PATH_MAX), "%s/%s.%d",
> -			auto_dir, auto_file, ind);
> -	}
> -
> -	/*
> -	 * construct auto seq filenames
> -	 */
> -	for(ind=1; ind<=seq_auto_files; ind++, num++) {
> -		sprintf((char *)filenames+(num*PATH_MAX), "%s/%s%d",
> -			auto_dir, auto_file, ind);
> -	}
> -
> -/**** end filename stuff ****/
> -
> -	if ( time_iterval > 0 )
> -		start_time=time(0);
> -
> -	/*
> -	 * get space for I/O buffer
> -	 */
> -	if ( grow_incr ) {
> -		if ((Buffer=(char *)malloc(grow_incr+Alignment)) == NULL) {
> -			fprintf(stderr, "%s%s: %d %s/%d: malloc(%d) failed: %s\n",
> -				Progname, TagName, Pid, __FILE__, __LINE__, grow_incr, strerror(errno));
> -			exit(1);
> -		}
> -		if ( Alignment )
> -		Buffer = Buffer + Alignment;
> -
> -	}
> -
> -	if ( Debug > 2 ) {
> -		printf("%s: %d DEBUG3 num_files = %d\n",
> -			Progname, Pid, num_files);
> -	}
> -
> -	if ( pre_alloc_space ) {
> -		if ( iterations == 0 ) {
> -		    fprintf(stderr, "%s%s: %d %s/%d: can NOT pre-alloc and grow forever\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__);
> -		    exit(1);
> -		}
> -		if ( Mode & MODE_RAND_SIZE ) {
> -		    fprintf(stderr,
> -			"%s%s: %d %s/%d: can NOT pre-alloc and do random io size\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__);
> -		    exit(1);
> -		}
> -
> -		total_grow_value=grow_incr * iterations;
> -
> -		/*
> -		 * attempt to limit 
> -		 */
> -		if ( bytes_to_consume && bytes_to_consume < total_grow_value ) {
> -			total_grow_value=bytes_to_consume;
> -		}
> -	}
> -
> -	/*
> -	 * If delaying between iterations, get amount time to
> -	 * delaysecs in clocks or usecs.
> -	 */
> -	if ( delaysecs ) {
> -	   delaytime=(int)((float)USECS_PER_SEC * delaysecs);
> -        }
> -
> -	/*
> -	 * This is the main iteration loop.
> -	 * Each iteration, all files can  be opened, written to,
> -	 * read to check the write, check the whole file, 
> -	 * truncated, and closed.   
> -	 */
> -	for(Iter_cnt=1; ! stop ; Iter_cnt++) {
> -
> -	    if ( iterations && Iter_cnt >= iterations+1 ) {
> -		strcpy(reason, "Hit iteration value");
> -		stop=1;
> -		continue;
> -	    }
> -
> -	    if (  (time_iterval > 0) && (start_time + time_iterval < time(0)) ) {
> -		sprintf(reason, "Hit time value of %d", time_iterval);
> -		stop=1;
> -		continue;
> -	    }
> -
> -	    if ( bytes_to_consume && bytes_consumed >= bytes_to_consume) {
> -		sprintf(reason, "Hit bytes consumed value of %d", bytes_to_consume);
> -		stop=1;
> -                continue;
> -            }
> -
> -	    /*
> -	     * This loop will loop through all files.
> -	     * Each iteration, a single file can  be opened, written to,
> -	     * read to check the write, check the whole file, 
> -	     * truncated, and closed.   
> -	     */
> -	    for(ind=0; ind<num_files; ind++) {
> -
> -		fflush(stdout);
> -		fflush(stderr);
> -
> -		filename=(char *)filenames+(ind*PATH_MAX);
> -		Fileinfo.filename=(char *)filenames+(ind*PATH_MAX);
> -
> -
> -		if ( open_flags ==  RANDOM_OPEN ) {
> -		   ret=Open_flags[random_range(0, sizeof(Open_flags)/sizeof(int)-1, 1, NULL)];
> -		}
> -
> -		else
> -		   ret=open_flags;
> -
> -		Fileinfo.openflags=ret;
> -
> -		if ( Debug > 3 ) {
> -		    printf("%s: %d DEBUG3 %s/%d: %d Open filename = %s, open flags = %#o %s\n",
> -			Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename, ret, 
> -		        openflags2symbols(ret, ",", 0));
> -		} else if ( Debug > 2 ) {
> -		    printf("%s: %d DEBUG3 %s/%d: %d filename = %s, open flags = %#o\n",
> -			Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename, ret);
> -		}
> -
> -		/*
> -		 * open file with desired flags.
> -		 */
> -		if ( (fd=open(filename, ret, 0777)) == -1 ) {
> -		    fprintf(stderr,
> -                        "%s%s: %d %s/%d: open(%s, %#o, 0777) returned -1, errno:%d %s\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__, filename, ret, errno, strerror(errno));
> -			handle_error();
> -			continue;
> -		}
> -
> -		Fileinfo.fd=fd;
> -
> -		lkfile(fd, LOCK_EX, LKLVL1);   /* lock if lockfile is LKLVL1 */
> -
> -		/*
> -		 * preallocation is only done once, if specified.
> -		 */
> -		if ( pre_alloc_space ) {
> -			if (pre_alloc(filename, fd, total_grow_value) != 0 ) {
> -				cleanup();
> -				exit(2);
> -			}
> -			if ( Debug > 1 ) {
> -				printf("%s: %d DEBUG2 %s/%d: pre_allocated %d for file %s\n",
> -				    Progname, Pid, __FILE__, __LINE__, total_grow_value, filename);
> -			}
> -			lkfile(fd, LOCK_UN, LKLVL1);   /* release lock */
> -			close(fd);
> -			Iter_cnt=0;	/* reset outside loop to restart from one */
> -			continue;
> -		}
> -
> -		/*
> -		 * grow file by desired amount.
> -		 * growfile() will set the Grow_incr variable and 
> -                 * possiblly update the Mode variable indicating
> -		 * if we are dealing with a FIFO file.
> -		 */
> -
> -		if (growfile(fd, filename, grow_incr, (unsigned char *)Buffer) != 0 ) {
> -			handle_error();
> -			lkfile(fd, LOCK_UN, LKLVL1);   /* release lock */
> -			close(fd);
> -			continue;
> -		}
> -
> -		/*
> -		 * check if last write is not corrupted
> -		 */
> -		if ( check_write(fd, write_check_inter, filename,
> -							Mode) != 0 ) {
> -		    handle_error();
> -                }
> -
> -		/*
> -		 * Check that whole file is not corrupted.
> -		 */
> -		if ( check_file(fd, file_check_inter, filename,
> -						no_file_check) != 0 ) {
> -		    handle_error();
> -		}
> -
> -		/*
> -		 * shrink file by desired amount if it is time 
> -		 */
> -
> -		if ( shrinkfile(fd, filename, trunc_incr, trunc_inter, Mode) != 0 ) {
> -		    handle_error();
> -		}
> -
> -		lkfile(fd, LOCK_UN, LKLVL1);   /* release lock */
> -
> -		if ( Debug > 4 )
> -		    printf("%s: %d DEBUG5 %s/%d: %d Closing file %s fd:%d \n", 
> -			Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename, fd);
> -		close(fd);
> -
> -		/*
> -		 * Unlink the file if that is desired
> -		 */
> -		if ( unlink_inter && (Iter_cnt % unlink_inter == 0) ) {
> -		
> -		    if ( Debug > 4 )
> -			printf("%s: %d DEBUG5 %s/%d: %d Unlinking file %s\n", 
> -			    Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename);
> -
> -		    unlink(filename);
> -		}
> -
> -	        /*
> -	         * delay while staying active for "delaysecs" seconds.
> -	         */
> -	        if ( delaytime ) {
> -		
> -		    int ct, end;
> -		    struct timeval curtime;
> -		    gettimeofday(&curtime, NULL);
> -		    ct=curtime.tv_sec*USECS_PER_SEC + curtime.tv_usec;
> -		    end=ct+delaytime;
> -                    while ( ct < end ) {
> -
> -		        gettimeofday(&curtime, NULL);
> -		        ct=curtime.tv_sec*USECS_PER_SEC + curtime.tv_usec;
> -		    }
> -	        }
> -	    }
> -	    /*
> -	     * if Iter_cnt == 0, then we pre allocated space to all files
> -	     * and we are starting outside loop over.  Set pre_alloc_space
> -	     * to zero otherwise we get in infinite loop
> -	     */
> -	    if ( Iter_cnt == 0 ) {
> -		pre_alloc_space=0;
> -	    }
> -	}   /* end iteration for loop */
> -
> -
> -        if ( Debug ) {
> -	    printf("%s%s: %d %s/%d: DONE %d iterations to %d files. %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, num_files, reason);
> -	}
> -	fflush(stdout);
> -	fflush(stderr);
> -
> -	cleanup();
> -
> -	if ( Errors ) {
> -		if ( Debug > 2 ) {
> -		    printf("%s%s: %d DEBUG3 %d error(s) encountered\n",
> -			Progname, TagName, Pid, Errors);
> -		    printf("%s%s: %d DEBUG3 %s/%d: exiting with value of 1\n", Progname, TagName, Pid, __FILE__, __LINE__);
> -		}
> -		exit(1);
> -	}
> -	if ( Debug > 2 )
> -	    printf("%s%s: %d DEBUG3 %s/%d: no errors, exiting with value of 0\n", Progname, TagName, Pid, __FILE__, __LINE__);
> -	exit(0);
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -set_sig()
> -{
> -   int sig;
> -
> -	
> -        /*
> -         * now loop through all signals and set the handlers
> -         */
> -
> -        for (sig = 1; sig < NSIG; sig++) {
> -            switch (sig) {
> -                case SIGKILL:
> -                case SIGSTOP:
> -                case SIGCONT:
> -#ifdef SIGCKPT
> -	        case SIGCKPT:
> -#endif /* SIGCKPT */
> -#ifdef SIGRESTART
> -	        case SIGRESTART:
> -#endif /* SIGRESTART */
> -                case SIGCHLD:
> -                    break;
> -
> -                default:
> -                    signal(sig, sig_handler);
> -                break;
> -            }
> -        } /* endfor */
> -
> -
> -        return 0;
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -void
> -sig_handler(sig)
> -int sig;
> -{
> -    int exit_stat = 2;
> -
> -    if ( sig == SIGUSR2 ) {
> -	fprintf(stdout, "%s%s: %d %s/%d: received SIGUSR2 (%d) - stopping.\n",
> -	    Progname, TagName, Pid, __FILE__, __LINE__, sig);
> -        signal(sig, sig_handler);	/* allow us to get this signal more than once */
> -        
> -    } else if( sig == SIGINT ){
> -	/* The user has told us to cleanup, don't pretend it's an error. */
> -	exit_stat=0;
> -	if ( Debug != 0 ){
> -		fprintf(stderr, "%s%s: %d %s/%d: received unexpected signal: %d\n", Progname, TagName,
> -		    Pid, __FILE__, __LINE__, sig);
> -	}
> -    } else {
> -	fprintf(stderr, "%s%s: %d %s/%d: received unexpected signal: %d\n", Progname, TagName,
> -	    Pid, __FILE__, __LINE__, sig);
> -    }
> -
> -    notify_others();
> -    cleanup();
> -    if ( Debug > 2 ){
> -	printf("%s%s: %d DEBUG3 %s/%d: Exiting with a value of %d\n",
> -	       Progname, TagName, Pid, __FILE__, __LINE__, exit_stat);
> -    }
> -    exit(exit_stat);
> -}
> -
> -/***********************************************************************
> - * this function attempts to send SIGUSR2 to other growfiles processes
> - * telling them to stop.
> - *  
> - ***********************************************************************/
> -static void
> -notify_others()
> -{
> -    static int send_signals = 0;
> -    int ind;
> -    extern int Forker_pids[];
> -    extern int Forker_npids;
> -
> -    if ( Sync_with_others && send_signals == 0 ) {
> -
> -	send_signals=1; /* only send signals once */
> -
> -        for (ind=0; ind< Forker_npids; ind++) {
> -	    if ( Forker_pids[ind] != Pid ) {
> -	        if ( Debug > 1 )
> -		    printf("%s%s: %d DEBUG2 %s/%d: Sending SIGUSR2 to pid %d\n",
> -		        Progname, TagName, Pid, __FILE__, __LINE__, Forker_pids[ind]);
> -	        kill(Forker_pids[ind], SIGUSR2);
> -	    }
> -        }
> -    }
> -
> -}
> -
> -/***********************************************************************
> - * this function will count the number of errors encountered.
> - * This function will call upanic if wanted or cleanup and
> - * and exit is Maxerrs were encountered.
> - ***********************************************************************/
> -int
> -handle_error()
> -{
> -    Errors++;
> -
> -    if ( Maxerrs && Errors >= Maxerrs ) {
> -	printf("%s%s: %d %s/%d: %d Hit max errors value of %d\n", 
> -	    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, Maxerrs);
> -	notify_others();
> -	cleanup();
> -
> -        if ( Debug > 2 ) {
> -            printf("%s%s: %d DEBUG3 %d error(s) encountered\n",
> -                        Progname, TagName, Pid, Errors);
> -            printf("%s%s: %d DEBUG3 %s/%d: exiting with value of 1\n", Progname, TagName, Pid, __FILE__, __LINE__);
> -        }
> -
> -	exit(1);
> -    }
> -
> -    return 0;
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -cleanup()
> -{
> -    int ind;
> -
> -	if ( remove_files ) {
> -	    if ( Debug > 2 )
> -		printf("%s: %d DEBUG3 Removing all %d files\n", 
> -		    Progname, Pid, num_files);
> -	    for(ind=0; ind<=num_files; ind++) {
> -		unlink(filenames+(ind*PATH_MAX));
> -	    }
> -	}
> -	if ( using_random && Debug > 1 )
> -	    printf("%s%s: %d DEBUG2 Used random seed: %d\n",
> -		Progname, TagName, Pid, Seed);
> -	return 0;
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -void
> -usage()
> -{
> -	fprintf(stderr,
> -	"Usage: %s%s [-bhEluy][[-g grow_incr][-i num][-t trunc_incr][-T trunc_inter]\n",
> -	Progname, TagName );
> -	fprintf(stderr,
> -	"[-d auto_dir][-e maxerrs][-f auto_file][-N num_files][-w][-c chk_inter][-D debug]\n");
> -	fprintf(stderr,
> -	"[-s seed][-S seq_auto_files][-p][-P PANIC][-I io_type][-o open_flags][-B maxbytes]\n");
> -	fprintf(stderr,
> -	"[-r iosizes][-R lseeks][-U unlk_inter][-W tagname] [files]\n");
> -
> -	return;
> -
> -}	/* end of usage */
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -void
> -help()
> -{
> -	usage();
> -
> -fprintf(stdout, "\
> -  -h             Specfied to print this help and exit.\n\
> -  -b             Specfied to execute in sync mode.(def async mode)\n\
> -  -B maxbytes    Max bytes to consume by all files.  growfiles exits when more\n\
> -                 than maxbytes have been consumed. (def no chk)  If maxbytes ends\n\
> -                 with the letter 'b', maxbytes is multiplied by BSIZE\n\
> -  -C write_chk   Specifies how often to check the last write (default 1)\n\
> -  -c file_chk    Specifies how often to check whole file (default 0)\n\
> -  -d auto_dir    Specifies the directory to auto created files. (default .)\n\
> -  -D debug_lvl   Specifies the debug level (default 1)\n\
> -  -E             Print examples and exit\n\
> -  -e errs        The number errors that will terminate this program (def 100)\n\
> -  -f auto_file   Specifies the base filename files created. (default \"gf\")\n\
> -  -g grow_incr   Specfied to grow by incr for each num. (default 4096)\n\
> -                 grow_incr may end in b for blocks\n\
> -		 If -r option is used, this option is ignored and size is random\n\
> -  -H delay       Amount of time to delay between each file (default 0.0)\n\
> -  -I io_type Specifies io type: s - sync, p - polled async, a - async (def s)\n\
> -		 l - listio sync, L - listio async, r - random\n\
> -  -i iteration   Specfied to grow each file num times. 0 means forever (default 1)\n\
> -  -l             Specfied to do file locking around write/read/trunc\n\
> -		 If specified twice, file locking after open to just before close\n\
> -  -L time        Specfied to exit after time secs, must be used with -i.\n\
> -  -N num_files   Specifies the number of files to be created.\n\
> -                 The default is zero if cmd line files.\n\
> -                 The default is one if no cmd line files.\n\
> -  -n num_procs   Specifies the number of copies of this cmd.\n\
> -  -o op_type     Specifies open flages: (def O_RDWR,O_CREAT) op_type can be 'random'\n\
> -  -O offset      adjust i/o buffer alignment by offset bytes\n\
> -  -P PANIC       Specifies to call upanic on error.\n\
> -  -p             Specifies to pre-allocate space\n\
> -  -q pattern     pattern can be a - ascii, p - pid with boff, o boff (def)\n\
> -		 A - Alternating bits, r - random, O - all ones, z - all zeros,\n\
> -		 c - checkboard, C - counting\n\
> -  -R [min-]max   random lseek before write and trunc, max of -1 means filesz,\n\
> -		 -2 means filesz+grow, -3 filesz-grow. (min def is 0)\n\
> -  -r [min-]max   random io write size (min def is 1)\n\
> -  -S seq_auto_files Specifies the number of seqental auto files (default 0)\n\
> -  -s seed[,seed...] Specifies the random number seed (default time(0)+pid)\n\
> -  -t trunc_incr  Specfied the amount to shrink file. (default 4096)\n\
> -                 trunc_inter may end in b for blocks\n\
> -		 If -R option is used, this option is ignored and trunc is random\n\
> -  -T trunc_inter Specfied the how many grows happen before shrink. (default 0)\n\
> -  -u             unlink files before exit\n\
> -  -U ui[-ui2]    Unlink files each ui iteration (def 0)\n\
> -  -w             Specfied to grow via lseek instead of writes.\n\
> -  -W tag-name	 Who-am-i.  My Monster tag name.  (used by Monster).\n\
> -  -x		 Re-exec children before continuing - useful on MPP systems\n\
> -  -y             Attempt to sync copies - if one fails it will send sigusr2 to others\n\
> -  Action to each file every iteration is open, write, write check\n\
> -  file check, trunc and closed.\n");
> -
> -	return;
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -void
> -prt_examples(FILE *stream)
> -{
> -	/* This example creates 200 files in directory dir1.  It writes */
> -	/* 4090 bytes 100 times then truncates 408990 bytes off the file */
> -	/* The file contents are checked every 1000 grow. */
> -    fprintf(stream,
> -	 "# run forever: writes of 4090 bytes then on every 100 iterval\n\
> -# truncate file by 408990 bytes.  Done to 200 files in dir1.\n\
> -%s -i 0 -g 4090 -T 100 -t 408990 -l -C 10 -c 1000 -d dir1 -S 200\n\n", Progname);
> -
> -	/* same as above with 5000 byte grow and a 499990 byte tuncate */
> -    fprintf(stream,
> -	 "# same as above with writes of 5000 bytes and truncs of 499990\n\
> -%s -i 0 -g 5000 -T 100 -t 499990 -l -C 10 -c 1000 -d dir2 -S 200\n\n", Progname);
> -
> -	/* This example beats on opens and closes */
> -    fprintf(stream,
> -	 "# runs forever: beats on opens and closes of file ocfile - no io\n\
> -%s -i 0 -g 0 -c 0 -C 0 ocfile\n\n", Progname);
> -
> -    fprintf(stream,
> -	 "# writes 4096 to files until 50 blocks are written\n\
> -%s -i 0 -g 4096 -B 50b file1 file2\n\n", Progname);
> -	
> -    fprintf(stream,
> -	 "# write one byte to 750 files in gdir then unlinks them\n\
> -%s -g 1 -C 0 -d gdir -u -S 750\n\n", Progname);
> -
> -    fprintf(stream,
> -	"# run 30 secs: random iosize, random lseek up to eof\n\
> -%s -r 1-5000 -R 0--1 -i 0 -L 30 -C 1 g_rand1 g_rand2\n\n", Progname);
> -
> -    fprintf(stream,
> -	"# run 30 secs: grow by lseek then write single byte, trunc every 10 itervals\n\
> -%s -g 5000 -wlu -i 0 -L 30 -C 1 -T 10  g_sleek1 g_lseek2\n\n", Progname);
> -
> -    fprintf(stream, 
> -	"# run forever: 5 copies of random iosize, random lseek to beyond eof,\n\
> -# rand io types doing a trunc every 5 iterations, with unlinks.\n\
> -%s -i0 -r 1-50000 -R 0--2 -I r -C1 -l -n5 -u -U 100-200 gf_rana gf_ranb\n\n", 
> -	    Progname);
> -
> -    fprintf(stream, 
> -	"# run forever: 5 copies of random iosize, random lseek to beyond eof,\n\
> -# random open flags, rand io types doing a trunc every 10 iterations.\n\
> -%s -i0 -r 1-50000 -R 0--2 -o random -I r -C0 -l -T 20 -uU100-200 -n 5 gf_rand1 gf_rand2\n", 
> -	    Progname);
> -
> -
> -	return;
> -}
> -
> -/***********************************************************************
> - *
> - * The file descriptor current offset is assumed to be the end of the
> - * file.  
> - * Woffset will be set to the offset before the write.
> - * Grow_incr will be set to the size of the write or lseek write.
> - ***********************************************************************/
> -int
> -growfile(fd, file, grow_incr, buf)
> -int fd;
> -char *file;
> -int grow_incr;
> -unsigned char *buf;
> -{
> -   int noffset;
> -   int ret;
> -   /* REFERENCED */
> -   int cur_offset;
> -   char *errmsg;
> -   int fsize;		/* current size of file */
> -   int size_grew;	/* size the file grew */
> -   struct stat stbuf;
> -   int tmp = 0;
> -
> -        /*
> -         * Do a stat on the open file.
> -         * If the file is a fifo, set the bit in Mode variable.
> -         * This fifo check must be done prior to growfile() returning.
> -	 * Also get the current size of the file.
> -         */
> -        if ( fstat(fd, &stbuf) != -1 ) {
> -            if ( S_ISFIFO(stbuf.st_mode) ) {
> -		Fileinfo.mode |= MODE_FIFO;
> -                Mode |= MODE_FIFO;
> -                if ( Debug > 3 )
> -                    printf("%s: %d DEBUG4 %s/%d: file is a fifo - no lseek or truncs,\n",
> -                        Progname, Pid, __FILE__, __LINE__);
> -            }
> -	    fsize = stbuf.st_size;
> -
> -        } else {
> -	    fprintf(stderr, "%s%s: %d %s/%d: Unable to fstat(%d, &buf), errno:%d %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, fd, errno, strerror(errno));
> -
> -	    return -1;
> -	}
> -
> -
> -        if ( grow_incr <= 0 ) {   /* don't attempt i/o if grow_incr <= 0 */ 
> -
> -	    Grow_incr=grow_incr;
> -	    if ( Debug > 2 )
> -		printf("%s: %d DEBUG3 %s/%d: Not attempting to grow, growsize == %d\n",
> -		    Progname, Pid, __FILE__, __LINE__, grow_incr);
> -	    return grow_incr;
> -	}
> -
> -	if ( Mode & MODE_RAND_SIZE ) {
> -	    grow_incr=random_range(min_size, max_size, mult_size, &errmsg);
> -	    if (errmsg != NULL) {
> -		fprintf(stderr, "%s%s: %d %s/%d: random_range() failed - %s\n", Progname, TagName, Pid, __FILE__, __LINE__, errmsg);
> -		return -1;
> -	    }
> -	    Grow_incr=grow_incr;
> -	}
> -	else
> -	    Grow_incr=grow_incr;
> -
> -	if ( ! (Mode & MODE_FIFO) ) {
> -	    if ((cur_offset=lseek(fd,0,SEEK_CUR)) == -1 ) {
> -	        fprintf(stderr, "%s%s: %d %s/%d: tell failed: %s\n",
> -		    Progname, TagName, Pid, __FILE__, __LINE__, strerror(errno));
> -	        return -1;
> -	    }
> -        }
> -
> -	if ( Mode & MODE_GROW_BY_LSEEK ) {
> -                Woffset=fsize;
> -		if ( Debug > 2 ) {
> -		    printf("%s: %d DEBUG3 %s/%d: Current size of file is %d\n", Progname,
> -			Pid, __FILE__, __LINE__, Woffset);
> -		    printf("%s: %d DEBUG3 %s/%d: lseeking to %d byte with SEEK_END\n", Progname,
> -			Pid, __FILE__, __LINE__, grow_incr-1);
> -		}
> -
> -		if ((noffset=lseek(fd, grow_incr-1, SEEK_END)) == -1 ) {
> -			fprintf(stderr, "%s%s: %s/%d: lseek(fd, %d, SEEK_END) failed: %s\n",
> -				Progname, TagName, __FILE__, __LINE__, grow_incr-1, strerror(errno));
> -			return -1;
> -		}
> -
> -		lkfile(fd, LOCK_EX, LKLVL0);	 /* get exclusive lock */
> -		
> -#if NEWIO
> -		ret=lio_write_buffer(fd, io_type, "w", 1, SIGUSR1, &errmsg,0);
> -#else
> -		ret=write_buffer(fd, io_type, "w", 1, 0, &errmsg); 
> -#endif
> -
> -		if ( ret != 1 ) {
> -			fprintf(stderr, "%s%s: %d %s/%d: %d %s\n", 
> -			    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
> -			if ( ret == -ENOSPC ) {
> -				cleanup();
> -				exit(2);
> -			}
> -		}
> -/***
> -		write(fd, "w", 1);
> -****/
> -
> -		lkfile(fd, LOCK_UN, LKLVL0);
> -
> -                if ( Debug > 2 )
> -                    printf("%s: %d DEBUG3 %s/%d: %d wrote 1 byte to file\n",
> -                            Progname, Pid, __FILE__, __LINE__, Iter_cnt);
> -
> -	} else {  /* end of grow by lseek */
> -
> -		if ( Fileinfo.openflags & O_APPEND ) {
> -		   /*
> -		    * Deal with special case of the open flag containing O_APPEND.
> -		    * If it does, the current offset does not matter since the write
> -		    * will be done end of the file.
> -		    */
> -		    if ( Debug > 4 )
> -			printf("%s: %d DEBUG5 %s/%d: dealing with O_APPEND condition\n",
> -			    Progname, Pid, __FILE__, __LINE__ );
> -		    lkfile(fd, LOCK_EX, LKLVL0);	 /* get exclusive lock */
> -
> -		    /*
> -		     * do fstat again to get size of the file.
> -		     * This is done inside a file lock (if locks are being used).
> -		     */
> -        	    if ( fstat(fd, &stbuf) != -1 ) {
> -            		Woffset = stbuf.st_size;
> -        	    } else {
> -            		fprintf(stderr, "%s%s: %d %s/%d: Unable to fstat(%d, &buf), errno:%d %s\n",
> -                	Progname, TagName, Pid, __FILE__, __LINE__, fd, errno, strerror(errno));
> -	
> -			lkfile(fd, LOCK_UN, LKLVL0);     /* release lock */
> -            		return -1;
> -        	    }
> -		    if ( Debug > 2 )
> -			printf("%s: %d DEBUG3 %s/%d: dealing with O_APPEND condition (offset:fsz:%d)\n",
> -			    Progname, Pid, __FILE__, __LINE__, (int)stbuf.st_size);
> -
> -
> -		} else if ( Mode & MODE_RAND_LSEEK ) {
> -                   if ( max_lseek == LSK_EOF ) {	/* within file size */
> -                        noffset=random_range(min_lseek, fsize, 1, NULL);
> -                   }		
> -		   else if ( max_lseek == LSK_EOFPLUSGROW ) {	
> -		        /* max to beyond file size */
> -			noffset=random_range(min_lseek, fsize+grow_incr, 1, NULL);
> -		   }
> -		   else if ( max_lseek == LSK_EOFMINUSGROW ) {	
> -		        /* 
> -			 * Attempt to not grow the file.
> -			 * If the i/o will fit from min_lseek to EOF,
> -			 * pick offset to allow it to fit.
> -			 * Otherwise, pick the min_lseek offset and grow
> -			 * file by smallest amount.
> -			 * If min_lseek is != 0, there will be a problem
> -			 * with whole file checking if file is ever smaller
> -			 * than min_lseek.
> -			 */
> -			if ( fsize <= min_lseek + grow_incr )
> -			    noffset=min_lseek;  /* file will still grow */
> -			else
> -			    noffset=random_range(min_lseek, fsize-grow_incr, 1, NULL);
> -		   }
> -                   else {
> -                        noffset=random_range(min_lseek, max_lseek, 1, NULL);
> -                   }
> -
> -		   if ((Woffset=lseek(fd, noffset, SEEK_SET)) == -1 ) {
> -                        fprintf(stderr, "%s%s: %d %s/%d: lseek(%d, %d, SEEK_SET) l2 failed: %s\n",
> -                                Progname, TagName, Pid, __FILE__, __LINE__, fd, noffset, strerror(errno));
> -                        return -1;
> -		   }
> -                   else if ( Debug > 2 )
> -                        printf("%s: %d DEBUG3 %s/%d: lseeked to random offset %d (fsz:%d)\n",
> -                            Progname, Pid, __FILE__, __LINE__, Woffset,
> -			    (int)stbuf.st_size);
> -
> -                }
> -
> -		/*
> -		 * lseek to end of file only if not fifo
> -		 */
> -		else if ( ! (Mode & MODE_FIFO) ) {
> -		    if ((Woffset=lseek(fd, 0, SEEK_END)) == -1 ) {
> -			fprintf(stderr, "%s%s: %d %s/%d: lseek(fd, 0, SEEK_END) failed: %s\n",
> -				Progname, TagName, Pid, __FILE__, __LINE__, strerror(errno));
> -			return -1;
> -		    }
> -                    else if ( Debug > 2 )
> -                        printf("%s: %d DEBUG3 %s/%d: lseeked to end of file, offset %d\n",
> -                            Progname, Pid, __FILE__, __LINE__, Woffset);
> -		}
> -
> -		if ( Pattern == PATTERN_OFFSET )
> -		    datapidgen(STATIC_NUM, buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_PID )
> -		    datapidgen(Pid, buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_ASCII )
> -		    dataasciigen(NULL, (char *)buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_RANDOM )
> -		    databingen('r', buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_ALT )
> -		    databingen('a', buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_CHKER )
> -		    databingen('c', buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_CNTING )
> -		    databingen('C', buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_ZEROS )
> -		    databingen('z', buf, grow_incr, Woffset);
> -		else if ( Pattern == PATTERN_ONES )
> -		    databingen('o', buf, grow_incr, Woffset);
> -		else
> -		    dataasciigen(NULL, (char *)buf, grow_incr, Woffset);
> -
> -		if ( Debug > 2 )
> -		    printf("%s: %d DEBUG3 %s/%d: attempting to write %d bytes\n",
> -			Progname, Pid, __FILE__, __LINE__, grow_incr);
> -
> -		lkfile(fd, LOCK_EX, LKLVL0);	 /* get exclusive lock */
> -
> -/*****
> -		ret=write(fd, buf, grow_incr);
> -
> -		tmp=tell(fd);
> -
> -		lkfile(fd, LOCK_UN, LKLVL0);	
> -
> -		if ( ret != grow_incr) {
> -			fprintf(stderr, "%s: %s/%d: write failed: %s\n",
> -				Progname, __FILE__, __LINE__, strerror(errno));
> -			return -1;
> -		}
> -*****/
> -
> -#if NEWIO
> -		ret=lio_write_buffer(fd, io_type, (char *)buf, grow_incr,
> -			 SIGUSR1, &errmsg,0);
> -#else
> -		ret=write_buffer(fd, io_type, buf, grow_incr, 0, &errmsg);
> -#endif
> -
> -		if( Mode & MODE_FIFO ){
> -			/* If it is a fifo then just pretend the file
> -			 * offset is where we think it should be.
> -			 */
> -			tmp = Woffset + grow_incr;
> -		}
> -		else{
> -			if( (tmp=lseek(fd,0,SEEK_CUR)) < 0 ){ /* get offset after the write */
> -				fprintf(stderr, "%s%s: %s/%d: tell(2) failed: %d  %s\n",
> -					Progname, TagName, __FILE__, __LINE__, errno, strerror(errno) );
> -				return -1;
> -			}
> -		}
> -
> -		lkfile(fd, LOCK_UN, LKLVL0);	
> -
> -		if ( ret != grow_incr ) {
> -			fprintf(stderr, "%s%s: %d %s/%d: %d %s\n", 
> -			    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
> -			if ( ret == -ENOSPC ) {
> -				cleanup();
> -				exit(2);
> -			}
> -			return -1;
> -		}
> -
> -		/*
> -		 * Check for a condition where the file was truncated just before
> -		 * the write. 
> -		 */
> -		if ( tmp != Woffset + grow_incr) {
> -		    /*
> -		     * The offset after the write was not as expected.
> -		     * This could be caused by the following:
> -		     *  - file truncated after the lseek and before the write.
> -		     *  - the file was written to after fstat and before the write
> -		     *    and the file was opened with O_APPEND.
> -		     *
> -		     * The pattern written to the file will be considered corrupted.
> -		     */
> -		    if ( Debug > 0 && lockfile ) {
> -		        printf("%s%s: %d DEBUG1 %s/%d: offset after write(%d) not as exp(%d+%d=%d)\n", 	
> -			    Progname, TagName, Pid, __FILE__, __LINE__, tmp, Woffset, grow_incr, Woffset+grow_incr);
> -			printf("%s%s: %d DEBUG1 %s/%d: %d Assuming file changed by another process, resetting offset:%d (expect pattern mismatch)\n",
> -				Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, tmp-grow_incr);
> -		    }
> -		    if( Debug > 4 ){
> -			printf("%s: %d DEBUG5 %s/%d: about to chop Woffset.  tmp=%d, grow_incr=%d, Woffset was %d\n",
> -			       Progname, Pid, __FILE__, __LINE__, tmp, grow_incr, Woffset);
> -		    }
> -		    Woffset=tmp-grow_incr;
> -		    if( Woffset < 0 )
> -			Woffset = 0;
> -		}
> -
> -	}  /* end of grow by write */
> -
> -
> -	/*
> -	 * Woffset - holds start of grow (start of write expect in grow by lseek)
> -	 * Grow_incr - holds size of grow (write).
> -	 * fsize - holds size of file before write
> -	 */
> -	size_grew=(Woffset + Grow_incr) - fsize;
> -	if ( Debug > 1) {
> -	     if ( Mode & MODE_FIFO ) {
> -		printf("%s: %d DEBUG2 %s/%d: file is fifo, %d wrote %d bytes\n",
> -		    Progname, Pid, __FILE__, __LINE__, Grow_incr, Iter_cnt);
> -	     }
> -
> -	     else if ( size_grew > 0 )
> -		printf("%s: %d DEBUG2 %s/%d: %d wrote %d bytes(off:%d), grew file by %d bytes\n",
> -                        Progname, Pid, __FILE__, __LINE__, Iter_cnt, Grow_incr, Woffset, size_grew);
> -	     else
> -		printf("%s: %d DEBUG2 %s/%d: %d wrote %d bytes(off:%d), did not grow file\n",
> -                        Progname, Pid, __FILE__, __LINE__, Iter_cnt, Grow_incr, Woffset);
> -	}
> -
> -    	bytes_consumed += size_grew;
> -	return 0;
> -
> -}	/* end of growfile */
> -
> -/***********************************************************************
> - * shrinkfile file by trunc_incr.  file can not be made smaller than
> - * size zero.  Therefore, if trunc_incr is larger than file size,
> - * file will be truncated to zero.
> - * The file descriptor current offset is assumed to be the end of the
> - * file.
> - *
> - ***********************************************************************/
> -int
> -shrinkfile(fd, filename, trunc_incr, trunc_inter, just_trunc)
> -int fd;
> -char *filename;
> -int trunc_incr;
> -int trunc_inter;	/* interval */
> -int just_trunc;		/* lseek has already been done for you */
> -{
> -    static int shrink_cnt = 0;
> -    int cur_offset;
> -    int new_offset;
> -    int ret;
> -
> -	shrink_cnt++;
> -
> -	if ( trunc_inter == 0 || (shrink_cnt % trunc_inter != 0))  {
> -	    if ( Debug > 3 )
> -		printf("%s: %d DEBUG4 %s/%d: Not shrinking file - not time, iter=%d, cnt=%d\n",
> -		    Progname, Pid, __FILE__, __LINE__, trunc_inter, shrink_cnt);
> -	    return 0;	/* not this time */
> -	}
> -
> -	if ( Mode & MODE_FIFO ) {
> -	    if ( Debug > 5 )
> -		printf("%s: %d DEBUG5 %s/%d: Not attempting to shrink a FIFO\n",
> -		    Progname, Pid, __FILE__, __LINE__);
> -	    return 0;	/* can not truncate fifo */
> -	}
> -
> -	lkfile(fd, LOCK_EX, LKLVL0);
> -
> -	if ((cur_offset=lseek(fd,0,SEEK_CUR)) == -1 ) {
> -	    fprintf(stderr, "%s%s: %d %s/%d: tell(%d) failed: %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, fd, strerror(errno));
> -	    lkfile(fd, LOCK_UN, LKLVL0);
> -	    return -1;
> -	}
> -
> -        if ( Mode & MODE_RAND_LSEEK ) {
> -            if ( max_lseek <= -1 ) {
> -                if ( (new_offset=file_size(fd)) == -1 ) {
> -	            lkfile(fd, LOCK_UN, LKLVL0);
> -		    return -1;
> -		}
> -			
> -		if ( new_offset < min_lseek )
> -		    new_offset=min_lseek;
> -		else
> -                    new_offset=random_range(min_lseek, new_offset, 1, NULL);
> -            }
> -            else {
> -                new_offset=random_range(min_lseek, max_lseek, 1, NULL);
> -            }
> -        }
> -
> -	else {	/* remove trunc_incr from file */
> -
> -	    new_offset = cur_offset-trunc_incr;
> -
> -	    if ( new_offset < 0 )
> -		new_offset=0;
> -	}
> -
> -	ret=ftruncate(fd, new_offset );
> -	if( (ret == 0) && (Debug > 3) ){
> -                printf("%s: %d DEBUG4 %s/%d: ftruncated to offset %d, %d bytes from end\n",
> -                    Progname, Pid, __FILE__, __LINE__, new_offset, trunc_incr);
> -	}
> -
> -	lkfile(fd, LOCK_UN, LKLVL0);
> -
> -	if ( ret == -1 ) {
> -		fprintf(stderr, "%s%s: %d %s/%d: ftruncate failed: %s\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__, strerror(errno));
> -		return -1;
> -	}
> -
> -	if ( Debug > 2 ) {
> -	    printf("%s: %d DEBUG2 %s/%d: trunc file by %d bytes, to size of = %d bytes\n",
> -		Progname, Pid, __FILE__, __LINE__, cur_offset-new_offset, new_offset);
> -	}
> -	
> -
> -        bytes_consumed -= (cur_offset - new_offset);
> -	return 0;
> -
> -}	/* end of shrinkfile */
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -check_write(fd, cf_inter, filename, mode)
> -int fd;
> -int cf_inter;   /* check file interval */
> -char *filename; /* needed for error messages */
> -int mode;       /* write mode */
> -{
> -    int fsize;
> -    static int cf_count = 0;
> -    int ret = 0;
> -    int tmp;
> -    char *errmsg;
> -    char *ptr;
> -
> -    cf_count++;
> -
> -    if ( cf_inter == 0 || (cf_count % cf_inter != 0)) {
> -	if ( Debug > 4 )
> -	    printf("%s: %d DEBUG5 %s/%d: no write check, not time iter=%d, cnt=%d\n",
> -		Progname, Pid, __FILE__, __LINE__, cf_inter, cf_count);
> -	return 0;	 /* no check done */
> -    }
> -
> -    if ( Grow_incr <= 0 ) {
> -        if ( Debug > 3 )
> -	    printf("%s: %d DEBUG4 %s/%d: No write validation,  Grow_incr = %d, offset = %d\n",
> -	        Progname, Pid, __FILE__, __LINE__, Grow_incr, Woffset);
> -        return 0;	/* no check */
> -    }
> -
> -
> -    
> -    /*	
> -     * Get the shared file lock.  We need to hold the lock from before
> -     * we do the stat until after the read.
> -     */
> -    lkfile(fd, LOCK_SH, LKLVL0);
> -
> -    if ((fsize=file_size(fd)) == -1 )  {
> -        lkfile(fd, LOCK_UN, LKLVL0);
> -        return -1;
> -
> -    } else if ( fsize <= Woffset ) {
> -	/*
> -	 * The file was truncated between write and now.
> -	 * The contents of our last write is totally gone, no check.
> -	 */
> -	if ( Debug > 1 )
> -	    printf("%s%s: %d DEBUG2 %s/%d: %d File size (%d) smaller than where last wrote (%d)- no write validation\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, fsize, Woffset);
> -        lkfile(fd, LOCK_UN, LKLVL0);
> -        return 0;	/* no validation, but not an error */
> - 
> -    } else if ( fsize < (Woffset + Grow_incr)) {
> -	/*
> -	 * The file was truncated between write and now.
> -	 * Part of our last write has been truncated, adjust our Grow_incr
> -	 * to reflect this.
> -	 */
> -
> -	tmp=Grow_incr;
> -	Grow_incr=fsize-Woffset;
> -
> -	if ( Debug > 1 )  {
> -
> -	    printf("%s%s: %d DEBUG2 %s/%d: %d fsz:%d, lost(%d)of wrt(off:%d, sz:%d), adj=%d\n",
> -	    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, fsize, tmp-Grow_incr, Woffset, tmp, Grow_incr);
> -	}
> -
> -    }
> -
> -    if ( Debug > 2 )
> -        printf("%s: %d DEBUG3 %s/%d: about to do write validation, offset = %d, size = %d\n",
> -	    Progname, Pid, __FILE__, __LINE__, Woffset, Grow_incr);
> -
> -    if ( ! (mode & MODE_FIFO)  ) {
> -
> -        if ( lseek(fd, Woffset, 0) == -1 ) {
> -            fprintf(stderr, "%s%s: %d %s/%d: lseek(fd, %d, 0) failed: %s\n",
> -	        Progname, TagName, Pid, __FILE__, __LINE__, Woffset, strerror(errno));
> -        }
> -        if ( Debug > 3 )
> -	    printf("%s: %d DEBUG4 %s/%d: lseeked to offset:%d\n",
> -	        Progname, Pid, __FILE__, __LINE__, Woffset);
> -    }
> -
> -    /*
> -     * Read last writes data
> -     */
> -#if NEWIO
> -    ret=lio_read_buffer(fd, io_type, Buffer, Grow_incr, SIGUSR1, &errmsg,0);
> -#else
> -    ret=read_buffer(fd, io_type, Buffer, Grow_incr, 0, &errmsg);
> -#endif
> -
> -    /*
> -     * report the error and debug information before releasing
> -     * the file lock
> -     */
> -    if ( ret != Grow_incr ) {
> -        fprintf(stderr, "%s%s: %d %s/%d: %d CW %s\n", Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
> -        {
> -	    struct stat stbuf;
> -	    fstat(fd, &stbuf);
> -	    if ( Debug > 2 )
> -	        printf("%s%s: %d DEBUG3 %s/%d: fd:%d, offset:%d, fsize:%d, openflags:%#o\n",
> -	            Progname, TagName, Pid, __FILE__, __LINE__, fd,
> -		    (int)lseek(fd,SEEK_CUR,0),	/* FIXME: 64bit/LFS ? */
> -		    (int)stbuf.st_size,
> -		    Fileinfo.openflags);
> -        }
> -
> -	lkfile(fd, LOCK_UN, LKLVL0);
> -	return 1;
> -    }
> -
> -
> -    lkfile(fd, LOCK_UN, LKLVL0);
> -
> -    if ( Mode & MODE_GROW_BY_LSEEK ) {
> -	/* check that all zeros upto last character */
> -	for(ptr=Buffer; ptr < (Buffer+Grow_incr-1); ptr++) {
> -	    if ( *ptr != '\0' ) {
> -	        fprintf(stderr,
> -		    "%s%s: %d %s/%d: data mismatch at offset %d, exp:%#o(zerofilled), act:%#o in file %s\n",
> -		    Progname, TagName, Pid, __FILE__, __LINE__, 
> -		    (int)(Woffset+(Grow_incr-(Buffer-ptr))),
> -		    0, *ptr, filename);
> -	        fflush(stderr);
> -		return 1;
> -	    }
> -	}
> -	/* check that the last char is a 'w' */
> -	if ( *ptr != 'w' ) {
> -	    fprintf(stderr,
> -	  "%s%s: %d %s/%d: data mismatch at offset %d, exp:%#o(zerofilled), act:%#o in file %s\n",
> -	        Progname, TagName, Pid, __FILE__, __LINE__, 
> -		(int)(Woffset+(Grow_incr-(Buffer-ptr))), 'w',
> -		*ptr, filename);
> -	    fflush(stderr);
> -	    return 1;
> -	}
> -	return 0;   /* all is well */
> -	
> -    }
> -    else if ( Pattern == PATTERN_OFFSET )
> -	ret=datapidchk(STATIC_NUM, Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_PID )
> -	ret=datapidchk(Pid, Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_ASCII )
> -        ret=dataasciichk(NULL, Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_RANDOM )
> -	;	/* no check for random */
> -    else if ( Pattern == PATTERN_ALT )
> -        ret=databinchk('a', Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_CHKER )
> -        ret=databinchk('c', Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_CNTING )
> -  	ret=databinchk('C', Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_ZEROS )
> -    	ret=databinchk('z', Buffer, Grow_incr, Woffset, &errmsg);
> -    else if ( Pattern == PATTERN_ONES )
> -    	ret=databinchk('o', Buffer, Grow_incr, Woffset, &errmsg);
> -    else
> -	ret=dataasciichk(NULL, Buffer, Grow_incr, Woffset, &errmsg);
> -
> -    if ( ret >= 0 ) {
> -	fprintf(stderr, "%s%s: %d %s/%d: %d CW %s in file %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg, filename);
> -
> -	if ( Debug > 0 )
> -	    printf("%s%s: %d DEBUG1 %s/%d: **fd:%d, lk:%d, offset:%d, sz:%d open flags:%#o %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, fd, lockfile, 
> -		Woffset, Grow_incr, Fileinfo.openflags, openflags2symbols(Fileinfo.openflags, ",", 0));
> -
> -	fflush(stderr);
> -	return 1;
> -    }
> -
> -    if ( Debug > 6 )
> -        printf("%s: %d DEBUG7 %s/%d: No corruption detected on write validation , offset = %d, size = %d\n",
> -            Progname, Pid, __FILE__, __LINE__, Woffset, Grow_incr);
> -
> -    return 0;	/* all is well */
> -}
> -
> -
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -check_file(fd, cf_inter, filename, no_file_check)
> -int fd;
> -int cf_inter;	/* check file interval */
> -char *filename;	/* needed for error messages */
> -int no_file_check;	/* if set, do not do file content check */
> -{
> -    int fsize;
> -    static int cf_count = 0;
> -    char *buf;
> -    int ret;
> -    int ret_val = 0;
> -    int rd_cnt;
> -    int rd_size;
> -    char *errmsg;
> -
> -	cf_count++;
> -
> -	if ( cf_inter == 0 || (cf_count % cf_inter != 0)) {
> -		if ( Debug > 4 )
> -		    printf("%s: %d DEBUG5 %s/%d: No file check - not time, iter=%d, cnt=%d\n",
> -			Progname, Pid, __FILE__, __LINE__, cf_inter, cf_count);
> -		return 0;	 /* no check done */
> -	}
> -
> -	/*
> -	 * if we can't determine file content, don't bother checking
> -	 */
> -        if ( no_file_check ) {
> -		if ( Debug > 4 )
> -		    printf("%s: %d DEBUG5 %s/%d: No file check, lseek grow or random lseeks\n",
> -			Progname, Pid, __FILE__, __LINE__);
> -		return 0;
> -	}
> -
> -	/*
> -	 * Lock the file.  We need to have the file lock before
> -	 * the stat and until after the last read to prevent
> -	 * a trunc/truncate from "corrupting" our data.
> -	 */
> -	lkfile(fd, LOCK_SH, LKLVL0);
> -	
> -	if ((fsize=file_size(fd)) == -1 )  {
> -	    lkfile(fd, LOCK_UN, LKLVL0);
> -	    return -1;
> -	}
> -
> -        if ( fsize == 0 ) {
> -	    if ( Debug > 2 )
> -            printf("%s: %d DEBUG3 %s/%d: No file validation, file size == 0\n",
> -                Progname, Pid, __FILE__, __LINE__);
> -
> -	    lkfile(fd, LOCK_UN, LKLVL0);
> -	    return 0;
> -	}
> -
> -	if ( Debug > 2 )
> -            printf("%s: %d DEBUG3 %s/%d: about to do file validation\n",
> -	        Progname, Pid, __FILE__, __LINE__);
> -
> -        if ( fsize > MAX_FC_READ ) {
> -	    /*
> -	     * read the file in MAX_FC_READ chuncks.
> -	     */
> -
> -	    if ((buf=(char *)malloc(MAX_FC_READ)) == NULL ) {
> -	        fprintf(stderr, "%s%s: %s/%d: malloc(%d) failed: %s\n", Progname, TagName,
> -		    __FILE__, __LINE__, MAX_FC_READ, strerror(errno));
> -	       lkfile(fd, LOCK_UN, LKLVL0);
> -	       return -1;
> -	    }
> -
> -	    lseek(fd, 0, SEEK_SET);
> -
> -	    lkfile(fd, LOCK_SH, LKLVL0);  /* get lock on file before getting file size */
> -
> -	    rd_cnt=0;
> -	    while (rd_cnt < fsize ) {
> -	        if ( fsize - rd_cnt > MAX_FC_READ )
> -		    rd_size=MAX_FC_READ;
> -	        else
> -		    rd_size=fsize - rd_cnt;
> -				
> -#if NEWIO
> -	        ret=lio_read_buffer(fd, io_type, buf, rd_size,
> -		    SIGUSR1, &errmsg,0);
> -#else
> -	        ret=read_buffer(fd, io_type, buf, rd_size, 0, &errmsg);
> -#endif
> -
> -	        if (ret != rd_size ) {
> -		    fprintf(stderr, "%s%s: %d %s/%d: %d CFa %s\n", 
> -			Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
> -		    free(buf);
> -		    lkfile(fd, LOCK_UN, LKLVL0);
> -		    return -1;
> -	        }
> -/**
> -	        read(fd, buf, rd_size);
> -***/
> -
> -	        if ( Pattern == PATTERN_OFFSET )
> -	            ret=datapidchk(STATIC_NUM, buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_PID )
> -	            ret=datapidchk(Pid, buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_ASCII )
> -	            ret=dataasciichk(NULL, buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_RANDOM )
> -	   	  	;  /* no checks for random */
> -	        else if ( Pattern == PATTERN_ALT )
> -	            ret=databinchk('a', buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_CHKER )
> -	            ret=databinchk('c', buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_CNTING )
> -	            ret=databinchk('C', buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_ZEROS )
> -	            ret=databinchk('z', buf, rd_size, rd_cnt, &errmsg);
> -	        else if ( Pattern == PATTERN_ONES )
> -	            ret=databinchk('o', buf, rd_size, rd_cnt, &errmsg);
> -	        else
> -	            ret=dataasciichk(NULL, buf, rd_size, rd_cnt, &errmsg);
> -		
> -		    
> -	        if ( ret >= 0 ) {
> -		    fprintf(stderr,
> -		        "%s%s: %d %s/%d: %d CFp %s in file %s\n",
> -		        Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg, filename);
> -		    fflush(stderr);
> -		    ret_val=1;
> -		    lkfile(fd, LOCK_UN, LKLVL0);
> -		    break;
> -	        }
> -	        rd_cnt += rd_size;
> -	    }
> -
> -	    lkfile(fd, LOCK_UN, LKLVL0);
> -
> -	    free(buf);
> -
> -	}
> -	else {
> -	    /*
> -	     * Read the whole file in a single read 
> -	     */
> -	    if((buf=(char *)malloc(fsize)) == NULL ) {
> -			fprintf(stderr, "%s%s: %s/%d: malloc(%d) failed: %s\n", Progname, TagName,
> -				__FILE__, __LINE__, fsize, strerror(errno));
> -			fflush(stderr);
> -			return -1;
> -	    }
> -
> -	    lseek(fd, 0, SEEK_SET);
> -
> -/****
> -	    read(fd, buf, fsize);
> -****/
> -#if NEWIO
> -	    ret=lio_read_buffer(fd, io_type, buf, fsize, SIGUSR1, &errmsg,0);
> -#else
> -	    ret=read_buffer(fd, io_type, buf, fsize, 0, &errmsg);
> -#endif
> -
> -	    /* unlock the file as soon as we can */
> -	    lkfile(fd, LOCK_UN, LKLVL0);
> -
> -
> -	    if ( ret != fsize ) {
> -		fprintf(stderr, "%s%s: %d %s/%d: %d CFw %s\n", 
> -		    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
> -		ret_val=1;
> -	    }
> -	    else  {
> -	        if ( Pattern == PATTERN_OFFSET )
> -		    ret=datapidchk(STATIC_NUM, buf, fsize, 0, &errmsg);
> -	        else if ( Pattern == PATTERN_PID )
> -		    ret=datapidchk(Pid, buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_ASCII )
> -		    ret=dataasciichk(NULL, buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_RANDOM )
> -		    ;	/* no check for random */
> -		else if ( Pattern == PATTERN_ALT )
> -		    ret=databinchk('a', buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_CHKER )
> -		    ret=databinchk('c', buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_CNTING )
> -		    ret=databinchk('C', buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_ZEROS )
> -		    ret=databinchk('z', buf, fsize, 0, &errmsg);
> -		else if ( Pattern == PATTERN_ONES )
> -		    ret=databinchk('o', buf, fsize, 0, &errmsg);
> -		else
> -		    ret=dataasciichk(NULL, buf, fsize, 0, &errmsg);
> -
> -		if ( ret >= 0 ) {
> -		    fprintf(stderr, "%s%s: %d %s/%d: %d CFw %s in file %s\n",
> -			Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg, filename);
> -		    fflush(stderr);
> -		    ret_val=1;
> -		}
> -	    }
> -	    free(buf);
> -	}
> -
> -	return ret_val;
> -
> -}	/* end of check_file */
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -file_size(int fd)
> -{
> -    struct stat sb;
> -
> -        if (fstat(fd, &sb) < 0) {
> -            fprintf(stderr, "%s%s: %d %s/%d: Unable to fstat(%d, &buf), errno:%d %s\n",
> -                Progname, TagName, Pid, __FILE__, __LINE__, fd, errno, strerror(errno));
> -	    return -1;
> -	
> -        }
> -
> -        return sb.st_size;
> -}
> -
> -/***********************************************************************
> - *  do file lock/unlock action.
> - ***********************************************************************/
> -int
> -lkfile(int fd, int operation, int lklevel)
> -{
> -    char *errmsg;
> -
> -    
> -    if ( lockfile == lklevel) {
> -	
> -        if ( Debug > 5 ) {
> -	    switch (operation) {
> - 	    case LOCK_UN:
> -	        printf("%s: %d DEBUG6 %s/%d: Attempting to release lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -
> - 	    case LOCK_SH:
> -	        printf("%s: %d DEBUG6 %s/%d: Attempting to get read/shared lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -
> - 	    case LOCK_EX:
> -	        printf("%s: %d DEBUG6 %s/%d: Attempting to get write/exclusive lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -	    }
> -	}
> -
> -	/*
> -	 * Attempt to get/release desired lock.
> -	 * file_lock will attempt to do action over and over again until
> -	 * either an unretryable error or the action is completed.
> -	 */
> -
> -        if ( file_lock(fd, operation, &errmsg) != 0 ) {
> -	    printf("%s%s: %d %s/%d: Unable to perform lock operation. %s\n",
> -		Progname, TagName, Pid, __FILE__, __LINE__, errmsg);
> -
> -	    /* do we count this as an error? handle_error();  */
> -	    return -1;
> -        }
> -
> -        if ( Debug > 2 ) {
> -	    switch (operation) {
> - 	    case LOCK_UN:
> -	        printf("%s: %d DEBUG3 %s/%d: Released lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -
> - 	    case LOCK_SH:
> -	        printf("%s: %d DEBUG3 %s/%d: Got read/shared lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -
> - 	    case LOCK_EX:
> -	        printf("%s: %d DEBUG3 %s/%d: Got write/exclusive lock on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, fd);
> -		break;
> -	
> -	    default:
> -	        printf("%s: %d DEBUG3 %s/%d: Completed action %d on fd %d\n", 
> -		    Progname, Pid, __FILE__, __LINE__, operation, fd);
> -		break;
> -	    }
> -	}
> -   }
> -
> -   return 0;
> -}
> -
> -/***********************************************************************
> - *
> - ***********************************************************************/
> -int
> -pre_alloc(file, fd, size)
> -char *file;
> -int fd;
> -int size;
> -{
> -
> -#ifdef XFS_IOC_RESVSP
> -    struct xfs_flock64 f;
> -
> -	f.l_whence = 0;
> -	f.l_start = 0;
> -	f.l_len = size;
> -
> -	/* non-zeroing reservation */
> -	if( xfsctl( file, fd, XFS_IOC_RESVSP, &f ) == -1 ){
> -                fprintf(stderr, "%s%s %s/%d: Unable to pre-alloc space: xfsctl(XFS_IOC_RESVSP) failed: %d  %s\n",
> -			Progname, TagName,
> -                        __FILE__, __LINE__, errno, strerror(errno));
> -		return -1;
> -	}
> -#else
> -    struct flock64 f;
> -
> -	f.l_whence = 0;
> -	f.l_start = 0;
> -	f.l_len = size;
> -
> -	/* non-zeroing reservation */
> -	if( fcntl( fd, F_RESVSP64, &f ) == -1 ){
> -                fprintf(stderr, "%s%s %s/%d: Unable to pre-alloc space: fcntl(F_RESVSP) failed: %d  %s\n",
> -			Progname, TagName,
> -                        __FILE__, __LINE__, errno, strerror(errno));
> -		return -1;
> -	}
> -#endif
> -
> -	return 0;
> -}
> -- 
> 2.47.1
> 
>
diff mbox series

Patch

diff --git a/.gitignore b/.gitignore
index 7060f52cf6b87e..4fd817243dca37 100644
--- a/.gitignore
+++ b/.gitignore
@@ -50,7 +50,6 @@  tags
 /ltp/doio
 /ltp/fsstress
 /ltp/fsx
-/ltp/growfiles
 /ltp/iogen
 
 # src/ binaries
diff --git a/lib/tlibio.c b/lib/tlibio.c
index f7259734af97c7..5b81005952119d 100644
--- a/lib/tlibio.c
+++ b/lib/tlibio.c
@@ -211,7 +211,7 @@  lio_set_debug(int level)
  * Only the first character of the string is used.
  *
  * This function does not provide for meaningful option arguments,
- * but it supports current growfiles/btlk interface.
+ * but it supports current btlk interface.
  *
  *  (rrl 04/96)
  ***********************************************************************/
diff --git a/ltp/Makefile b/ltp/Makefile
index 0611c5efe96b14..b707924c808042 100644
--- a/ltp/Makefile
+++ b/ltp/Makefile
@@ -5,7 +5,7 @@ 
 TOPDIR = ..
 include $(TOPDIR)/include/builddefs
 
-TARGETS = doio fsstress fsx growfiles iogen
+TARGETS = doio fsstress fsx iogen
 SCRIPTS = rwtest.sh
 CFILES = $(TARGETS:=.c)
 HFILES = doio.h
diff --git a/ltp/growfiles.c b/ltp/growfiles.c
deleted file mode 100644
index 7ac44aba0bede0..00000000000000
--- a/ltp/growfiles.c
+++ /dev/null
@@ -1,2607 +0,0 @@ 
-// SPDX-License-Identifier: GPL-2.0
-/*
- * Copyright (c) 2000 Silicon Graphics, Inc.
- * All Rights Reserved.
- */
-/*
- * This program will grow a list of files.
- * Each file will grow by grow_incr before the same
- * file grows twice.  Each file is open and closed before next file is opened.
- *
- * To just verify file contents: growfiles -g 0 -c 1 filename
- *
- * See help and prt_examples functions below.
- *
- * Basic code layout
- *  process cmdline 
- *  print debug message about options used
- *  setup signal handlers
- *  return control to user (if wanted - default action)
- *  fork number of desired childern (if wanted)
- *  re-exec self (if wanted)
- *  Determine number of files
- *  malloc space or i/o buffer
- *  Loop until stop is set
- *    Determine if hit iteration, time, max errors or num bytes reached
- *    Loop through each file
- *	open file
- *	fstat file - to determine if file is a fifo
- *	prealloc file space (if wanted)
- *      growfile
- *	check last write
- *	check whole file
- *	shrink file
- *	close file
- *	delay (if wanted)
- *    End loop
- *  End loop
- *  remove all files (if wanted)
- *
- * Author: Richard Logan
- *
- */
-
-#include "global.h"
-
-#ifdef HAVE_SYS_FILE_H
-#include <sys/file.h>
-#endif
-
-#include "dataascii.h"
-#include "random_range.h"
-#include "databin.h"
-#include "open_flags.h"
-#include "forker.h"
-#include "file_lock.h"
-
-extern int datapidgen(int pid, unsigned char *buffer, int bsize, int offset);
-extern void databingen(int mode, unsigned char *buffer, int bsize, int offset);
-extern int datapidchk(int pid, char *buffer, int bsize, int offset, char **errmsg);
-extern int databinchk(int mode, char *buffer, int bsize, int offset, char **errmsg);
-
-int file_size(int fd);
-int check_write(int fd, int cf_inter, char *filename, int mode);
-int shrinkfile(int fd, char *filename, int trunc_incr, int trunc_inter, int just_trunc);
-int check_file(int fd, int cf_inter, char *filename, int no_file_check);
-int growfile(int fd, char *file, int grow_incr, unsigned char *buf);
-int cleanup();
-int handle_error();
-int lkfile(int fd, int operation, int lklevel);
-void usage();
-void help();
-void prt_examples(FILE *stream);
-int set_sig();
-void sig_handler();
-static void notify_others();
-int pre_alloc(char *file, int fd, int size);
-
-
-#define NEWIO	1	/* Use the tlibio.c functions */
-
-#ifndef NEWIO
-#define NEWIO	0	/* specifies to use original iowrite.c */
-			/* functions instead of tlibio.c functions */
-			/* Once it is proven tlibio.c functions work properly, */
-			/* only tlibio.c functions will be used */
-#else
-#include "tlibio.h"
-#endif
-
-#ifndef PATH_MAX
-#define PATH_MAX	1023
-#endif
-
-
-#define DEF_DIR		"."
-#define DEF_FILE	"gf"
-
-char *Progname;
-int Debug  = 1;
-
-int Pid=0;
-
-int io_type = 0;			/* I/O type -sync */
-int open_flags = O_RDWR|O_CREAT;	/* open flags */
-
-#define MAX_FC_READ	196608		/* 4096 * 48 - 48 blocks */
-
-#define PATTERN_ASCII	1	/* repeating alphabet letter pattern */
-				/* allows multiple writers and to be checked */
-#define PATTERN_PID	2	/* <pid><words byte offset><pid> */
-				/* Assumes 64 bit word. Only allows single */
-				/* process to write and check */
-/*
- *	1234567890123456789012345678901234567890123456789012345678901234
- *	________________________________________________________________
- *	<    pid       >< offset in file of this word  ><    pid       >
- */
-	
-#define PATTERN_OFFSET	3	/* Like PATTERN_PID but has a fixed number */
-				/* (STATIC_NUM) instead of pid. */
-				/* Allows multiple processes to write/read */
-#define PATTERN_ALT	4	/* alternating bit pattern (i.e. 0x5555555...) */
-#define PATTERN_CHKER	5	/* checkerboard pattern (i.e. 0xff00ff00ff00...) */
-#define PATTERN_CNTING  6	/* counting pattern (i.e. 0 - 07, 0 - 07, ...) */
-#define PATTERN_ONES	7	/* all bits set (i.e. 0xffffffffffffff...) */
-#define PATTERN_ZEROS	8	/* all bits cleared (i.e. 0x000000000...) */
-#define PATTERN_RANDOM	9	/* random integers - can not be checked */
-#define STATIC_NUM	221849	/* used instead of pid when PATTERN_OFFSET */
-
-#define MODE_RAND_SIZE	1	/* random write and trunc */
-#define MODE_RAND_LSEEK	2	/* random lseek before write */
-#define MODE_GROW_BY_LSEEK 4	/* lseek beyond end of file then write a byte */
-#define RANDOM_OPEN	999876	/* if Open_flags set to this value, open flags */
-				/* will be randomly choosen from Open_flags[] */
-#define MODE_FIFO	S_IFIFO	/* defined in stat.h  0010000 */
-
-int num_files = 0;		/* num_auto_files + cmd line files */
-char *filenames;		/* pointer to space containing filenames */
-int remove_files = 0;		/* if set, cleanup default is not to cleanup */
-int bytes_consumed = 0;		/* total bytes consumed, all files */
-int bytes_to_consume = 0;   	/* non-zero if -B was specified, total bytes */
-int Maxerrs = 100;		/* Max number errors before forced exit */
-int Errors = 0;			/* number of encountered errors */
-int Upanic_on_error = 0;	/* call upanic if error and this variable set */
-
-/* The *_size variables are only used when random iosize option (-r) is used */
-int max_size=5000;
-int min_size=1;			/* also set in option parsing */
-int mult_size=1;		/* when random iosz, iosz must be mult of mult_size */
-/* the *_lseek variables are only used when radon lseek option (-R) is used */
-int min_lseek=0;		/* also set in option parsing */
-int max_lseek=-1;		/* -1 means size of file */
-int Pattern=PATTERN_ASCII;
-int Seed=-1;			/* random number seed, < 0 == uninitialized  */
-int Nseeds=0;			/* Number of seed specified by the user */
-int *Seeds;			/* malloc'ed arrary of ints holding user spec seeds */
-
-int using_random=0;		/* flag indicating randomization is being used */
-float delaysecs=0.0;		/* delay between iterations (in seconds) */
-int delaytime;			/* delay between iterations in clocks/uses */
-int lockfile=0;			/* if set, do file locking */
-				/* 1 = do file locking around write, trunc */
-				/* and reads. */
-				/* 2 = write lock around all file operations */
-
-int Woffset=0;			/* offset before last write */
-int Grow_incr=4096;		/* sz of last write */
-int Mode=0;			/* bitmask of write/trunc mode */
-				/* also knows if dealing with fifo */
-char *Buffer = NULL;		/* buffer used by write and write check */
-int Alignment=0;		/* if non word multiple, io will not be word aligned */
-int Opid=0;			/* original pid */
-
-int Sync_with_others = 0;	/* Flag indicating to stop other if we stop before DONE */
-int Iter_cnt = 0;		/* contains current iteration count value */
-char	TagName[40];		/* name of this growfiles (see Monster)	    */
-
-struct fileinfo_t {
-    char *filename;
-    int fd;
-    int openflags;
-    int mode;
-}  Fileinfo;
-
-/*
- * Define open flags that will be used when '-o random' option is used.
- * Note: If there is more than one growfiles doing its thing to the same
- * file, O_TRUNC will cause data mismatches.  How you ask?
- * timing of events, example:
- *   Process one		Process two
- *   ---------------		-------------
- *   get write lock
- *   fstat file
- *   lseek
- *   generate pattern
- *				open with O_TRUNC 
- *   write with wrong pattern
- *	because offset is wrong
- *
- *  The second process truncated the file after the pattern was
- *  determined, thus the pattern is wrong for the file location.
- *
- * There can also be a timing problem with open flag O_APPEND if
- * file locks are not being used (-l option).  Things could happen
- * between the fstat and the write. Thus, writing the wrong pattern.
- * If all processes observe the file locks, O_APPEND should be ok
- * to use.
- */
-int Open_flags[] = { 
-	O_RDWR|O_CREAT,
-	O_RDWR|O_CREAT|O_APPEND,
-	O_RDWR|O_CREAT|O_NDELAY,
-	O_RDWR|O_CREAT|O_SYNC,
-	O_RDWR|O_CREAT|O_SYNC|O_NDELAY,
-	O_RDWR|O_CREAT|O_APPEND|O_NDELAY,
-
-};
-
-#define REXEC_INIT	0	/* don't do re-exec of childern */
-#define REXEC_DOIT	1	/* Do re-exec of childern */
-#define REXEC_DONE	2	/* We've already been re-exec'ed */
-
-#ifndef BSIZE
-#define BSIZE	512
-#endif  /* BSIZE */
-
-#define USECS_PER_SEC	1000000  /* microseconds per second */
-
-/*
- * Define marcos used when dealing with file locks.
- */
-#define LKLVL0		1	/* file lock around write/read/trunc */
-#define LKLVL1		2	/* file lock after open to before close */
-
-/*
- * Define special max lseek values
- */
-#define LSK_EOF       	    -1	/* set fptr up to EOF */
-#define LSK_EOFPLUSGROW	    -2	/* set fptr up to EOF + grow - leave whole */
-#define LSK_EOFMINUSGROW    -3	/* set fptr up to EOF-grow - no grow */
-
-
-/***********************************************************************
- * MAIN
- ***********************************************************************/
-int
-main(argc, argv)
-int argc;
-char **argv;
-{
-extern char *optarg;            /* used by getopt */
-extern int optind;
-extern int opterr;
-
-int ind;
-int first_file_ind = 0;
-int num_auto_files = 0;		/* files created by tool */
-int seq_auto_files = 0;		/* auto files created by tool created by tool */
-char *auto_dir = DEF_DIR;
-char *auto_file = DEF_FILE;
-int grow_incr = 4096;
-int trunc_incr = 4096;
-int trunc_inter = 0;		/* 0 means none, */
-int unlink_inter = 0;		/* 0 means none, 1 means always unlink */
-int unlink_inter_ran = -1;	/* -1 -use unlink_inter, otherwise randomly choose */
-				/* between unlink_inter and unlink_inter_ran */
-int file_check_inter = 0;	/* 0 means never, 1 means always */
-int write_check_inter = 1;	/* 0 means never, 1 means always */
-int iterations = 1;		/* number of increments to be added */
-int no_file_check = 0;		/* if set, no whole file checking will be done */
-int num;
-int fd;				/* file descriptor */
-int stop = 0;			/* loop stopper if set */
-int tmp;
-char chr;
-int ret;
-int pre_alloc_space = 0;
-int total_grow_value = 0;	/* used in pre-allocations */
-int backgrnd = 1;		/* return control to user */
-struct stat statbuf;
-int time_iterval = -1;
-time_t start_time = 0;
-char reason[40];		/* reason for loop termination */
-int num_procs=1;
-int forker_mode=0;
-int reexec=REXEC_INIT;		/* reexec info */
-char *exec_path=NULL;
-
-char *strrchr();
-
-char *filename;                 /* name of file specified by user */
-char *cptr;			/* temp char pointer */
-extern int Forker_npids;	/* num of forked pid, defined in forker.c */
-
-
-	if ( argv[0][0] == '-' )
-	   reexec=REXEC_DONE;
-	/*
-	 * Determine name of file used to invoke this program
-	 */
-	if ((Progname=strrchr(argv[0], '/')) != NULL)
-		Progname++;
-	else
-		Progname=argv[0];
-
-	TagName[0] = '\0';
-
-	/*
-	 * Process options
-	 */
-	while ((ind=getopt(argc, argv, 
-	    "hB:C:c:bd:D:e:Ef:g:H:I:i:lL:n:N:O:o:pP:q:wt:r:R:s:S:T:uU:W:xy")) != EOF) {
-		switch(ind) {
-
-		case 'h' :
-			help();
-			exit(0);
-
-		case 'B':
-			switch (sscanf(optarg, "%i%c",
-				   &bytes_to_consume, &chr)) {
-			case 1: /* noop */
-			        break;
-
-			case 2:
-				if (chr == 'b') {
-				    bytes_to_consume *= BSIZE;
-				} else {
-				    fprintf(stderr,
-					"%s%s:  --B option arg invalid\n",
-					Progname, TagName);
-				    usage();
-				    exit(1);
-				}
-				break;
-
-			default:
-				fprintf(stderr, "%s%s: --B option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-				break;
-			}
-
-			break;
-
-		case 'E' :
-			prt_examples(stdout);
-			exit(0);
-
-		case 'b' :	/* batch */
-			backgrnd=0;
-			break;
-
-		case 'C':
-			if (sscanf(optarg, "%i", &write_check_inter) != 1 ) {
-				fprintf(stderr, "%s%s: --c option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-		       break;
-
-		case 'c':
-			if (sscanf(optarg, "%i", &file_check_inter) != 1 ) {
-				fprintf(stderr, "%s%s: --c option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			break;
-
-
-		case 'd':
-			auto_dir=optarg;
-			if ( stat(auto_dir, &statbuf) == -1 ) {
-			    if ( mkdir(auto_dir, 0777) == -1 ) {
-				if ( errno != EEXIST ) {
-				    fprintf(stderr,
-				        "%s%s: Unable to make dir %s\n", 
-				        Progname, TagName, auto_dir);
-				    exit(1);
-			        }
-			    }
-			}
-			else {
-			    if ( ! (statbuf.st_mode & S_IFDIR) )  {
-				fprintf(stderr,
-				    "%s%s: %s already exists and is not a directory\n",
-				    Progname, TagName, auto_dir);
-				exit(1);
-			    }
-			}
-			break;
-
-		case 'D':
-			if (sscanf(optarg, "%i", &Debug) != 1 ) {
-				fprintf(stderr, "%s%s: --D option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			break;
-
-		case 'e':
-			if (sscanf(optarg, "%i", &Maxerrs) != 1 ) {
-				fprintf(stderr, "%s%s: --e option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			break;
-
-		case 'f':
-			auto_file=optarg;
-			break;
-
-		case 'g':
-			if ((ret=sscanf(optarg, "%i%c", &grow_incr, &chr)) < 1 ||
-				grow_incr < 0 ) {
-
-				fprintf(stderr, "%s%s: --g option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			if ( ret == 2 ) {
-				if ( chr == 'b' || chr == 'B' )
-					grow_incr *= 4096;
-				else {
-					fprintf(stderr,
-						"%s%s: --g option arg invalid\n",
-						Progname, TagName);
-					usage();
-					exit(1);
-				}
-			}
-			break;
-
-		case 'H':
-			if (sscanf(optarg, "%f", &delaysecs) != 1 || delaysecs < 0 ) {
-
-				fprintf(stderr, "%s%s: --H option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			break;
-
-		case 'i':
-			if (sscanf(optarg, "%i", &iterations) != 1 ||
-				iterations < 0 ) {
-
-				fprintf(stderr, "%s%s: --i option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			break;
-
-		case 'I':
-#if NEWIO
-			if((io_type=lio_parse_io_arg1(optarg)) == -1 ) {
-			    fprintf(stderr,
-				"%s%s: --I arg is invalid, must be s, p, f, a, l, L or r.\n",
-				Progname, TagName);
-			    exit(1);
-			}
-			if( io_type & LIO_RANDOM )
-				using_random++;
-#else
-			if((io_type=parse_io_arg(optarg)) == -1 ) {
-			    fprintf(stderr,
-				"%s%s: --I arg is invalid, must be s, p, f, a, l, L or r.\n",
-				Progname, TagName);
-			    exit(1);
-			}
-			if( io_type == 99 ) /* hold-over until tlibio.h */
-				using_random++;
-#endif
-			break;
-
-		case 'l':
-			lockfile++;
-			if ( lockfile > 2 )
-			   lockfile=2;	/* lockfile can only be 1 or 2 */
-			break;
-
-		case 'L':
-			if (sscanf(optarg, "%i", &time_iterval) != 1 ||
-				time_iterval < 0 ) {
-				fprintf(stderr, "%s%s: --L option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			break;
-
-		case 'n':
-			if (sscanf(optarg, "%i:%i", &num_procs, &forker_mode) < 1 ||
-                                num_procs < 0 ) {
-
-                                fprintf(stderr, "%s%s: --n option arg invalid\n",
-                                        Progname, TagName);
-                                usage();
-                                exit(1);
-                        }
-
-			break;
-
-		case 'N':
-			if (sscanf(optarg, "%i", &num_auto_files) != 1 ||
-				num_auto_files < 0 ) {
-
-				fprintf(stderr, "%s%s: --N option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			break;
-
-		case 'O':
-			if (sscanf(optarg, "%i", &Alignment) != 1 ||
-				num_auto_files < 0 ) {
-
-				fprintf(stderr, "%s%s: --O option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			break;
-
-		case 'o':
-		        if ( strcmp(optarg, "random") == 0 ){
-			    open_flags=RANDOM_OPEN;
-			    using_random++;
-
-		        } else if ((open_flags=parse_open_flags(optarg, NULL)) == -1 ) {
-		            fprintf(stderr, "%s%s: --o arg contains invalid flag\n",
-				Progname, TagName);
-		            exit(1);
-		        }
-		        break;
-
-
-		case 'p' :	/* pre allocate space */
-			printf("%s%s: --p is illegal option on this system\n",
-				Progname, TagName);
-			exit(1);
-			break;
-
-		case 'P':
-			printf("%s%s: --P is illegal option on non-cray system\n",
-				Progname, TagName);
-			exit(1);
-			break;
-
-		case 'q':	/* file content or pattern */
-			switch(optarg[0]) {
-			case 'A':
-			    Pattern = PATTERN_ALT;
-			    break;
-			case 'a':
-			    Pattern = PATTERN_ASCII;
-			    break;
-			case 'p':
-			    Pattern = PATTERN_PID;
-			    break;
-			case 'o':
-			    Pattern = PATTERN_OFFSET;
-			    break;
-			case 'c':
-			    Pattern = PATTERN_CHKER;
-			    break;
-			case 'C':
-			    Pattern = PATTERN_CNTING;
-			    break;
-			case 'r':
-			    Pattern = PATTERN_RANDOM;
-			    using_random++;
-			    break;
-			case 'z':
-			    Pattern = PATTERN_ZEROS;
-			    break;
-			case 'O':
-			    Pattern = PATTERN_ONES;
-			    break;
-			default:
-			    fprintf(stderr,
-				"%s%s: --C option arg invalid, A, a, p, o, c, C, r, z, or 0\n",
-				Progname, TagName);
-			    usage();
-			    exit(1);
-			}
-			break;
-
-		case 'R':	/* random lseek before write arg: [min-]max*/
-			if (sscanf(optarg, "%i-%i", &min_lseek, &max_lseek) != 2 ) {
-			    min_lseek=1;    /* same as default in define */
-			    if (sscanf(optarg, "%i%c", &max_lseek, &chr) != 1 ) {
-				fprintf(stderr, "%s%s: --R option arg invalid: [min-]max\n",
-				    Progname, TagName);
-				exit(1);
-			    }
-			}
-			if ( max_lseek < LSK_EOFMINUSGROW ) {
-			    fprintf(stderr, "%s%s: --R option, max_lseek is invalid\n",
-				Progname, TagName);
-                            exit(1);
-			}
-			Mode |= MODE_RAND_LSEEK;
-			using_random++;
-		        break;
-
-		case 'r':	/* random io size arg: [min-]max[:mult] */
-
-			/* min-max:mult format */
-			if (sscanf(optarg, "%i-%i:%i%c", &min_size, &max_size,
-							&mult_size, &chr) != 3 ) {
-			  min_size=1;   
-			  /* max:mult format */
-		  	  if (sscanf(optarg, "%i:%i%c", &max_size,
-							&mult_size, &chr) != 2 ) {
-			    /* min-max format */
-		    	    if (sscanf(optarg, "%i-%i%c", &min_size,
-							&max_size, &chr) != 2 ) {
-			      min_size=1;   
-		      	      if (sscanf(optarg, "%i%c", &max_size, &chr) != 1 ) {
-				fprintf(stderr,
-				     "%s%s: --r option arg invalid: [min-]max[:mult]\n",
-			    	Progname, TagName);
-				exit(1);
-		      	      }
-		    	    }
-		  	  }
-			}
-
-			if ( max_size < 0 ) {
-			    fprintf(stderr, "%s%s: --r option, max_size is invalid\n",
-				Progname, TagName);
-                            exit(1);
-			}
-			/*
-			 * If min and max are the same, no randomness
-			 */
-			if ( min_size != max_size ) {
-			    Mode |= MODE_RAND_SIZE;
-			    using_random++;
- 			}
-		        break;
-
-		case 'S':
-			if (sscanf(optarg, "%i", &seq_auto_files) != 1 ||
-				seq_auto_files < 0 ) {
-
-				fprintf(stderr, "%s%s: --S option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			break;
-
-		case 's':	/* format: seed[,seed...] */
-			
-			/* count the number of seeds */
-			cptr=optarg;
-			for(Nseeds=1; *cptr ; Nseeds++) {
-			    if ( (filename=strchr(cptr, ',')) == NULL )
-				break;
-			    cptr=filename;
-			    cptr++;
-			}
-			Seeds=(int *)malloc(Nseeds*sizeof(int));
-
-			/*
-			 * check that each seed is valid and put them in 
-			 * the newly malloc'ed Seeds arrary.
-			 */
-			filename=cptr=optarg;
-			for(Nseeds=0; *cptr; Nseeds++) {
-			    if ( (filename=strchr(cptr, ',')) == NULL ) {
-				if ( sscanf(cptr, "%i", &Seeds[Nseeds]) < 1 ) {
-                                    fprintf(stderr, "%s%s: --s option arg %s invalid\n",
-                                        Progname, TagName, cptr);
-                                    usage();
-                                    exit(1);
-				}
-				Nseeds++;
-                                break;
-			    }
-
-			    *filename='\0';
-			    if ( sscanf(cptr, "%i", &Seeds[Nseeds]) < 1 ) {
-                               fprintf(stderr, "%s%s: --s option arg %s invalid\n",
-                                        Progname, TagName, cptr);
-                                usage();
-                                exit(1);
-			    }
-			    *filename=',';   /* restore string */
-                            cptr=filename;
-			    cptr++;
-			}
-			break;
-
-		case 't':
-			if ((ret=sscanf(optarg, "%i%c", &trunc_incr, &chr)) < 1 ||
-				trunc_incr < 0 ) {
-
-				fprintf(stderr, "%s%s: --t option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			if ( ret == 2 ) {
-				if ( chr == 'b' || chr == 'B' )
-					trunc_incr *= 4096;
-				else {
-					fprintf(stderr,
-						"%s%s: --t option arg invalid\n",
-						Progname, TagName);
-					usage();
-					exit(1);
-				}
-			}
-			break;
-
-		case 'T':	/* truncate interval */
-			if (sscanf(optarg, "%i%c", &trunc_inter, &chr) != 1 ||
-				trunc_inter < 0 ) {
-
-				fprintf(stderr, "%s%s: --T option arg invalid\n",
-					Progname, TagName);
-				usage();
-				exit(1);
-			}
-			break;
-
-		case 'u':
-			remove_files++;
-			break;
-
-		case 'U':   /* how often to unlink file */
-		       /* 
-			* formats:   
-			*      A-B  - randomly pick interval between A and B 
-			*      X    - unlink file every X iteration
-			*/
-                       if (sscanf(optarg, "%i-%i", &unlink_inter, 
-						&unlink_inter_ran) == 2 ) {
-
-			   if ( unlink_inter < 0 || unlink_inter_ran < 0 ) {
-                                fprintf(stderr, "%s%s: --U option arg invalid\n",
-                                        Progname, TagName);
-                                usage();
-                                exit(1);
-			   }
-			   /* ensure unlink_inter contains smaller value */
-			   if ( unlink_inter > unlink_inter_ran ) {
-				tmp=unlink_inter_ran;
-				unlink_inter_ran=unlink_inter;
-				unlink_inter=tmp;
-			   }
-			   using_random++;
-
-                       } else if (sscanf(optarg, "%i%c", &unlink_inter, &chr) != 1 ||
-                                unlink_inter < 0 ) {
-
-                            fprintf(stderr, "%s%s: --U option arg invalid\n",
-                                 Progname, TagName);
-                            usage();
-                            exit(1);
-                        }
-			break;
-
-	        case 'x':
-			if ( reexec != REXEC_DONE )
-			    reexec=REXEC_DOIT;
-			break;
-
-		case 'w':
-			Mode |= MODE_GROW_BY_LSEEK;
-			break;
-
-		case 'W':
-			sprintf( TagName, "(%.37s)", optarg );
-			break;
-
-		case 'y':
-			Sync_with_others=1;
-			break;
-
-		case '?':
-			usage();
-			exit(1);
-			break;
-		}
-	}
-
-	if( Debug == 1 ){
-		cptr = getenv("TOUTPUT");
-		if( (cptr != NULL) && (strcmp( cptr, "NOPASS" ) == 0) ){
-			Debug = 0;
-		}
-	}
-
-	if ( Pattern == PATTERN_RANDOM ) {
-	    no_file_check=1;
-	    if ( write_check_inter || file_check_inter )
-                printf("%s%s: %d Using random pattern - no data checking will be performed!\n",
-		    Progname, TagName, (int)getpid());
-	}
-	else if ( max_lseek == LSK_EOFPLUSGROW || Mode & MODE_GROW_BY_LSEEK ) {
-	    no_file_check=1;
-
-	    if ( file_check_inter )
-	        printf("%s%s: %d Using random lseek beyond EOF or lseek grow,\n\
-no whole file checking will be performed!\n", Progname, TagName, (int)getpid());
-
-	}
-
-	if ( Mode & MODE_RAND_SIZE )
-	    grow_incr=max_size;
-
-	set_sig();
-
-	Opid=getpid();
-	Pid=Opid;
-
-	if ( backgrnd ) {
-	    if ( Debug > 1 )
-		printf("%s: %d DEBUG2 forking, returning control to the user\n",
-		    Progname, Opid);
-	    background(Progname);	/* give user their prompt back */
-	}
-
-	if ( Debug > 3 ) {
-#if NEWIO
-	    lio_set_debug(Debug-3);
-#else
-	    set_iowrite_debug(Debug-3);
-#endif
-	}
-
-	/*
-	 * Print some program information here if debug is turned on to
-	 * level 3 or higher.
-	 */
-
-        if ( Debug > 2 ) {
-	    
-	    if (  Mode & MODE_GROW_BY_LSEEK )
-		printf("%s: %d DEBUG lseeking past end of file, writting a \"w\"\n",
-		    Progname, Pid);
-	    else if ( Pattern == PATTERN_OFFSET )
-		printf("%s: %d DEBUG3 %d<byteoffset>%d per word pattern multi-writers.\n",
-		    Progname, Pid, STATIC_NUM, STATIC_NUM);
-	    else if ( Pattern == PATTERN_PID )
-		printf("%s: %d DEBUG3 <pid><byteoffset><pid> per word pattern - 1 writer\n",
-		    Progname, Pid);
-	    else if ( Pattern == PATTERN_ASCII )
-		printf("%s: %d DEBUG3 ascii pattern (vi'able)- allows multiple writers\n",
-		    Progname, Pid);
-	    else if ( Pattern == PATTERN_ALT )
-		printf("%s: %d DEBUG3 alt bit pattern - allows multiple writers\n",
-		    Progname, Pid);
-	    else if ( Pattern == PATTERN_CHKER )
-		printf("%s: %d DEBUG3 checkerboard pattern - allows multiple writers\n",
-		    Progname, Pid);
-	    else if ( Pattern == PATTERN_CNTING )
-		printf("%s: %d DEBUG3 counting pattern - allows multiple writers\n",
-		    Progname, Pid);
-	    else if ( Pattern == PATTERN_RANDOM )
-		printf("%s: %d DEBUG3 random integer pattern - no write/file checking\n",
-		    Progname, Pid);
-	    else if ( Pattern == PATTERN_ONES )
-		printf("%s: %d DEBUG3 all ones pattern - allows multiple writers\n",
-		    Progname, Pid);
-	    else if ( Pattern == PATTERN_ZEROS )
-		printf("%s: %d DEBUG3 all zeros pattern - allows multiple writers\n",
-		    Progname, Pid);
-	
-	    else
-		printf("%s: %d DEBUG3 unknown pattern\n",
-		    Progname, Pid);
-	    if ( bytes_to_consume )
-	        printf("%s: %d DEBUG3 bytes_to_consume = %d\n",
-		    Progname, Pid, bytes_to_consume);
-	    printf("%s: %d DEBUG3 Maxerrs = %d, pre_alloc_space = %d, filelocking = %d\n", 
-		Progname, Pid, Maxerrs, pre_alloc_space, lockfile);
-
-	    printf("%s: %d DEBUG3 Debug = %d, remove files in cleanup : %d\n",
-		Progname, Pid, Debug, remove_files);
-
-	    printf("%s: %d DEBUG3 Mode = %#o\n", Progname, Pid, Mode);
-
-	    if ( open_flags == RANDOM_OPEN )
-	       printf("%s: %d DEBUG3 open_flags = (random), io_type = %#o\n", Progname,
-		 Pid, io_type);
-	    else
-	       printf("%s: %d DEBUG3 open_flags = %#o, io_type = %#o\n", Progname,
-		 Pid, open_flags, io_type);
-
-	    if ( Mode & MODE_RAND_SIZE ) {
-	        printf("%s: %d DEBUG3 random write/trunc:  min=%d, max=%d, mult = %d\n",
-		    Progname, Pid, min_size, max_size, mult_size);
-	    }
-	    else {
-		printf("%s: %d DEBUG3 grow_incr = %d\n", 
-		    Progname, Pid, grow_incr);
-	    }
-	    if ( Mode & MODE_RAND_LSEEK ) {
-		if ( max_lseek == LSK_EOF )
-	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=<endoffile>\n",
-		    Progname, Pid, min_lseek);
-		else if ( max_lseek == LSK_EOFPLUSGROW )
-	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=<endoffile+iosize>\n",
-		    Progname, Pid, min_lseek);
-		else if ( max_lseek == LSK_EOFMINUSGROW )
-	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=<endoffile-iosize>\n",
-		    Progname, Pid, min_lseek);
-		else
-	          printf("%s: %d DEBUG3 random lseek:  min=%d, max=%d\n",
-		    Progname, Pid, min_lseek, max_lseek);
-	    }
-
-	    printf("%s: %d DEBUG3 check write interval = %d, check file interval = %d\n",
-		Progname, Pid, write_check_inter, file_check_inter);
-
-	    printf("%s: %d DEBUG3 trunc interval = %d, trunc_incr = %d\n",
-		Progname, Pid, trunc_inter, trunc_incr);
-
-	    if ( no_file_check )
-		printf("%s: %d DEBUG3 no whole file checking will be done\n",
-		    Progname, Pid);
-	    
-	    if ( unlink_inter_ran == -1 ) {
-		printf("%s: %d DEBUG3 unlink_inter = %d\n", 
-		        Progname, Pid, unlink_inter);
-	    } else {
-		printf("%s: %d DEBUG3 unlink_inter = %d, unlink_inter_ran = %d\n", 
-                        Progname, Pid, unlink_inter, unlink_inter_ran);
-	    }  
-
-	    if ( Debug > 8 ) {
-	       num=sizeof(Open_flags)/sizeof(int);
-	       printf("%s: %d DEBUG9 random open flags values:\n", Progname, Pid);
-	       for(ind=0; ind<num; ind++) {
-		    printf("\t%#o\n", Open_flags[ind]);
-	       }
-	    }
-	}  /* end of DEBUG > 2 */
-
-	if ( Debug > 1 && num_procs > 1 ) {
-	    printf("%s: %d DEBUG2 about to fork %d more copies\n", Progname,
-		Opid, num_procs-1);
-	}
-
-	fflush(stdout);	/* ensure pending i/o is flushed before forking */
-	fflush(stderr);
-
-	forker(num_procs, forker_mode, Progname);
-
-	Pid=getpid();	/* reset after the forks */
-	/*
-	 * If user specified random seed(s), get that random seed value.
-	 * get random seed if it was not specified by the user.
-	 * This is done after the forks, because pid is used to get the seed.
-         */
-	if ( Nseeds == 1 ) {
-	    /*
-	     * If only one seed specified, all processes will get that seed. 
-	     */
-	    Seed=Seeds[0];
-	} else if ( Nseeds > 1 ) {
-	    /*
-	     * More than one seed was specified.
-	     * The original process gets the first seed.  Each
-	     * process will be get the next seed in the specified list.
-	     */
-	    if ( Opid == Pid ) {
-		Seed=Seeds[0];
-	    } else {
-		/*
-		 * If user didn't specify enough seeds, use default method.
-		 */
-		if ( Forker_npids >= Nseeds ) 
-	    	    Seed=time(0) + Pid;  /* default random seed */
-		else {
-		    Seed=Seeds[Forker_npids];
-		}
-	    }
-	} else {
-	    /* 
-	     * Generate a random seed based on time and pid.
-	     * It has a good chance of being unique for each pid.
-	     */
-	    Seed=time(0) + Pid;  /* default random seed */
-	}
-
-	random_range_seed(Seed);
-
-        if ( using_random && Debug > 0 )
-	    printf("%s%s: %d DEBUG1 Using random seed of %d\n",
-		Progname, TagName, Pid, Seed);
-
-	if ( unlink_inter_ran > 0 ) {
-	    /*
-	     * Find unlinking file interval.  This must be done after
-	     * the seed was set.   This allows multiple copies to
-	     * get different intervals.
-	     */
-	    tmp=unlink_inter;
-	    unlink_inter=random_range(tmp, unlink_inter_ran, 1, NULL);
-
-	    if ( Debug > 2 )
-		printf("%s: %d DEBUG3 Unlink interval is %d (random %d - %d)\n",
-		    Progname, Pid, unlink_inter, tmp, unlink_inter_ran);
-	}
-
-	/*
-	 * re-exec all childern if reexec is set to REXEC_DOIT.
-	 * This is useful on MPP systems to get the
-	 * child process on another PE.
-	 */
-	if ( reexec == REXEC_DOIT && Opid != Pid ) {
-	    if ( exec_path == NULL ) {
-		exec_path = argv[0];
-		/* Get space for cmd (2 extra, 1 for - and 1 fro NULL */
-		argv[0] = (char *)malloc(strlen(exec_path) + 2);
-		sprintf(argv[0], "-%s", exec_path);
-	    }
-	  
-	    if ( Debug > 2 )
-	        printf("%s: %d DEBUG3 %s/%d: execvp(%s, argv)\n",
-		    Progname, Pid, __FILE__, __LINE__, argv[0]);
-
-	    execvp(argv[0], argv);
-        }
-
-	/*** begin filename stuff here *****/
-	/*
-	 * Determine the number of files to be dealt with
-	 */
-	if ( optind == argc ) {
-		/*
-		 * no cmd line files, therfore, set
-		 * the default number of auto created files
-		 */
-		if ( ! num_auto_files && ! seq_auto_files )
-			num_auto_files=1;
-	}
-	else {
-		first_file_ind=optind;
-		num_files += argc-optind;
-	}
-
-	if ( num_auto_files ) {
-		num_files += num_auto_files;
-	}
-
-	if ( seq_auto_files ) {
-		num_files += seq_auto_files;
-	}
-
-	/*
-	 * get space for file names
-	 */
-	if ((filenames=(char *)malloc(num_files*PATH_MAX)) == NULL) {
-		fprintf(stderr, "%s%s: %d %s/%d: malloc(%d) failed: %s\n",
-			Progname, TagName, Pid, __FILE__, __LINE__, num_files*PATH_MAX,
-			strerror(errno));
-		exit(1);
-	}
-
-	/*
-	 * fill in filename cmd files then auto files.
-	 */
-
-	num=0;
-	if ( first_file_ind ) {
-		for(ind=first_file_ind; ind<argc; ind++, num++) {
-			strcpy((char *)filenames+(num*PATH_MAX), argv[ind]);
-		}
-	}
-
-	/*
-	 * construct auto filename and insert them into filenames space
-	 */
-	for(ind=0;ind<num_auto_files; ind++, num++) {
-		sprintf((char *)filenames+(num*PATH_MAX), "%s/%s.%d",
-			auto_dir, auto_file, ind);
-	}
-
-	/*
-	 * construct auto seq filenames
-	 */
-	for(ind=1; ind<=seq_auto_files; ind++, num++) {
-		sprintf((char *)filenames+(num*PATH_MAX), "%s/%s%d",
-			auto_dir, auto_file, ind);
-	}
-
-/**** end filename stuff ****/
-
-	if ( time_iterval > 0 )
-		start_time=time(0);
-
-	/*
-	 * get space for I/O buffer
-	 */
-	if ( grow_incr ) {
-		if ((Buffer=(char *)malloc(grow_incr+Alignment)) == NULL) {
-			fprintf(stderr, "%s%s: %d %s/%d: malloc(%d) failed: %s\n",
-				Progname, TagName, Pid, __FILE__, __LINE__, grow_incr, strerror(errno));
-			exit(1);
-		}
-		if ( Alignment )
-		Buffer = Buffer + Alignment;
-
-	}
-
-	if ( Debug > 2 ) {
-		printf("%s: %d DEBUG3 num_files = %d\n",
-			Progname, Pid, num_files);
-	}
-
-	if ( pre_alloc_space ) {
-		if ( iterations == 0 ) {
-		    fprintf(stderr, "%s%s: %d %s/%d: can NOT pre-alloc and grow forever\n",
-			Progname, TagName, Pid, __FILE__, __LINE__);
-		    exit(1);
-		}
-		if ( Mode & MODE_RAND_SIZE ) {
-		    fprintf(stderr,
-			"%s%s: %d %s/%d: can NOT pre-alloc and do random io size\n",
-			Progname, TagName, Pid, __FILE__, __LINE__);
-		    exit(1);
-		}
-
-		total_grow_value=grow_incr * iterations;
-
-		/*
-		 * attempt to limit 
-		 */
-		if ( bytes_to_consume && bytes_to_consume < total_grow_value ) {
-			total_grow_value=bytes_to_consume;
-		}
-	}
-
-	/*
-	 * If delaying between iterations, get amount time to
-	 * delaysecs in clocks or usecs.
-	 */
-	if ( delaysecs ) {
-	   delaytime=(int)((float)USECS_PER_SEC * delaysecs);
-        }
-
-	/*
-	 * This is the main iteration loop.
-	 * Each iteration, all files can  be opened, written to,
-	 * read to check the write, check the whole file, 
-	 * truncated, and closed.   
-	 */
-	for(Iter_cnt=1; ! stop ; Iter_cnt++) {
-
-	    if ( iterations && Iter_cnt >= iterations+1 ) {
-		strcpy(reason, "Hit iteration value");
-		stop=1;
-		continue;
-	    }
-
-	    if (  (time_iterval > 0) && (start_time + time_iterval < time(0)) ) {
-		sprintf(reason, "Hit time value of %d", time_iterval);
-		stop=1;
-		continue;
-	    }
-
-	    if ( bytes_to_consume && bytes_consumed >= bytes_to_consume) {
-		sprintf(reason, "Hit bytes consumed value of %d", bytes_to_consume);
-		stop=1;
-                continue;
-            }
-
-	    /*
-	     * This loop will loop through all files.
-	     * Each iteration, a single file can  be opened, written to,
-	     * read to check the write, check the whole file, 
-	     * truncated, and closed.   
-	     */
-	    for(ind=0; ind<num_files; ind++) {
-
-		fflush(stdout);
-		fflush(stderr);
-
-		filename=(char *)filenames+(ind*PATH_MAX);
-		Fileinfo.filename=(char *)filenames+(ind*PATH_MAX);
-
-
-		if ( open_flags ==  RANDOM_OPEN ) {
-		   ret=Open_flags[random_range(0, sizeof(Open_flags)/sizeof(int)-1, 1, NULL)];
-		}
-
-		else
-		   ret=open_flags;
-
-		Fileinfo.openflags=ret;
-
-		if ( Debug > 3 ) {
-		    printf("%s: %d DEBUG3 %s/%d: %d Open filename = %s, open flags = %#o %s\n",
-			Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename, ret, 
-		        openflags2symbols(ret, ",", 0));
-		} else if ( Debug > 2 ) {
-		    printf("%s: %d DEBUG3 %s/%d: %d filename = %s, open flags = %#o\n",
-			Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename, ret);
-		}
-
-		/*
-		 * open file with desired flags.
-		 */
-		if ( (fd=open(filename, ret, 0777)) == -1 ) {
-		    fprintf(stderr,
-                        "%s%s: %d %s/%d: open(%s, %#o, 0777) returned -1, errno:%d %s\n",
-			Progname, TagName, Pid, __FILE__, __LINE__, filename, ret, errno, strerror(errno));
-			handle_error();
-			continue;
-		}
-
-		Fileinfo.fd=fd;
-
-		lkfile(fd, LOCK_EX, LKLVL1);   /* lock if lockfile is LKLVL1 */
-
-		/*
-		 * preallocation is only done once, if specified.
-		 */
-		if ( pre_alloc_space ) {
-			if (pre_alloc(filename, fd, total_grow_value) != 0 ) {
-				cleanup();
-				exit(2);
-			}
-			if ( Debug > 1 ) {
-				printf("%s: %d DEBUG2 %s/%d: pre_allocated %d for file %s\n",
-				    Progname, Pid, __FILE__, __LINE__, total_grow_value, filename);
-			}
-			lkfile(fd, LOCK_UN, LKLVL1);   /* release lock */
-			close(fd);
-			Iter_cnt=0;	/* reset outside loop to restart from one */
-			continue;
-		}
-
-		/*
-		 * grow file by desired amount.
-		 * growfile() will set the Grow_incr variable and 
-                 * possiblly update the Mode variable indicating
-		 * if we are dealing with a FIFO file.
-		 */
-
-		if (growfile(fd, filename, grow_incr, (unsigned char *)Buffer) != 0 ) {
-			handle_error();
-			lkfile(fd, LOCK_UN, LKLVL1);   /* release lock */
-			close(fd);
-			continue;
-		}
-
-		/*
-		 * check if last write is not corrupted
-		 */
-		if ( check_write(fd, write_check_inter, filename,
-							Mode) != 0 ) {
-		    handle_error();
-                }
-
-		/*
-		 * Check that whole file is not corrupted.
-		 */
-		if ( check_file(fd, file_check_inter, filename,
-						no_file_check) != 0 ) {
-		    handle_error();
-		}
-
-		/*
-		 * shrink file by desired amount if it is time 
-		 */
-
-		if ( shrinkfile(fd, filename, trunc_incr, trunc_inter, Mode) != 0 ) {
-		    handle_error();
-		}
-
-		lkfile(fd, LOCK_UN, LKLVL1);   /* release lock */
-
-		if ( Debug > 4 )
-		    printf("%s: %d DEBUG5 %s/%d: %d Closing file %s fd:%d \n", 
-			Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename, fd);
-		close(fd);
-
-		/*
-		 * Unlink the file if that is desired
-		 */
-		if ( unlink_inter && (Iter_cnt % unlink_inter == 0) ) {
-		
-		    if ( Debug > 4 )
-			printf("%s: %d DEBUG5 %s/%d: %d Unlinking file %s\n", 
-			    Progname, Pid, __FILE__, __LINE__, Iter_cnt, filename);
-
-		    unlink(filename);
-		}
-
-	        /*
-	         * delay while staying active for "delaysecs" seconds.
-	         */
-	        if ( delaytime ) {
-		
-		    int ct, end;
-		    struct timeval curtime;
-		    gettimeofday(&curtime, NULL);
-		    ct=curtime.tv_sec*USECS_PER_SEC + curtime.tv_usec;
-		    end=ct+delaytime;
-                    while ( ct < end ) {
-
-		        gettimeofday(&curtime, NULL);
-		        ct=curtime.tv_sec*USECS_PER_SEC + curtime.tv_usec;
-		    }
-	        }
-	    }
-	    /*
-	     * if Iter_cnt == 0, then we pre allocated space to all files
-	     * and we are starting outside loop over.  Set pre_alloc_space
-	     * to zero otherwise we get in infinite loop
-	     */
-	    if ( Iter_cnt == 0 ) {
-		pre_alloc_space=0;
-	    }
-	}   /* end iteration for loop */
-
-
-        if ( Debug ) {
-	    printf("%s%s: %d %s/%d: DONE %d iterations to %d files. %s\n",
-		Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, num_files, reason);
-	}
-	fflush(stdout);
-	fflush(stderr);
-
-	cleanup();
-
-	if ( Errors ) {
-		if ( Debug > 2 ) {
-		    printf("%s%s: %d DEBUG3 %d error(s) encountered\n",
-			Progname, TagName, Pid, Errors);
-		    printf("%s%s: %d DEBUG3 %s/%d: exiting with value of 1\n", Progname, TagName, Pid, __FILE__, __LINE__);
-		}
-		exit(1);
-	}
-	if ( Debug > 2 )
-	    printf("%s%s: %d DEBUG3 %s/%d: no errors, exiting with value of 0\n", Progname, TagName, Pid, __FILE__, __LINE__);
-	exit(0);
-}
-
-/***********************************************************************
- *
- ***********************************************************************/
-int
-set_sig()
-{
-   int sig;
-
-	
-        /*
-         * now loop through all signals and set the handlers
-         */
-
-        for (sig = 1; sig < NSIG; sig++) {
-            switch (sig) {
-                case SIGKILL:
-                case SIGSTOP:
-                case SIGCONT:
-#ifdef SIGCKPT
-	        case SIGCKPT:
-#endif /* SIGCKPT */
-#ifdef SIGRESTART
-	        case SIGRESTART:
-#endif /* SIGRESTART */
-                case SIGCHLD:
-                    break;
-
-                default:
-                    signal(sig, sig_handler);
-                break;
-            }
-        } /* endfor */
-
-
-        return 0;
-}
-
-/***********************************************************************
- *
- ***********************************************************************/
-void
-sig_handler(sig)
-int sig;
-{
-    int exit_stat = 2;
-
-    if ( sig == SIGUSR2 ) {
-	fprintf(stdout, "%s%s: %d %s/%d: received SIGUSR2 (%d) - stopping.\n",
-	    Progname, TagName, Pid, __FILE__, __LINE__, sig);
-        signal(sig, sig_handler);	/* allow us to get this signal more than once */
-        
-    } else if( sig == SIGINT ){
-	/* The user has told us to cleanup, don't pretend it's an error. */
-	exit_stat=0;
-	if ( Debug != 0 ){
-		fprintf(stderr, "%s%s: %d %s/%d: received unexpected signal: %d\n", Progname, TagName,
-		    Pid, __FILE__, __LINE__, sig);
-	}
-    } else {
-	fprintf(stderr, "%s%s: %d %s/%d: received unexpected signal: %d\n", Progname, TagName,
-	    Pid, __FILE__, __LINE__, sig);
-    }
-
-    notify_others();
-    cleanup();
-    if ( Debug > 2 ){
-	printf("%s%s: %d DEBUG3 %s/%d: Exiting with a value of %d\n",
-	       Progname, TagName, Pid, __FILE__, __LINE__, exit_stat);
-    }
-    exit(exit_stat);
-}
-
-/***********************************************************************
- * this function attempts to send SIGUSR2 to other growfiles processes
- * telling them to stop.
- *  
- ***********************************************************************/
-static void
-notify_others()
-{
-    static int send_signals = 0;
-    int ind;
-    extern int Forker_pids[];
-    extern int Forker_npids;
-
-    if ( Sync_with_others && send_signals == 0 ) {
-
-	send_signals=1; /* only send signals once */
-
-        for (ind=0; ind< Forker_npids; ind++) {
-	    if ( Forker_pids[ind] != Pid ) {
-	        if ( Debug > 1 )
-		    printf("%s%s: %d DEBUG2 %s/%d: Sending SIGUSR2 to pid %d\n",
-		        Progname, TagName, Pid, __FILE__, __LINE__, Forker_pids[ind]);
-	        kill(Forker_pids[ind], SIGUSR2);
-	    }
-        }
-    }
-
-}
-
-/***********************************************************************
- * this function will count the number of errors encountered.
- * This function will call upanic if wanted or cleanup and
- * and exit is Maxerrs were encountered.
- ***********************************************************************/
-int
-handle_error()
-{
-    Errors++;
-
-    if ( Maxerrs && Errors >= Maxerrs ) {
-	printf("%s%s: %d %s/%d: %d Hit max errors value of %d\n", 
-	    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, Maxerrs);
-	notify_others();
-	cleanup();
-
-        if ( Debug > 2 ) {
-            printf("%s%s: %d DEBUG3 %d error(s) encountered\n",
-                        Progname, TagName, Pid, Errors);
-            printf("%s%s: %d DEBUG3 %s/%d: exiting with value of 1\n", Progname, TagName, Pid, __FILE__, __LINE__);
-        }
-
-	exit(1);
-    }
-
-    return 0;
-}
-
-/***********************************************************************
- *
- ***********************************************************************/
-int
-cleanup()
-{
-    int ind;
-
-	if ( remove_files ) {
-	    if ( Debug > 2 )
-		printf("%s: %d DEBUG3 Removing all %d files\n", 
-		    Progname, Pid, num_files);
-	    for(ind=0; ind<=num_files; ind++) {
-		unlink(filenames+(ind*PATH_MAX));
-	    }
-	}
-	if ( using_random && Debug > 1 )
-	    printf("%s%s: %d DEBUG2 Used random seed: %d\n",
-		Progname, TagName, Pid, Seed);
-	return 0;
-}
-
-/***********************************************************************
- *
- ***********************************************************************/
-void
-usage()
-{
-	fprintf(stderr,
-	"Usage: %s%s [-bhEluy][[-g grow_incr][-i num][-t trunc_incr][-T trunc_inter]\n",
-	Progname, TagName );
-	fprintf(stderr,
-	"[-d auto_dir][-e maxerrs][-f auto_file][-N num_files][-w][-c chk_inter][-D debug]\n");
-	fprintf(stderr,
-	"[-s seed][-S seq_auto_files][-p][-P PANIC][-I io_type][-o open_flags][-B maxbytes]\n");
-	fprintf(stderr,
-	"[-r iosizes][-R lseeks][-U unlk_inter][-W tagname] [files]\n");
-
-	return;
-
-}	/* end of usage */
-
-/***********************************************************************
- *
- ***********************************************************************/
-void
-help()
-{
-	usage();
-
-fprintf(stdout, "\
-  -h             Specfied to print this help and exit.\n\
-  -b             Specfied to execute in sync mode.(def async mode)\n\
-  -B maxbytes    Max bytes to consume by all files.  growfiles exits when more\n\
-                 than maxbytes have been consumed. (def no chk)  If maxbytes ends\n\
-                 with the letter 'b', maxbytes is multiplied by BSIZE\n\
-  -C write_chk   Specifies how often to check the last write (default 1)\n\
-  -c file_chk    Specifies how often to check whole file (default 0)\n\
-  -d auto_dir    Specifies the directory to auto created files. (default .)\n\
-  -D debug_lvl   Specifies the debug level (default 1)\n\
-  -E             Print examples and exit\n\
-  -e errs        The number errors that will terminate this program (def 100)\n\
-  -f auto_file   Specifies the base filename files created. (default \"gf\")\n\
-  -g grow_incr   Specfied to grow by incr for each num. (default 4096)\n\
-                 grow_incr may end in b for blocks\n\
-		 If -r option is used, this option is ignored and size is random\n\
-  -H delay       Amount of time to delay between each file (default 0.0)\n\
-  -I io_type Specifies io type: s - sync, p - polled async, a - async (def s)\n\
-		 l - listio sync, L - listio async, r - random\n\
-  -i iteration   Specfied to grow each file num times. 0 means forever (default 1)\n\
-  -l             Specfied to do file locking around write/read/trunc\n\
-		 If specified twice, file locking after open to just before close\n\
-  -L time        Specfied to exit after time secs, must be used with -i.\n\
-  -N num_files   Specifies the number of files to be created.\n\
-                 The default is zero if cmd line files.\n\
-                 The default is one if no cmd line files.\n\
-  -n num_procs   Specifies the number of copies of this cmd.\n\
-  -o op_type     Specifies open flages: (def O_RDWR,O_CREAT) op_type can be 'random'\n\
-  -O offset      adjust i/o buffer alignment by offset bytes\n\
-  -P PANIC       Specifies to call upanic on error.\n\
-  -p             Specifies to pre-allocate space\n\
-  -q pattern     pattern can be a - ascii, p - pid with boff, o boff (def)\n\
-		 A - Alternating bits, r - random, O - all ones, z - all zeros,\n\
-		 c - checkboard, C - counting\n\
-  -R [min-]max   random lseek before write and trunc, max of -1 means filesz,\n\
-		 -2 means filesz+grow, -3 filesz-grow. (min def is 0)\n\
-  -r [min-]max   random io write size (min def is 1)\n\
-  -S seq_auto_files Specifies the number of seqental auto files (default 0)\n\
-  -s seed[,seed...] Specifies the random number seed (default time(0)+pid)\n\
-  -t trunc_incr  Specfied the amount to shrink file. (default 4096)\n\
-                 trunc_inter may end in b for blocks\n\
-		 If -R option is used, this option is ignored and trunc is random\n\
-  -T trunc_inter Specfied the how many grows happen before shrink. (default 0)\n\
-  -u             unlink files before exit\n\
-  -U ui[-ui2]    Unlink files each ui iteration (def 0)\n\
-  -w             Specfied to grow via lseek instead of writes.\n\
-  -W tag-name	 Who-am-i.  My Monster tag name.  (used by Monster).\n\
-  -x		 Re-exec children before continuing - useful on MPP systems\n\
-  -y             Attempt to sync copies - if one fails it will send sigusr2 to others\n\
-  Action to each file every iteration is open, write, write check\n\
-  file check, trunc and closed.\n");
-
-	return;
-}
-
-/***********************************************************************
- *
- ***********************************************************************/
-void
-prt_examples(FILE *stream)
-{
-	/* This example creates 200 files in directory dir1.  It writes */
-	/* 4090 bytes 100 times then truncates 408990 bytes off the file */
-	/* The file contents are checked every 1000 grow. */
-    fprintf(stream,
-	 "# run forever: writes of 4090 bytes then on every 100 iterval\n\
-# truncate file by 408990 bytes.  Done to 200 files in dir1.\n\
-%s -i 0 -g 4090 -T 100 -t 408990 -l -C 10 -c 1000 -d dir1 -S 200\n\n", Progname);
-
-	/* same as above with 5000 byte grow and a 499990 byte tuncate */
-    fprintf(stream,
-	 "# same as above with writes of 5000 bytes and truncs of 499990\n\
-%s -i 0 -g 5000 -T 100 -t 499990 -l -C 10 -c 1000 -d dir2 -S 200\n\n", Progname);
-
-	/* This example beats on opens and closes */
-    fprintf(stream,
-	 "# runs forever: beats on opens and closes of file ocfile - no io\n\
-%s -i 0 -g 0 -c 0 -C 0 ocfile\n\n", Progname);
-
-    fprintf(stream,
-	 "# writes 4096 to files until 50 blocks are written\n\
-%s -i 0 -g 4096 -B 50b file1 file2\n\n", Progname);
-	
-    fprintf(stream,
-	 "# write one byte to 750 files in gdir then unlinks them\n\
-%s -g 1 -C 0 -d gdir -u -S 750\n\n", Progname);
-
-    fprintf(stream,
-	"# run 30 secs: random iosize, random lseek up to eof\n\
-%s -r 1-5000 -R 0--1 -i 0 -L 30 -C 1 g_rand1 g_rand2\n\n", Progname);
-
-    fprintf(stream,
-	"# run 30 secs: grow by lseek then write single byte, trunc every 10 itervals\n\
-%s -g 5000 -wlu -i 0 -L 30 -C 1 -T 10  g_sleek1 g_lseek2\n\n", Progname);
-
-    fprintf(stream, 
-	"# run forever: 5 copies of random iosize, random lseek to beyond eof,\n\
-# rand io types doing a trunc every 5 iterations, with unlinks.\n\
-%s -i0 -r 1-50000 -R 0--2 -I r -C1 -l -n5 -u -U 100-200 gf_rana gf_ranb\n\n", 
-	    Progname);
-
-    fprintf(stream, 
-	"# run forever: 5 copies of random iosize, random lseek to beyond eof,\n\
-# random open flags, rand io types doing a trunc every 10 iterations.\n\
-%s -i0 -r 1-50000 -R 0--2 -o random -I r -C0 -l -T 20 -uU100-200 -n 5 gf_rand1 gf_rand2\n", 
-	    Progname);
-
-
-	return;
-}
-
-/***********************************************************************
- *
- * The file descriptor current offset is assumed to be the end of the
- * file.  
- * Woffset will be set to the offset before the write.
- * Grow_incr will be set to the size of the write or lseek write.
- ***********************************************************************/
-int
-growfile(fd, file, grow_incr, buf)
-int fd;
-char *file;
-int grow_incr;
-unsigned char *buf;
-{
-   int noffset;
-   int ret;
-   /* REFERENCED */
-   int cur_offset;
-   char *errmsg;
-   int fsize;		/* current size of file */
-   int size_grew;	/* size the file grew */
-   struct stat stbuf;
-   int tmp = 0;
-
-        /*
-         * Do a stat on the open file.
-         * If the file is a fifo, set the bit in Mode variable.
-         * This fifo check must be done prior to growfile() returning.
-	 * Also get the current size of the file.
-         */
-        if ( fstat(fd, &stbuf) != -1 ) {
-            if ( S_ISFIFO(stbuf.st_mode) ) {
-		Fileinfo.mode |= MODE_FIFO;
-                Mode |= MODE_FIFO;
-                if ( Debug > 3 )
-                    printf("%s: %d DEBUG4 %s/%d: file is a fifo - no lseek or truncs,\n",
-                        Progname, Pid, __FILE__, __LINE__);
-            }
-	    fsize = stbuf.st_size;
-
-        } else {
-	    fprintf(stderr, "%s%s: %d %s/%d: Unable to fstat(%d, &buf), errno:%d %s\n",
-		Progname, TagName, Pid, __FILE__, __LINE__, fd, errno, strerror(errno));
-
-	    return -1;
-	}
-
-
-        if ( grow_incr <= 0 ) {   /* don't attempt i/o if grow_incr <= 0 */ 
-
-	    Grow_incr=grow_incr;
-	    if ( Debug > 2 )
-		printf("%s: %d DEBUG3 %s/%d: Not attempting to grow, growsize == %d\n",
-		    Progname, Pid, __FILE__, __LINE__, grow_incr);
-	    return grow_incr;
-	}
-
-	if ( Mode & MODE_RAND_SIZE ) {
-	    grow_incr=random_range(min_size, max_size, mult_size, &errmsg);
-	    if (errmsg != NULL) {
-		fprintf(stderr, "%s%s: %d %s/%d: random_range() failed - %s\n", Progname, TagName, Pid, __FILE__, __LINE__, errmsg);
-		return -1;
-	    }
-	    Grow_incr=grow_incr;
-	}
-	else
-	    Grow_incr=grow_incr;
-
-	if ( ! (Mode & MODE_FIFO) ) {
-	    if ((cur_offset=lseek(fd,0,SEEK_CUR)) == -1 ) {
-	        fprintf(stderr, "%s%s: %d %s/%d: tell failed: %s\n",
-		    Progname, TagName, Pid, __FILE__, __LINE__, strerror(errno));
-	        return -1;
-	    }
-        }
-
-	if ( Mode & MODE_GROW_BY_LSEEK ) {
-                Woffset=fsize;
-		if ( Debug > 2 ) {
-		    printf("%s: %d DEBUG3 %s/%d: Current size of file is %d\n", Progname,
-			Pid, __FILE__, __LINE__, Woffset);
-		    printf("%s: %d DEBUG3 %s/%d: lseeking to %d byte with SEEK_END\n", Progname,
-			Pid, __FILE__, __LINE__, grow_incr-1);
-		}
-
-		if ((noffset=lseek(fd, grow_incr-1, SEEK_END)) == -1 ) {
-			fprintf(stderr, "%s%s: %s/%d: lseek(fd, %d, SEEK_END) failed: %s\n",
-				Progname, TagName, __FILE__, __LINE__, grow_incr-1, strerror(errno));
-			return -1;
-		}
-
-		lkfile(fd, LOCK_EX, LKLVL0);	 /* get exclusive lock */
-		
-#if NEWIO
-		ret=lio_write_buffer(fd, io_type, "w", 1, SIGUSR1, &errmsg,0);
-#else
-		ret=write_buffer(fd, io_type, "w", 1, 0, &errmsg); 
-#endif
-
-		if ( ret != 1 ) {
-			fprintf(stderr, "%s%s: %d %s/%d: %d %s\n", 
-			    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
-			if ( ret == -ENOSPC ) {
-				cleanup();
-				exit(2);
-			}
-		}
-/***
-		write(fd, "w", 1);
-****/
-
-		lkfile(fd, LOCK_UN, LKLVL0);
-
-                if ( Debug > 2 )
-                    printf("%s: %d DEBUG3 %s/%d: %d wrote 1 byte to file\n",
-                            Progname, Pid, __FILE__, __LINE__, Iter_cnt);
-
-	} else {  /* end of grow by lseek */
-
-		if ( Fileinfo.openflags & O_APPEND ) {
-		   /*
-		    * Deal with special case of the open flag containing O_APPEND.
-		    * If it does, the current offset does not matter since the write
-		    * will be done end of the file.
-		    */
-		    if ( Debug > 4 )
-			printf("%s: %d DEBUG5 %s/%d: dealing with O_APPEND condition\n",
-			    Progname, Pid, __FILE__, __LINE__ );
-		    lkfile(fd, LOCK_EX, LKLVL0);	 /* get exclusive lock */
-
-		    /*
-		     * do fstat again to get size of the file.
-		     * This is done inside a file lock (if locks are being used).
-		     */
-        	    if ( fstat(fd, &stbuf) != -1 ) {
-            		Woffset = stbuf.st_size;
-        	    } else {
-            		fprintf(stderr, "%s%s: %d %s/%d: Unable to fstat(%d, &buf), errno:%d %s\n",
-                	Progname, TagName, Pid, __FILE__, __LINE__, fd, errno, strerror(errno));
-	
-			lkfile(fd, LOCK_UN, LKLVL0);     /* release lock */
-            		return -1;
-        	    }
-		    if ( Debug > 2 )
-			printf("%s: %d DEBUG3 %s/%d: dealing with O_APPEND condition (offset:fsz:%d)\n",
-			    Progname, Pid, __FILE__, __LINE__, (int)stbuf.st_size);
-
-
-		} else if ( Mode & MODE_RAND_LSEEK ) {
-                   if ( max_lseek == LSK_EOF ) {	/* within file size */
-                        noffset=random_range(min_lseek, fsize, 1, NULL);
-                   }		
-		   else if ( max_lseek == LSK_EOFPLUSGROW ) {	
-		        /* max to beyond file size */
-			noffset=random_range(min_lseek, fsize+grow_incr, 1, NULL);
-		   }
-		   else if ( max_lseek == LSK_EOFMINUSGROW ) {	
-		        /* 
-			 * Attempt to not grow the file.
-			 * If the i/o will fit from min_lseek to EOF,
-			 * pick offset to allow it to fit.
-			 * Otherwise, pick the min_lseek offset and grow
-			 * file by smallest amount.
-			 * If min_lseek is != 0, there will be a problem
-			 * with whole file checking if file is ever smaller
-			 * than min_lseek.
-			 */
-			if ( fsize <= min_lseek + grow_incr )
-			    noffset=min_lseek;  /* file will still grow */
-			else
-			    noffset=random_range(min_lseek, fsize-grow_incr, 1, NULL);
-		   }
-                   else {
-                        noffset=random_range(min_lseek, max_lseek, 1, NULL);
-                   }
-
-		   if ((Woffset=lseek(fd, noffset, SEEK_SET)) == -1 ) {
-                        fprintf(stderr, "%s%s: %d %s/%d: lseek(%d, %d, SEEK_SET) l2 failed: %s\n",
-                                Progname, TagName, Pid, __FILE__, __LINE__, fd, noffset, strerror(errno));
-                        return -1;
-		   }
-                   else if ( Debug > 2 )
-                        printf("%s: %d DEBUG3 %s/%d: lseeked to random offset %d (fsz:%d)\n",
-                            Progname, Pid, __FILE__, __LINE__, Woffset,
-			    (int)stbuf.st_size);
-
-                }
-
-		/*
-		 * lseek to end of file only if not fifo
-		 */
-		else if ( ! (Mode & MODE_FIFO) ) {
-		    if ((Woffset=lseek(fd, 0, SEEK_END)) == -1 ) {
-			fprintf(stderr, "%s%s: %d %s/%d: lseek(fd, 0, SEEK_END) failed: %s\n",
-				Progname, TagName, Pid, __FILE__, __LINE__, strerror(errno));
-			return -1;
-		    }
-                    else if ( Debug > 2 )
-                        printf("%s: %d DEBUG3 %s/%d: lseeked to end of file, offset %d\n",
-                            Progname, Pid, __FILE__, __LINE__, Woffset);
-		}
-
-		if ( Pattern == PATTERN_OFFSET )
-		    datapidgen(STATIC_NUM, buf, grow_incr, Woffset);
-		else if ( Pattern == PATTERN_PID )
-		    datapidgen(Pid, buf, grow_incr, Woffset);
-		else if ( Pattern == PATTERN_ASCII )
-		    dataasciigen(NULL, (char *)buf, grow_incr, Woffset);
-		else if ( Pattern == PATTERN_RANDOM )
-		    databingen('r', buf, grow_incr, Woffset);
-		else if ( Pattern == PATTERN_ALT )
-		    databingen('a', buf, grow_incr, Woffset);
-		else if ( Pattern == PATTERN_CHKER )
-		    databingen('c', buf, grow_incr, Woffset);
-		else if ( Pattern == PATTERN_CNTING )
-		    databingen('C', buf, grow_incr, Woffset);
-		else if ( Pattern == PATTERN_ZEROS )
-		    databingen('z', buf, grow_incr, Woffset);
-		else if ( Pattern == PATTERN_ONES )
-		    databingen('o', buf, grow_incr, Woffset);
-		else
-		    dataasciigen(NULL, (char *)buf, grow_incr, Woffset);
-
-		if ( Debug > 2 )
-		    printf("%s: %d DEBUG3 %s/%d: attempting to write %d bytes\n",
-			Progname, Pid, __FILE__, __LINE__, grow_incr);
-
-		lkfile(fd, LOCK_EX, LKLVL0);	 /* get exclusive lock */
-
-/*****
-		ret=write(fd, buf, grow_incr);
-
-		tmp=tell(fd);
-
-		lkfile(fd, LOCK_UN, LKLVL0);	
-
-		if ( ret != grow_incr) {
-			fprintf(stderr, "%s: %s/%d: write failed: %s\n",
-				Progname, __FILE__, __LINE__, strerror(errno));
-			return -1;
-		}
-*****/
-
-#if NEWIO
-		ret=lio_write_buffer(fd, io_type, (char *)buf, grow_incr,
-			 SIGUSR1, &errmsg,0);
-#else
-		ret=write_buffer(fd, io_type, buf, grow_incr, 0, &errmsg);
-#endif
-
-		if( Mode & MODE_FIFO ){
-			/* If it is a fifo then just pretend the file
-			 * offset is where we think it should be.
-			 */
-			tmp = Woffset + grow_incr;
-		}
-		else{
-			if( (tmp=lseek(fd,0,SEEK_CUR)) < 0 ){ /* get offset after the write */
-				fprintf(stderr, "%s%s: %s/%d: tell(2) failed: %d  %s\n",
-					Progname, TagName, __FILE__, __LINE__, errno, strerror(errno) );
-				return -1;
-			}
-		}
-
-		lkfile(fd, LOCK_UN, LKLVL0);	
-
-		if ( ret != grow_incr ) {
-			fprintf(stderr, "%s%s: %d %s/%d: %d %s\n", 
-			    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
-			if ( ret == -ENOSPC ) {
-				cleanup();
-				exit(2);
-			}
-			return -1;
-		}
-
-		/*
-		 * Check for a condition where the file was truncated just before
-		 * the write. 
-		 */
-		if ( tmp != Woffset + grow_incr) {
-		    /*
-		     * The offset after the write was not as expected.
-		     * This could be caused by the following:
-		     *  - file truncated after the lseek and before the write.
-		     *  - the file was written to after fstat and before the write
-		     *    and the file was opened with O_APPEND.
-		     *
-		     * The pattern written to the file will be considered corrupted.
-		     */
-		    if ( Debug > 0 && lockfile ) {
-		        printf("%s%s: %d DEBUG1 %s/%d: offset after write(%d) not as exp(%d+%d=%d)\n", 	
-			    Progname, TagName, Pid, __FILE__, __LINE__, tmp, Woffset, grow_incr, Woffset+grow_incr);
-			printf("%s%s: %d DEBUG1 %s/%d: %d Assuming file changed by another process, resetting offset:%d (expect pattern mismatch)\n",
-				Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, tmp-grow_incr);
-		    }
-		    if( Debug > 4 ){
-			printf("%s: %d DEBUG5 %s/%d: about to chop Woffset.  tmp=%d, grow_incr=%d, Woffset was %d\n",
-			       Progname, Pid, __FILE__, __LINE__, tmp, grow_incr, Woffset);
-		    }
-		    Woffset=tmp-grow_incr;
-		    if( Woffset < 0 )
-			Woffset = 0;
-		}
-
-	}  /* end of grow by write */
-
-
-	/*
-	 * Woffset - holds start of grow (start of write expect in grow by lseek)
-	 * Grow_incr - holds size of grow (write).
-	 * fsize - holds size of file before write
-	 */
-	size_grew=(Woffset + Grow_incr) - fsize;
-	if ( Debug > 1) {
-	     if ( Mode & MODE_FIFO ) {
-		printf("%s: %d DEBUG2 %s/%d: file is fifo, %d wrote %d bytes\n",
-		    Progname, Pid, __FILE__, __LINE__, Grow_incr, Iter_cnt);
-	     }
-
-	     else if ( size_grew > 0 )
-		printf("%s: %d DEBUG2 %s/%d: %d wrote %d bytes(off:%d), grew file by %d bytes\n",
-                        Progname, Pid, __FILE__, __LINE__, Iter_cnt, Grow_incr, Woffset, size_grew);
-	     else
-		printf("%s: %d DEBUG2 %s/%d: %d wrote %d bytes(off:%d), did not grow file\n",
-                        Progname, Pid, __FILE__, __LINE__, Iter_cnt, Grow_incr, Woffset);
-	}
-
-    	bytes_consumed += size_grew;
-	return 0;
-
-}	/* end of growfile */
-
-/***********************************************************************
- * shrinkfile file by trunc_incr.  file can not be made smaller than
- * size zero.  Therefore, if trunc_incr is larger than file size,
- * file will be truncated to zero.
- * The file descriptor current offset is assumed to be the end of the
- * file.
- *
- ***********************************************************************/
-int
-shrinkfile(fd, filename, trunc_incr, trunc_inter, just_trunc)
-int fd;
-char *filename;
-int trunc_incr;
-int trunc_inter;	/* interval */
-int just_trunc;		/* lseek has already been done for you */
-{
-    static int shrink_cnt = 0;
-    int cur_offset;
-    int new_offset;
-    int ret;
-
-	shrink_cnt++;
-
-	if ( trunc_inter == 0 || (shrink_cnt % trunc_inter != 0))  {
-	    if ( Debug > 3 )
-		printf("%s: %d DEBUG4 %s/%d: Not shrinking file - not time, iter=%d, cnt=%d\n",
-		    Progname, Pid, __FILE__, __LINE__, trunc_inter, shrink_cnt);
-	    return 0;	/* not this time */
-	}
-
-	if ( Mode & MODE_FIFO ) {
-	    if ( Debug > 5 )
-		printf("%s: %d DEBUG5 %s/%d: Not attempting to shrink a FIFO\n",
-		    Progname, Pid, __FILE__, __LINE__);
-	    return 0;	/* can not truncate fifo */
-	}
-
-	lkfile(fd, LOCK_EX, LKLVL0);
-
-	if ((cur_offset=lseek(fd,0,SEEK_CUR)) == -1 ) {
-	    fprintf(stderr, "%s%s: %d %s/%d: tell(%d) failed: %s\n",
-		Progname, TagName, Pid, __FILE__, __LINE__, fd, strerror(errno));
-	    lkfile(fd, LOCK_UN, LKLVL0);
-	    return -1;
-	}
-
-        if ( Mode & MODE_RAND_LSEEK ) {
-            if ( max_lseek <= -1 ) {
-                if ( (new_offset=file_size(fd)) == -1 ) {
-	            lkfile(fd, LOCK_UN, LKLVL0);
-		    return -1;
-		}
-			
-		if ( new_offset < min_lseek )
-		    new_offset=min_lseek;
-		else
-                    new_offset=random_range(min_lseek, new_offset, 1, NULL);
-            }
-            else {
-                new_offset=random_range(min_lseek, max_lseek, 1, NULL);
-            }
-        }
-
-	else {	/* remove trunc_incr from file */
-
-	    new_offset = cur_offset-trunc_incr;
-
-	    if ( new_offset < 0 )
-		new_offset=0;
-	}
-
-	ret=ftruncate(fd, new_offset );
-	if( (ret == 0) && (Debug > 3) ){
-                printf("%s: %d DEBUG4 %s/%d: ftruncated to offset %d, %d bytes from end\n",
-                    Progname, Pid, __FILE__, __LINE__, new_offset, trunc_incr);
-	}
-
-	lkfile(fd, LOCK_UN, LKLVL0);
-
-	if ( ret == -1 ) {
-		fprintf(stderr, "%s%s: %d %s/%d: ftruncate failed: %s\n",
-			Progname, TagName, Pid, __FILE__, __LINE__, strerror(errno));
-		return -1;
-	}
-
-	if ( Debug > 2 ) {
-	    printf("%s: %d DEBUG2 %s/%d: trunc file by %d bytes, to size of = %d bytes\n",
-		Progname, Pid, __FILE__, __LINE__, cur_offset-new_offset, new_offset);
-	}
-	
-
-        bytes_consumed -= (cur_offset - new_offset);
-	return 0;
-
-}	/* end of shrinkfile */
-
-/***********************************************************************
- *
- ***********************************************************************/
-int
-check_write(fd, cf_inter, filename, mode)
-int fd;
-int cf_inter;   /* check file interval */
-char *filename; /* needed for error messages */
-int mode;       /* write mode */
-{
-    int fsize;
-    static int cf_count = 0;
-    int ret = 0;
-    int tmp;
-    char *errmsg;
-    char *ptr;
-
-    cf_count++;
-
-    if ( cf_inter == 0 || (cf_count % cf_inter != 0)) {
-	if ( Debug > 4 )
-	    printf("%s: %d DEBUG5 %s/%d: no write check, not time iter=%d, cnt=%d\n",
-		Progname, Pid, __FILE__, __LINE__, cf_inter, cf_count);
-	return 0;	 /* no check done */
-    }
-
-    if ( Grow_incr <= 0 ) {
-        if ( Debug > 3 )
-	    printf("%s: %d DEBUG4 %s/%d: No write validation,  Grow_incr = %d, offset = %d\n",
-	        Progname, Pid, __FILE__, __LINE__, Grow_incr, Woffset);
-        return 0;	/* no check */
-    }
-
-
-    
-    /*	
-     * Get the shared file lock.  We need to hold the lock from before
-     * we do the stat until after the read.
-     */
-    lkfile(fd, LOCK_SH, LKLVL0);
-
-    if ((fsize=file_size(fd)) == -1 )  {
-        lkfile(fd, LOCK_UN, LKLVL0);
-        return -1;
-
-    } else if ( fsize <= Woffset ) {
-	/*
-	 * The file was truncated between write and now.
-	 * The contents of our last write is totally gone, no check.
-	 */
-	if ( Debug > 1 )
-	    printf("%s%s: %d DEBUG2 %s/%d: %d File size (%d) smaller than where last wrote (%d)- no write validation\n",
-		Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, fsize, Woffset);
-        lkfile(fd, LOCK_UN, LKLVL0);
-        return 0;	/* no validation, but not an error */
- 
-    } else if ( fsize < (Woffset + Grow_incr)) {
-	/*
-	 * The file was truncated between write and now.
-	 * Part of our last write has been truncated, adjust our Grow_incr
-	 * to reflect this.
-	 */
-
-	tmp=Grow_incr;
-	Grow_incr=fsize-Woffset;
-
-	if ( Debug > 1 )  {
-
-	    printf("%s%s: %d DEBUG2 %s/%d: %d fsz:%d, lost(%d)of wrt(off:%d, sz:%d), adj=%d\n",
-	    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, fsize, tmp-Grow_incr, Woffset, tmp, Grow_incr);
-	}
-
-    }
-
-    if ( Debug > 2 )
-        printf("%s: %d DEBUG3 %s/%d: about to do write validation, offset = %d, size = %d\n",
-	    Progname, Pid, __FILE__, __LINE__, Woffset, Grow_incr);
-
-    if ( ! (mode & MODE_FIFO)  ) {
-
-        if ( lseek(fd, Woffset, 0) == -1 ) {
-            fprintf(stderr, "%s%s: %d %s/%d: lseek(fd, %d, 0) failed: %s\n",
-	        Progname, TagName, Pid, __FILE__, __LINE__, Woffset, strerror(errno));
-        }
-        if ( Debug > 3 )
-	    printf("%s: %d DEBUG4 %s/%d: lseeked to offset:%d\n",
-	        Progname, Pid, __FILE__, __LINE__, Woffset);
-    }
-
-    /*
-     * Read last writes data
-     */
-#if NEWIO
-    ret=lio_read_buffer(fd, io_type, Buffer, Grow_incr, SIGUSR1, &errmsg,0);
-#else
-    ret=read_buffer(fd, io_type, Buffer, Grow_incr, 0, &errmsg);
-#endif
-
-    /*
-     * report the error and debug information before releasing
-     * the file lock
-     */
-    if ( ret != Grow_incr ) {
-        fprintf(stderr, "%s%s: %d %s/%d: %d CW %s\n", Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
-        {
-	    struct stat stbuf;
-	    fstat(fd, &stbuf);
-	    if ( Debug > 2 )
-	        printf("%s%s: %d DEBUG3 %s/%d: fd:%d, offset:%d, fsize:%d, openflags:%#o\n",
-	            Progname, TagName, Pid, __FILE__, __LINE__, fd,
-		    (int)lseek(fd,SEEK_CUR,0),	/* FIXME: 64bit/LFS ? */
-		    (int)stbuf.st_size,
-		    Fileinfo.openflags);
-        }
-
-	lkfile(fd, LOCK_UN, LKLVL0);
-	return 1;
-    }
-
-
-    lkfile(fd, LOCK_UN, LKLVL0);
-
-    if ( Mode & MODE_GROW_BY_LSEEK ) {
-	/* check that all zeros upto last character */
-	for(ptr=Buffer; ptr < (Buffer+Grow_incr-1); ptr++) {
-	    if ( *ptr != '\0' ) {
-	        fprintf(stderr,
-		    "%s%s: %d %s/%d: data mismatch at offset %d, exp:%#o(zerofilled), act:%#o in file %s\n",
-		    Progname, TagName, Pid, __FILE__, __LINE__, 
-		    (int)(Woffset+(Grow_incr-(Buffer-ptr))),
-		    0, *ptr, filename);
-	        fflush(stderr);
-		return 1;
-	    }
-	}
-	/* check that the last char is a 'w' */
-	if ( *ptr != 'w' ) {
-	    fprintf(stderr,
-	  "%s%s: %d %s/%d: data mismatch at offset %d, exp:%#o(zerofilled), act:%#o in file %s\n",
-	        Progname, TagName, Pid, __FILE__, __LINE__, 
-		(int)(Woffset+(Grow_incr-(Buffer-ptr))), 'w',
-		*ptr, filename);
-	    fflush(stderr);
-	    return 1;
-	}
-	return 0;   /* all is well */
-	
-    }
-    else if ( Pattern == PATTERN_OFFSET )
-	ret=datapidchk(STATIC_NUM, Buffer, Grow_incr, Woffset, &errmsg);
-    else if ( Pattern == PATTERN_PID )
-	ret=datapidchk(Pid, Buffer, Grow_incr, Woffset, &errmsg);
-    else if ( Pattern == PATTERN_ASCII )
-        ret=dataasciichk(NULL, Buffer, Grow_incr, Woffset, &errmsg);
-    else if ( Pattern == PATTERN_RANDOM )
-	;	/* no check for random */
-    else if ( Pattern == PATTERN_ALT )
-        ret=databinchk('a', Buffer, Grow_incr, Woffset, &errmsg);
-    else if ( Pattern == PATTERN_CHKER )
-        ret=databinchk('c', Buffer, Grow_incr, Woffset, &errmsg);
-    else if ( Pattern == PATTERN_CNTING )
-  	ret=databinchk('C', Buffer, Grow_incr, Woffset, &errmsg);
-    else if ( Pattern == PATTERN_ZEROS )
-    	ret=databinchk('z', Buffer, Grow_incr, Woffset, &errmsg);
-    else if ( Pattern == PATTERN_ONES )
-    	ret=databinchk('o', Buffer, Grow_incr, Woffset, &errmsg);
-    else
-	ret=dataasciichk(NULL, Buffer, Grow_incr, Woffset, &errmsg);
-
-    if ( ret >= 0 ) {
-	fprintf(stderr, "%s%s: %d %s/%d: %d CW %s in file %s\n",
-		Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg, filename);
-
-	if ( Debug > 0 )
-	    printf("%s%s: %d DEBUG1 %s/%d: **fd:%d, lk:%d, offset:%d, sz:%d open flags:%#o %s\n",
-		Progname, TagName, Pid, __FILE__, __LINE__, fd, lockfile, 
-		Woffset, Grow_incr, Fileinfo.openflags, openflags2symbols(Fileinfo.openflags, ",", 0));
-
-	fflush(stderr);
-	return 1;
-    }
-
-    if ( Debug > 6 )
-        printf("%s: %d DEBUG7 %s/%d: No corruption detected on write validation , offset = %d, size = %d\n",
-            Progname, Pid, __FILE__, __LINE__, Woffset, Grow_incr);
-
-    return 0;	/* all is well */
-}
-
-
-
-/***********************************************************************
- *
- ***********************************************************************/
-int
-check_file(fd, cf_inter, filename, no_file_check)
-int fd;
-int cf_inter;	/* check file interval */
-char *filename;	/* needed for error messages */
-int no_file_check;	/* if set, do not do file content check */
-{
-    int fsize;
-    static int cf_count = 0;
-    char *buf;
-    int ret;
-    int ret_val = 0;
-    int rd_cnt;
-    int rd_size;
-    char *errmsg;
-
-	cf_count++;
-
-	if ( cf_inter == 0 || (cf_count % cf_inter != 0)) {
-		if ( Debug > 4 )
-		    printf("%s: %d DEBUG5 %s/%d: No file check - not time, iter=%d, cnt=%d\n",
-			Progname, Pid, __FILE__, __LINE__, cf_inter, cf_count);
-		return 0;	 /* no check done */
-	}
-
-	/*
-	 * if we can't determine file content, don't bother checking
-	 */
-        if ( no_file_check ) {
-		if ( Debug > 4 )
-		    printf("%s: %d DEBUG5 %s/%d: No file check, lseek grow or random lseeks\n",
-			Progname, Pid, __FILE__, __LINE__);
-		return 0;
-	}
-
-	/*
-	 * Lock the file.  We need to have the file lock before
-	 * the stat and until after the last read to prevent
-	 * a trunc/truncate from "corrupting" our data.
-	 */
-	lkfile(fd, LOCK_SH, LKLVL0);
-	
-	if ((fsize=file_size(fd)) == -1 )  {
-	    lkfile(fd, LOCK_UN, LKLVL0);
-	    return -1;
-	}
-
-        if ( fsize == 0 ) {
-	    if ( Debug > 2 )
-            printf("%s: %d DEBUG3 %s/%d: No file validation, file size == 0\n",
-                Progname, Pid, __FILE__, __LINE__);
-
-	    lkfile(fd, LOCK_UN, LKLVL0);
-	    return 0;
-	}
-
-	if ( Debug > 2 )
-            printf("%s: %d DEBUG3 %s/%d: about to do file validation\n",
-	        Progname, Pid, __FILE__, __LINE__);
-
-        if ( fsize > MAX_FC_READ ) {
-	    /*
-	     * read the file in MAX_FC_READ chuncks.
-	     */
-
-	    if ((buf=(char *)malloc(MAX_FC_READ)) == NULL ) {
-	        fprintf(stderr, "%s%s: %s/%d: malloc(%d) failed: %s\n", Progname, TagName,
-		    __FILE__, __LINE__, MAX_FC_READ, strerror(errno));
-	       lkfile(fd, LOCK_UN, LKLVL0);
-	       return -1;
-	    }
-
-	    lseek(fd, 0, SEEK_SET);
-
-	    lkfile(fd, LOCK_SH, LKLVL0);  /* get lock on file before getting file size */
-
-	    rd_cnt=0;
-	    while (rd_cnt < fsize ) {
-	        if ( fsize - rd_cnt > MAX_FC_READ )
-		    rd_size=MAX_FC_READ;
-	        else
-		    rd_size=fsize - rd_cnt;
-				
-#if NEWIO
-	        ret=lio_read_buffer(fd, io_type, buf, rd_size,
-		    SIGUSR1, &errmsg,0);
-#else
-	        ret=read_buffer(fd, io_type, buf, rd_size, 0, &errmsg);
-#endif
-
-	        if (ret != rd_size ) {
-		    fprintf(stderr, "%s%s: %d %s/%d: %d CFa %s\n", 
-			Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
-		    free(buf);
-		    lkfile(fd, LOCK_UN, LKLVL0);
-		    return -1;
-	        }
-/**
-	        read(fd, buf, rd_size);
-***/
-
-	        if ( Pattern == PATTERN_OFFSET )
-	            ret=datapidchk(STATIC_NUM, buf, rd_size, rd_cnt, &errmsg);
-	        else if ( Pattern == PATTERN_PID )
-	            ret=datapidchk(Pid, buf, rd_size, rd_cnt, &errmsg);
-	        else if ( Pattern == PATTERN_ASCII )
-	            ret=dataasciichk(NULL, buf, rd_size, rd_cnt, &errmsg);
-	        else if ( Pattern == PATTERN_RANDOM )
-	   	  	;  /* no checks for random */
-	        else if ( Pattern == PATTERN_ALT )
-	            ret=databinchk('a', buf, rd_size, rd_cnt, &errmsg);
-	        else if ( Pattern == PATTERN_CHKER )
-	            ret=databinchk('c', buf, rd_size, rd_cnt, &errmsg);
-	        else if ( Pattern == PATTERN_CNTING )
-	            ret=databinchk('C', buf, rd_size, rd_cnt, &errmsg);
-	        else if ( Pattern == PATTERN_ZEROS )
-	            ret=databinchk('z', buf, rd_size, rd_cnt, &errmsg);
-	        else if ( Pattern == PATTERN_ONES )
-	            ret=databinchk('o', buf, rd_size, rd_cnt, &errmsg);
-	        else
-	            ret=dataasciichk(NULL, buf, rd_size, rd_cnt, &errmsg);
-		
-		    
-	        if ( ret >= 0 ) {
-		    fprintf(stderr,
-		        "%s%s: %d %s/%d: %d CFp %s in file %s\n",
-		        Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg, filename);
-		    fflush(stderr);
-		    ret_val=1;
-		    lkfile(fd, LOCK_UN, LKLVL0);
-		    break;
-	        }
-	        rd_cnt += rd_size;
-	    }
-
-	    lkfile(fd, LOCK_UN, LKLVL0);
-
-	    free(buf);
-
-	}
-	else {
-	    /*
-	     * Read the whole file in a single read 
-	     */
-	    if((buf=(char *)malloc(fsize)) == NULL ) {
-			fprintf(stderr, "%s%s: %s/%d: malloc(%d) failed: %s\n", Progname, TagName,
-				__FILE__, __LINE__, fsize, strerror(errno));
-			fflush(stderr);
-			return -1;
-	    }
-
-	    lseek(fd, 0, SEEK_SET);
-
-/****
-	    read(fd, buf, fsize);
-****/
-#if NEWIO
-	    ret=lio_read_buffer(fd, io_type, buf, fsize, SIGUSR1, &errmsg,0);
-#else
-	    ret=read_buffer(fd, io_type, buf, fsize, 0, &errmsg);
-#endif
-
-	    /* unlock the file as soon as we can */
-	    lkfile(fd, LOCK_UN, LKLVL0);
-
-
-	    if ( ret != fsize ) {
-		fprintf(stderr, "%s%s: %d %s/%d: %d CFw %s\n", 
-		    Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg);
-		ret_val=1;
-	    }
-	    else  {
-	        if ( Pattern == PATTERN_OFFSET )
-		    ret=datapidchk(STATIC_NUM, buf, fsize, 0, &errmsg);
-	        else if ( Pattern == PATTERN_PID )
-		    ret=datapidchk(Pid, buf, fsize, 0, &errmsg);
-		else if ( Pattern == PATTERN_ASCII )
-		    ret=dataasciichk(NULL, buf, fsize, 0, &errmsg);
-		else if ( Pattern == PATTERN_RANDOM )
-		    ;	/* no check for random */
-		else if ( Pattern == PATTERN_ALT )
-		    ret=databinchk('a', buf, fsize, 0, &errmsg);
-		else if ( Pattern == PATTERN_CHKER )
-		    ret=databinchk('c', buf, fsize, 0, &errmsg);
-		else if ( Pattern == PATTERN_CNTING )
-		    ret=databinchk('C', buf, fsize, 0, &errmsg);
-		else if ( Pattern == PATTERN_ZEROS )
-		    ret=databinchk('z', buf, fsize, 0, &errmsg);
-		else if ( Pattern == PATTERN_ONES )
-		    ret=databinchk('o', buf, fsize, 0, &errmsg);
-		else
-		    ret=dataasciichk(NULL, buf, fsize, 0, &errmsg);
-
-		if ( ret >= 0 ) {
-		    fprintf(stderr, "%s%s: %d %s/%d: %d CFw %s in file %s\n",
-			Progname, TagName, Pid, __FILE__, __LINE__, Iter_cnt, errmsg, filename);
-		    fflush(stderr);
-		    ret_val=1;
-		}
-	    }
-	    free(buf);
-	}
-
-	return ret_val;
-
-}	/* end of check_file */
-
-/***********************************************************************
- *
- ***********************************************************************/
-int
-file_size(int fd)
-{
-    struct stat sb;
-
-        if (fstat(fd, &sb) < 0) {
-            fprintf(stderr, "%s%s: %d %s/%d: Unable to fstat(%d, &buf), errno:%d %s\n",
-                Progname, TagName, Pid, __FILE__, __LINE__, fd, errno, strerror(errno));
-	    return -1;
-	
-        }
-
-        return sb.st_size;
-}
-
-/***********************************************************************
- *  do file lock/unlock action.
- ***********************************************************************/
-int
-lkfile(int fd, int operation, int lklevel)
-{
-    char *errmsg;
-
-    
-    if ( lockfile == lklevel) {
-	
-        if ( Debug > 5 ) {
-	    switch (operation) {
- 	    case LOCK_UN:
-	        printf("%s: %d DEBUG6 %s/%d: Attempting to release lock on fd %d\n", 
-		    Progname, Pid, __FILE__, __LINE__, fd);
-		break;
-
- 	    case LOCK_SH:
-	        printf("%s: %d DEBUG6 %s/%d: Attempting to get read/shared lock on fd %d\n", 
-		    Progname, Pid, __FILE__, __LINE__, fd);
-		break;
-
- 	    case LOCK_EX:
-	        printf("%s: %d DEBUG6 %s/%d: Attempting to get write/exclusive lock on fd %d\n", 
-		    Progname, Pid, __FILE__, __LINE__, fd);
-		break;
-	    }
-	}
-
-	/*
-	 * Attempt to get/release desired lock.
-	 * file_lock will attempt to do action over and over again until
-	 * either an unretryable error or the action is completed.
-	 */
-
-        if ( file_lock(fd, operation, &errmsg) != 0 ) {
-	    printf("%s%s: %d %s/%d: Unable to perform lock operation. %s\n",
-		Progname, TagName, Pid, __FILE__, __LINE__, errmsg);
-
-	    /* do we count this as an error? handle_error();  */
-	    return -1;
-        }
-
-        if ( Debug > 2 ) {
-	    switch (operation) {
- 	    case LOCK_UN:
-	        printf("%s: %d DEBUG3 %s/%d: Released lock on fd %d\n", 
-		    Progname, Pid, __FILE__, __LINE__, fd);
-		break;
-
- 	    case LOCK_SH:
-	        printf("%s: %d DEBUG3 %s/%d: Got read/shared lock on fd %d\n", 
-		    Progname, Pid, __FILE__, __LINE__, fd);
-		break;
-
- 	    case LOCK_EX:
-	        printf("%s: %d DEBUG3 %s/%d: Got write/exclusive lock on fd %d\n", 
-		    Progname, Pid, __FILE__, __LINE__, fd);
-		break;
-	
-	    default:
-	        printf("%s: %d DEBUG3 %s/%d: Completed action %d on fd %d\n", 
-		    Progname, Pid, __FILE__, __LINE__, operation, fd);
-		break;
-	    }
-	}
-   }
-
-   return 0;
-}
-
-/***********************************************************************
- *
- ***********************************************************************/
-int
-pre_alloc(file, fd, size)
-char *file;
-int fd;
-int size;
-{
-
-#ifdef XFS_IOC_RESVSP
-    struct xfs_flock64 f;
-
-	f.l_whence = 0;
-	f.l_start = 0;
-	f.l_len = size;
-
-	/* non-zeroing reservation */
-	if( xfsctl( file, fd, XFS_IOC_RESVSP, &f ) == -1 ){
-                fprintf(stderr, "%s%s %s/%d: Unable to pre-alloc space: xfsctl(XFS_IOC_RESVSP) failed: %d  %s\n",
-			Progname, TagName,
-                        __FILE__, __LINE__, errno, strerror(errno));
-		return -1;
-	}
-#else
-    struct flock64 f;
-
-	f.l_whence = 0;
-	f.l_start = 0;
-	f.l_len = size;
-
-	/* non-zeroing reservation */
-	if( fcntl( fd, F_RESVSP64, &f ) == -1 ){
-                fprintf(stderr, "%s%s %s/%d: Unable to pre-alloc space: fcntl(F_RESVSP) failed: %d  %s\n",
-			Progname, TagName,
-                        __FILE__, __LINE__, errno, strerror(errno));
-		return -1;
-	}
-#endif
-
-	return 0;
-}