diff options
Diffstat (limited to 'sys/mtio/zzdebug.x')
-rw-r--r-- | sys/mtio/zzdebug.x | 357 |
1 files changed, 357 insertions, 0 deletions
diff --git a/sys/mtio/zzdebug.x b/sys/mtio/zzdebug.x new file mode 100644 index 00000000..cf02e610 --- /dev/null +++ b/sys/mtio/zzdebug.x @@ -0,0 +1,357 @@ +# Copyright(c) 1986 Association of Universities for Research in Astronomy Inc. + +include <xalloc.h> +include <mach.h> +include <fset.h> + +task alloc = t_allocate, + dealloc = t_deallocate, + status = t_status, + mtpos = t_mtposition, + wtestfile = t_wtestfile, + mtexamine = t_mtexamine, + mtcopy = t_mtcopy, + rew = t_rewind + + +.help testmtio +.nf __________________________________________________________________________ +MTIO test routines. Assorted routines for verification of MTIO. + + alloc Allocate a drive. + + dealloc Deallocate a drive. + + status Print drive status + + mtpos Position to the indicated file and record. + + wtestfile Writes a test file. The number of records and the + range of record sizes may be specified. The contents + of a record are determined by its size. + + mtexamine Examines the structure of a tape. Tells the number of + files on the tape, the number of records in each file, + the sizes of the records, and optionally dumps the + contents of an indicated range of records from each + file. + + mtcopy Fast binary copy. Copies a binary disk or tape file + to a binary disk or tape file using all the FIO + defaults. +.endhelp _____________________________________________________________________ + + +# ALLOCATE -- Allocate a drive. + +procedure t_allocate() + +int junk, status +char drive[SZ_FNAME] +char owner[SZ_FNAME] +int xallocate(), xdevowner() + +begin + call clgstr ("drive", drive, SZ_FNAME) + status = xallocate (drive) + + switch (status) { + case OK: + call printf ("device allocated successfully\n") + case ERR: + call printf ("cannot allocate device\n") + case DV_DEVFREE: + call printf ("device is free and may be allocated\n") + case DV_DEVALLOC: + call printf ("device is already allocated\n") + case DV_DEVINUSE: + junk = xdevowner ("drive", owner, SZ_FNAME) + call printf ("device is already allocated to `%s'\n") + call pargstr (owner) + case DV_DEVNOTFOUND: + call printf ("device not found\n") + default: + call printf ("unknown status %d\n") + call pargi (status) + } +end + + +# DEALLOCATE -- Deallocate a drive. + +procedure t_deallocate() + +int junk, status +char drive[SZ_FNAME] +char owner[SZ_FNAME] + +bool clgetb() +int xdeallocate(), xdevowner() + +begin + call clgstr ("drive", drive, SZ_FNAME) + status = xdeallocate (drive, clgetb ("rewind")) + + switch (status) { + case OK: + call printf ("device deallocated successfully\n") + case ERR: + call printf ("cannot deallocate device\n") + case DV_DEVFREE: + call printf ("device is free and may be allocated\n") + case DV_DEVALLOC: + call printf ("device is already allocated\n") + case DV_DEVINUSE: + junk = xdevowner ("drive", owner, SZ_FNAME) + call printf ("device is already allocated to `%s'\n") + call pargstr (owner) + case DV_DEVNOTFOUND: + call printf ("device not found\n") + default: + call printf ("unknown status %d\n") + call pargi (status) + } +end + + +# STATUS -- Print drive status. + +procedure t_status() + +int status +char drive[SZ_FNAME] +char owner[SZ_FNAME] +int xdevowner() + +begin + call clgstr ("drive", drive, SZ_FNAME) + status = xdevowner (drive, owner, SZ_FNAME) + + switch (status) { + case OK: + call printf ("device deallocated successfully\n") + case ERR: + call printf ("cannot deallocate device\n") + case DV_DEVFREE: + call printf ("device is free and may be allocated\n") + case DV_DEVALLOC: + call printf ("device is already allocated\n") + case DV_DEVINUSE: + call printf ("device is allocated to `%s'\n") + call pargstr (owner) + case DV_DEVNOTFOUND: + call printf ("device not found\n") + default: + call printf ("unknown status %d\n") + call pargi (status) + } +end + + +# MTPOS -- Position to the indicated file and record. + +procedure t_mtposition() + +char drive[SZ_FNAME] +int clgeti() + +begin + call clgstr ("drive", drive, SZ_FNAME) + call mtposition (drive, clgeti("file"), clgeti("record")) +end + + +# WTESTFILE -- Write a test file to the tape. Specify file [1] to write to +# a new tape. If no file number is given, the file is appended to the tape. +# Specify the number of records to be written and the range of sizes in bytes +# of the records. Each byte of a record will contain the size of the record +# modulus 256. + +procedure t_wtestfile() + +char mtname[SZ_FNAME] +int nrecords +int min_recsize, max_recsize + +pointer buf +long seed +int fd, i, recsize, oschan, status +int clgeti(), mtopen(), fstati() +real urand() +data seed /123/ + +begin + # Get tapefile name and open file for writing. + call clgstr ("mtname", mtname, SZ_FNAME) + fd = mtopen (mtname, WRITE_ONLY, 1) + oschan = fstati (fd, F_CHANNEL) + + nrecords = max (0, clgeti ("nrecords")) + min_recsize = max (1, clgeti ("min_recsize")) + max_recsize = max (min_recsize, clgeti ("max_recsize")) + + call calloc (buf, max_recsize, TY_CHAR) + + # Records are written by directly calling ZAWRMT, so that we can + # write odd size records. + + do i = 1, nrecords { + recsize = int ((max_recsize - min_recsize) * urand (seed)) + + min_recsize + call zawrmt (oschan, Memc[buf], recsize, 0) + call zawtmt (oschan, status) + if (status == ERR) + call error (1, "write error") + } + + call mfree (buf, TY_CHAR) + call close (fd) +end + + +# MTEXAMINE -- Examine the structure of a tape filesystem or a file. If no file +# number is given, all files are examined. + +procedure t_mtexamine() + +int fileno, nrecords +char mtname[SZ_FNAME], mtfile[SZ_FNAME] +int strlen(), mt_examine() + +begin + call clgstr ("mtname", mtname, SZ_FNAME) + call fseti (STDOUT, F_FLUSHNL, YES) + + if (mtname[strlen(mtname)] == ']') { + call strcpy (mtname, mtfile, SZ_FNAME) + nrecords = mt_examine (STDOUT, mtname) + + } else { + fileno = 1 + repeat { + call sprintf (mtfile, SZ_FNAME, "%s[%d]") + call pargstr (mtname) + call pargi (fileno) + fileno = fileno + 1 + } until (mt_examine (STDOUT, mtfile) == 0) + } +end + + +# MT_EXAMINE -- Examine a magtape file. Print file number, then count +# successive records. When the record size changes, print the number of +# records encountered with the old size. When all done, print the total +# number of records and bytes. Return the number of records in the file. + +int procedure mt_examine (out, mtfile) + +int out # output stream +char mtfile[ARB] # magtape file to be examined + +pointer buf +int in, nrecords, totrecords, totbytes, bufsize, recsize, last_recsize +errchk mtopen, read, fstati, printf, pargi +int mtopen(), read(), fstati() + +begin + in = mtopen (mtfile, READ_ONLY, 0) + bufsize = fstati (in, F_BUFSIZE) + call malloc (buf, bufsize, TY_CHAR) + + call fprintf (out, " File %s:\n") + call pargstr (mtfile) + + totrecords = 0 + nrecords = 0 + totbytes = 0 + last_recsize = 0 + + # Describe record composition of file. + while (read (in, Memc[buf], bufsize) != EOF) { + recsize = fstati (in, F_SZBBLK) + if (nrecords == 0) { # first record + nrecords = 1 + last_recsize = recsize + } else if (recsize == last_recsize) { + nrecords = nrecords + 1 + } else { + call fprintf (out, "\t%d %d-byte records\n") + call pargi (nrecords) + call pargi (last_recsize) + nrecords = 1 + last_recsize = recsize + } + totrecords = totrecords + 1 + totbytes = totbytes + recsize + } + + if (nrecords > 0) { + call fprintf (out, "\t%d %d-byte records\n") + call pargi (nrecords) + call pargi (last_recsize) + } + + # Print total count of records, bytes. + call fprintf (out, "\tTotal %d records, %d bytes\n") + call pargi (totrecords) + call pargi (totbytes) + + call mfree (buf, TY_CHAR) + call close (in) + + return (totrecords) +end + + +# MTCOPY -- Copy a binary file from magtape or disk to magtape or disk, +# using all the default FIO and MTIO pararameters. If the output file is +# a magtape, all records (except possibly the last record in the file) will +# be the same size. If input tape records are not commensurate with the size +# of a CHAR they will be zero-padded to an integral number of chars upon +# input. + +procedure t_mtcopy() + +pointer buf +int in, out, bufsize, acmode +char infile[SZ_FNAME], outfile[SZ_FNAME] +int mtopen(), fstati(), read(), mtfile() + +begin + call clgstr ("infile", infile, SZ_FNAME) + call clgstr ("outfile", outfile, SZ_FNAME) + + in = mtopen (infile, READ_ONLY, 0) + + # If output file is a disk file, create a new file, but do not + # create a new tape if writing to tape. + + acmode = NEW_FILE + if (mtfile(outfile) == YES) + acmode = WRITE_ONLY + out = mtopen (outfile, acmode, 0) + + bufsize = fstati (in, F_BUFSIZE) + call malloc (buf, bufsize, TY_CHAR) + + while (read (in, Memc[buf], bufsize) != EOF) + call write (out, Memc[buf], fstati (in, F_NCHARS)) + + call mfree (buf, TY_CHAR) + call close (in) + call close (out) +end + + +# REWIND -- Rewind the tape. + +procedure t_rewind() + +char mtname[SZ_FNAME] +bool clgetb() +int btoi() + +begin + call clgstr ("mtname", mtname, SZ_FNAME) + call mtrewind (mtname, btoi(clgetb("initialize"))) +end |