root@qetzal.UUCP (07/15/87)
Brandon - here is a little utility program for USG systems; it may very well work on BSD as well. Please post to comp.sources.misc. Submitted by qetzal!rcw; Thanks to rochester!ken #! /bin/sh # This is a shell archive, meaning: # 1. Remove everything above the #! /bin/sh line. # 2. Save the resulting text in a file. # 3. Execute the file with /bin/sh (not csh) to create: # taprd.1 # taprd.c # This archive created: Fri Jul 3 13:46:03 1987 export PATH; PATH=/bin:/usr/bin:$PATH if test -f 'taprd.1' then echo shar: "will not over-write existing file 'taprd.1'" else cat << \SHAR_EOF > 'taprd.1' .TH TAPRD 1 AUS .SH NAME taprd \- read tape and print its format .SH SYNOPSIS .B taprd raw_special_file .SH DESCRIPTION .I Taprd is used to read a tape and list the format of records and tape marks. It will print a message describing the last set of identical records encountered every time the record type changes. On receiving an interrupt, .I taprd prints a summary before terminating. .SH EXAMPLES taprd /dev/rmt0 .SH SEE ALSO mt (4) SHAR_EOF fi if test -f 'taprd.c' then echo shar: "will not over-write existing file 'taprd.c'" else cat << \SHAR_EOF > 'taprd.c' /* ** this creation just reads raw tape file specified as ** 1st argument. it then reports on record size etc. on ** double tapemark it stops. */ #include <sys/types.h> #include <sys/stat.h> #include <signal.h> #include <stdio.h> #include <fcntl.h> #define NBUF 44 /* Maximum size tape block likely to be encountered */ #define NERR 10 /* NERR consecutive ==> giveup */ char buf[NBUF*BUFSIZ]; int flag; int err; catch(s) int s; { signal(s, SIG_IGN); flag = 1; } main(argc, argv) int argc; char ** argv; { register iold; register i; register nrec; register infd; struct stat sbuf; signal(SIGHUP, catch); if ( signal(SIGINT, SIG_IGN) == SIG_DFL ) signal(SIGINT, catch); if ( signal(SIGQUIT, SIG_IGN) == SIG_DFL ) signal(SIGQUIT, catch); if(argc != 2) { fprintf(stderr, "Usage: %s file\n", argv[0]); return 2; } if((infd = open(argv[1], O_RDONLY)) == -1) { perror(argv[1]); return 2; } fstat(infd, &sbuf); if((sbuf.st_mode&S_IFMT) != S_IFCHR) { fprintf(stderr, "%s not a raw device !!\n", argv[1]); return 2; } nrec = 0; iold = read(infd, buf, sizeof buf); for(;;) { nrec++; i = read(infd, buf, sizeof buf); if(i == iold && i == 0) goto fini; /* considered end-of-tape */ if ( (i==iold) && (i==-1) && (nrec==NERR) ) { printf("%d consecutive errors: EOT assumed\n",NERR); return 1; } if((i == iold) && !flag) continue; if(iold) { if(iold != -1) { printf("%6d. * %6o(%6d.)\n", nrec, iold, iold); } else { printf("%6d. * ERR \n", nrec); err++; if(nrec > 1) return err; } } else { printf("\tTM\n"); } nrec = 0; iold = i; if(flag) { printf("Interrupted\n"); return 1; } } fini: printf("\tEOT\n"); return err; } SHAR_EOF fi exit 0 # End of shell archive