Path: utzoo!utgpu!news-server.csri.toronto.edu!rpi!zaphod.mps.ohio-state.edu!swrinde!cs.utexas.edu!uunet!virtech!cpcahil From: cpcahil@virtech.uucp (Conor P. Cahill) Newsgroups: comp.unix.sysv386 Subject: Re: Retensioning tapes through wt(7) under ISC 3.2.2.1 Keywords: wt(7), QIC-60, retensioning, tape Message-ID: <1991Apr23.130436.7470@virtech.uucp> Date: 23 Apr 91 13:04:36 GMT References: <1991Apr21.174450.26570@gorgon.uucp> Organization: Virtual Technologies Inc. Lines: 327 dag@gorgon.uucp (Daniel A. Glasser) writes: >I have a 60 meg tape drive (TECMAR QT-60i) connected to a Wangtek PC-60 >controller, and it works just fine with the ISC WT driver. I have been >retensioning my tapes by booting DOS from a floppy and using the utilities >that came with the drive. I would like to do it without rebooting my >machine. I've been trying to write a retension utility that uses the >wt(7)'s documented RETENS command to ioctl(), but seem to be missing First off, I don't know why you bother to retension the tapes, I have been using various QIC tapes for several years and have yet to run into a problem that would be solved by retensioning (so I dont bother anymore) Yes, I flirt with danger on a daily basis :-) Anyway, here is the source for a tape command utility that gives you the capability to do what you want. #!/bin/sh # This is a shell archive (produced by shar 3.49) # To extract the files from this archive, save it to a file, remove # everything above the "!/bin/sh" line above, and type "sh file_name". # # made 04/23/1991 13:03 UTC by cpcahil@virtech # Source directory /a/corp/src/cmd/tapecmd # # existing files will NOT be overwritten unless -c is specified # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 596 -r--r--r-- Makefile # 3831 -r--r--r-- tapecmd.c # # ============= Makefile ============== if test -f 'Makefile' -a X"$1" != X"-c"; then echo 'x - skipping Makefile (File already exists)' else echo 'x - extracting Makefile (Text)' sed 's/^X//' << 'SHAR_EOF' > 'Makefile' && # # (c) Copyright 1991 Conor P. Cahill (uunet!virtech!cpcahil). # You may copy, distribute, and use this software as long as this # copyright statement is not removed. # # # This is the Makefile for the tapecmd utility # # $Id: Makefile,v 1.2 91/04/23 09:03:03 cpcahil Exp $ # CC=cc #DFLAGS=-DDEBUG=40 CFLAGS= -O $(DFLAGS) LDFLAGS= LIBS= INSTDIR=/usr/local/bin X SRCS=tapecmd.c OBJS=$(SRCS:.c=.o) EXE=tapecmd X all: $(EXE) X install: $(INSTDIR)/$(EXE) X $(INSTDIR)/$(EXE): $(EXE) X -rm -f $@.old X -mv -f $@ $@.old X cp $? $@ X -rm -f $@.old X X $(EXE): $(OBJS) X $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) X SHAR_EOF chmod 0444 Makefile || echo 'restore of Makefile failed' Wc_c="`wc -c < 'Makefile'`" test 596 -eq "$Wc_c" || echo 'Makefile: original size 596, current size' "$Wc_c" fi # ============= tapecmd.c ============== if test -f 'tapecmd.c' -a X"$1" != X"-c"; then echo 'x - skipping tapecmd.c (File already exists)' else echo 'x - extracting tapecmd.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'tapecmd.c' && /* X * (c) Copyright 1990 Conor P. Cahill (uunet!virtech!cpcahil). X * You may copy, distribute, and use this software as long as this X * copyright statement is not removed. X */ #include #include #include X #include #include #include X #define SLEEP_TIME 7 #define TAPE_ERASE 0x01 #define TAPE_RETEN 0x02 #define TAPE_REWIND 0x04 #define TAPEFILE_NOREWIND "/dev/rnmt0" #define TAPEFILE_REWIND "/dev/rmt0" #define DEFAULT_FILENAME TAPEFILE_REWIND X static char rcs_hdr[] = "$Id: tapecmd.c,v 1.4 91/04/23 09:03:05 cpcahil Exp $"; X int nointeract; X main(argc,argv) X int argc; X char **argv; { X X char * command; X int count = 1; X extern int errno; X int fd; X char * filename = DEFAULT_FILENAME; X int numtapes = 1; X int tape_cmd; X int tape_count = 0; X X /* X * if silent (no interaction) mode X */ X if( (argc > 1) && (strcmp(argv[1],"-n")) == 0 ) X { X nointeract = 1; X argc--; X argv++; X } X X switch(argc) X { X case 2: X command = argv[1]; X break; X case 3: X command = argv[1]; X if( isdigit(argv[2][0]) ) X { X count = atoi(argv[2]); X } X else X { X filename = argv[2]; X } X break; X case 4: X command = argv[1]; X if( isdigit(argv[2][0]) ) X { X count = atoi(argv[2]); X filename = argv[3]; X } X else X { X filename = argv[2]; X count = atoi(argv[3]); X } X break; X default: X usage(argv[0]); X break; X X } /* switch(argc... */ X X /* X * Now check arguments... X * count must be greater than zero. X */ X X if( count <= 0 ) X { X fprintf(stderr,"Illegal count specified %d\n",count); X usage(argv[0]); X } X if( strncmp(command,"ret",3) == 0 ) X { X tape_cmd = TAPE_RETEN; X } X else if( strncmp(command,"rew",3) == 0) X { X tape_cmd = TAPE_REWIND; X if( strcmp(filename,TAPEFILE_NOREWIND) == 0 ) X { X if( filename != DEFAULT_FILENAME ) X { X fprintf(stderr,"File name changed to %d %s\n", X TAPEFILE_REWIND, X "to perform rewind"); X } X filename = TAPEFILE_REWIND; X } X } X else if( command[0] == 'e' ) X { X tape_cmd = TAPE_ERASE; X } X else X { X fprintf(stderr,"Illegal command: %s\n", command); X usage(argv[0]); X } X X X while( count-- > 0 ) X { X if( ! nointeract ) X { X (void) change_tape(++tape_count,tape_cmd); X } X X if( (fd=open(filename,O_RDWR)) == -1 ) X { X fprintf(stderr,"Failed to open %s, errno = %d\n", X filename, errno); X exit(10); X } X X if( tape_cmd != TAPE_REWIND ) X { X /* X * make sure the tape has stablized by sleeping a X * bit before sending the ioctl X */ X sleep(SLEEP_TIME); X X if( ioctl(fd,WTQICMD,tape_cmd) == 1) X { X fprintf(stderr,"Ioctl failed, errno = %d\n", X errno); X fprintf(stderr,"Operation may not have %s\n", X "succeeded"); X } X } X X close(fd); X } X exit(0); } X usage(pgm) X char * pgm; { X char * ptr; X char * strrchr(); X X if( (ptr=strrchr(pgm,'/')) != (char *) 0) X { X pgm = ptr+1; X } X X fprintf(stderr,"Usage: %s tape_command [-n] [count] [tapefilename]\n", X pgm); X fprintf(stderr,"Where tape_command can be: %s\n", X "rewind, retension, or erase"); X fprintf(stderr," -n signifies no interaction\n"); X fflush(stderr); X exit(10); } X change_tape(cnt,cmd) X int cnt; X int cmd; { X char buffer[120]; X char * job; X char * suffix; X X switch(cnt) X { X case 1: X suffix = "st"; X break; X case 2: X suffix = "nd"; X break; X case 3: X suffix = "rd"; X break; X default: X suffix = "th"; X break; X X } /* switch(cnt... */ X X switch(cmd) X { X case TAPE_REWIND: X job = "rewind"; X break; X X case TAPE_RETEN: X job = "retension"; X break; X X default: X job = "erase"; X break; X X } /* switch(cmd... */ X X fprintf(stdout,"Please place the %d%s tape in the drive and\n", X cnt, suffix); X fprintf(stdout,"press to %s it",job); X fflush(stdout); X X (void) ioctl(0,TCFLSH, 0); X (void) read(0,buffer,120); } X SHAR_EOF chmod 0444 tapecmd.c || echo 'restore of tapecmd.c failed' Wc_c="`wc -c < 'tapecmd.c'`" test 3831 -eq "$Wc_c" || echo 'tapecmd.c: original size 3831, current size' "$Wc_c" fi exit 0 -- Conor P. Cahill (703)430-9247 Virtual Technologies, Inc. uunet!virtech!cpcahil 46030 Manekin Plaza, Suite 160 Sterling, VA 22170