From f9ab90d9d6d02989a075d0f0074496d5b1045e4b Mon Sep 17 00:00:00 2001 From: rgrimes Date: Fri, 27 May 1994 12:33:43 +0000 Subject: BSD 4.4 Lite Usr.bin Sources --- usr.bin/mt/Makefile | 6 ++ usr.bin/mt/mt.1 | 130 +++++++++++++++++++++++++ usr.bin/mt/mt.c | 274 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 410 insertions(+) create mode 100644 usr.bin/mt/Makefile create mode 100644 usr.bin/mt/mt.1 create mode 100644 usr.bin/mt/mt.c (limited to 'usr.bin/mt') diff --git a/usr.bin/mt/Makefile b/usr.bin/mt/Makefile new file mode 100644 index 0000000..253fa99 --- /dev/null +++ b/usr.bin/mt/Makefile @@ -0,0 +1,6 @@ +# @(#)Makefile 8.1 (Berkeley) 6/6/93 + +PROG= mt +CFLAGS+=-I/sys + +.include diff --git a/usr.bin/mt/mt.1 b/usr.bin/mt/mt.1 new file mode 100644 index 0000000..9edaab6 --- /dev/null +++ b/usr.bin/mt/mt.1 @@ -0,0 +1,130 @@ +.\" Copyright (c) 1981, 1990, 1993 +.\" The Regents of the University of California. All rights reserved. +.\" +.\" +.\" Redistribution and use in source and binary forms, with or without +.\" modification, are permitted provided that the following conditions +.\" are met: +.\" 1. Redistributions of source code must retain the above copyright +.\" notice, this list of conditions and the following disclaimer. +.\" 2. Redistributions in binary form must reproduce the above copyright +.\" notice, this list of conditions and the following disclaimer in the +.\" documentation and/or other materials provided with the distribution. +.\" 3. All advertising materials mentioning features or use of this software +.\" must display the following acknowledgement: +.\" This product includes software developed by the University of +.\" California, Berkeley and its contributors. +.\" 4. Neither the name of the University nor the names of its contributors +.\" may be used to endorse or promote products derived from this software +.\" without specific prior written permission. +.\" +.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND +.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE +.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) +.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF +.\" SUCH DAMAGE. +.\" +.\" @(#)mt.1 8.1 (Berkeley) 6/6/93 +.\" +.Dd June 6, 1993 +.Dt MT 1 +.Os BSD 4 +.Sh NAME +.Nm mt +.Nd magnetic tape manipulating program +.Sh SYNOPSIS +.Nm mt +.Op Fl f Ar tapename +.Ar command +.Op Ar count +.Sh DESCRIPTION +.Nm Mt +is used to give commands to a magnetic tape drive. +By default +.Nm mt +performs the requested operation once. Operations +may be performed multiple times by specifying +.Ar count . +Note +that +.Ar tapename +must reference a raw (not block) tape device. +.Pp +The available commands are listed below. Only as many +characters as are required to uniquely identify a command +need be specified. +.Bl -tag -width "eof, weof" +.It Cm eof , weof +Write +.Ar count +end-of-file marks at the current position on the tape. +.It Cm fsf +Forward space +.Ar count +files. +.It Cm fsr +Forward space +.Ar count +records. +.It Cm bsf +Back space +.Ar count +files. +.It Cm bsr +Back space +.Ar count +records. +.It Cm rewind +Rewind the tape +(Count is ignored). +.It Cm offline , rewoffl +Rewind the tape and place the tape unit off-line +(Count is ignored). +.It Cm status +Print status information about the tape unit. +.El +.Pp +If a tape name is not specified, and the environment variable +.Ev TAPE +does not exist; +.Nm mt +uses the device +.Pa /dev/rmt12 . +.Pp +.Nm Mt +returns a 0 exit status when the operation(s) were successful, +1 if the command was unrecognized, and 2 if an operation failed. +.Sh ENVIRONMENT +If the following environment variable exists, it is utilized by +.Nm mt . +.Bl -tag -width Fl +.It Ev TAPE +.Nm Mt +checks the +.Ev TAPE +environment variable if the +argument +.Ar tapename +is not given. +.Sh FILES +.Bl -tag -width /dev/rmt* -compact +.It Pa /dev/rmt* +Raw magnetic tape interface +.El +.Sh SEE ALSO +.\".Xr mtio 4 , +.Xr dd 1 , +.Xr ioctl 2 , +.Xr environ 7 +.Sh HISTORY +The +.Nm mt +command appeared in +.Bx 4.3 . +.\" mt.1: mtio(4) missing diff --git a/usr.bin/mt/mt.c b/usr.bin/mt/mt.c new file mode 100644 index 0000000..396fa81 --- /dev/null +++ b/usr.bin/mt/mt.c @@ -0,0 +1,274 @@ +/* + * Copyright (c) 1980, 1993 + * The Regents of the University of California. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. All advertising materials mentioning features or use of this software + * must display the following acknowledgement: + * This product includes software developed by the University of + * California, Berkeley and its contributors. + * 4. Neither the name of the University nor the names of its contributors + * may be used to endorse or promote products derived from this software + * without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE + * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS + * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT + * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY + * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#ifndef lint +static char copyright[] = +"@(#) Copyright (c) 1980, 1993\n\ + The Regents of the University of California. All rights reserved.\n"; +#endif /* not lint */ + +#ifndef lint +static char sccsid[] = "@(#)mt.c 8.1 (Berkeley) 6/6/93"; +#endif /* not lint */ + +/* + * mt -- + * magnetic tape manipulation program + */ +#include +#include +#include +#include +#include +#include +#include +#include +#include + +struct commands { + char *c_name; + int c_code; + int c_ronly; +} com[] = { + { "bsf", MTBSF, 1 }, + { "bsr", MTBSR, 1 }, + { "eof", MTWEOF, 0 }, + { "fsf", MTFSF, 1 }, + { "fsr", MTFSR, 1 }, + { "offline", MTOFFL, 1 }, + { "rewind", MTREW, 1 }, + { "rewoffl", MTOFFL, 1 }, + { "status", MTNOP, 1 }, + { "weof", MTWEOF, 0 }, + { NULL } +}; + +void err __P((const char *, ...)); +void printreg __P((char *, u_int, char *)); +void status __P((struct mtget *)); +void usage __P((void)); + +int +main(argc, argv) + int argc; + char *argv[]; +{ + register struct commands *comp; + struct mtget mt_status; + struct mtop mt_com; + int ch, len, mtfd; + char *p, *tape; + + if ((tape = getenv("TAPE")) == NULL) + tape = DEFTAPE; + + while ((ch = getopt(argc, argv, "f:t:")) != EOF) + switch(ch) { + case 'f': + case 't': + tape = optarg; + break; + case '?': + default: + usage(); + } + argc -= optind; + argv += optind; + + if (argc < 1 || argc > 2) + usage(); + + len = strlen(p = *argv++); + for (comp = com;; comp++) { + if (comp->c_name == NULL) + err("%s: unknown command", p); + if (strncmp(p, comp->c_name, len) == 0) + break; + } + if ((mtfd = open(tape, comp->c_ronly ? O_RDONLY : O_RDWR)) < 0) + err("%s: %s", tape, strerror(errno)); + if (comp->c_code != MTNOP) { + mt_com.mt_op = comp->c_code; + if (*argv) { + mt_com.mt_count = strtol(*argv, &p, 10); + if (mt_com.mt_count <= 0 || *p) + err("%s: illegal count", *argv); + } + else + mt_com.mt_count = 1; + if (ioctl(mtfd, MTIOCTOP, &mt_com) < 0) + err("%s: %s: %s", tape, comp->c_name, strerror(errno)); + } else { + if (ioctl(mtfd, MTIOCGET, &mt_status) < 0) + err("%s", strerror(errno)); + status(&mt_status); + } + exit (0); + /* NOTREACHED */ +} + +#ifdef vax +#include +#include + +#include +#include +#undef b_repcnt /* argh */ +#include +#endif + +#ifdef sun +#include +#include +#endif + +#ifdef tahoe +#include +#endif + +struct tape_desc { + short t_type; /* type of magtape device */ + char *t_name; /* printing name */ + char *t_dsbits; /* "drive status" register */ + char *t_erbits; /* "error" register */ +} tapes[] = { +#ifdef vax + { MT_ISTS, "ts11", 0, TSXS0_BITS }, + { MT_ISHT, "tm03", HTDS_BITS, HTER_BITS }, + { MT_ISTM, "tm11", 0, TMER_BITS }, + { MT_ISMT, "tu78", MTDS_BITS, 0 }, + { MT_ISUT, "tu45", UTDS_BITS, UTER_BITS }, +#endif +#ifdef sun + { MT_ISCPC, "TapeMaster", TMS_BITS, 0 }, + { MT_ISAR, "Archive", ARCH_CTRL_BITS, ARCH_BITS }, +#endif +#ifdef tahoe + { MT_ISCY, "cipher", CYS_BITS, CYCW_BITS }, +#endif + { 0 } +}; + +/* + * Interpret the status buffer returned + */ +void +status(bp) + register struct mtget *bp; +{ + register struct tape_desc *mt; + + for (mt = tapes;; mt++) { + if (mt->t_type == 0) { + (void)printf("%d: unknown tape drive type\n", + bp->mt_type); + return; + } + if (mt->t_type == bp->mt_type) + break; + } + (void)printf("%s tape drive, residual=%d\n", mt->t_name, bp->mt_resid); + printreg("ds", bp->mt_dsreg, mt->t_dsbits); + printreg("\ner", bp->mt_erreg, mt->t_erbits); + (void)putchar('\n'); +} + +/* + * Print a register a la the %b format of the kernel's printf. + */ +void +printreg(s, v, bits) + char *s; + register u_int v; + register char *bits; +{ + register int i, any = 0; + register char c; + + if (bits && *bits == 8) + printf("%s=%o", s, v); + else + printf("%s=%x", s, v); + bits++; + if (v && bits) { + putchar('<'); + while (i = *bits++) { + if (v & (1 << (i-1))) { + if (any) + putchar(','); + any = 1; + for (; (c = *bits) > 32; bits++) + putchar(c); + } else + for (; *bits > 32; bits++) + ; + } + putchar('>'); + } +} + +void +usage() +{ + (void)fprintf(stderr, "usage: mt [-f device] command [ count ]\n"); + exit(1); +} + +#if __STDC__ +#include +#else +#include +#endif + +void +#if __STDC__ +err(const char *fmt, ...) +#else +err(fmt, va_alist) + char *fmt; + va_dcl +#endif +{ + va_list ap; +#if __STDC__ + va_start(ap, fmt); +#else + va_start(ap); +#endif + (void)fprintf(stderr, "mt: "); + (void)vfprintf(stderr, fmt, ap); + va_end(ap); + (void)fprintf(stderr, "\n"); + exit(1); + /* NOTREACHED */ +} -- cgit v1.1