+ if ((mtfd = open(tape, comp->c_ronly ? 0 : 2)) < 0) {
+ perror(tape);
+ exit(1);
+ }
+ if (comp->c_code != MTNOP) {
+ mt_com.mt_op = comp->c_code;
+ mt_com.mt_count = (argc > 2 ? atoi(argv[2]) : 1);
+ if (mt_com.mt_count < 0) {
+ fprintf(stderr, "mt: negative repeat count\n");
+ exit(1);
+ }
+ if (ioctl(mtfd, MTIOCTOP, &mt_com) < 0) {
+ fprintf(stderr, "%s %s %d ", tape, comp->c_name,
+ mt_com.mt_count);
+ perror("failed");
+ exit(2);
+ }
+ } else {
+ if (ioctl(mtfd, MTIOCGET, (char *)&mt_status) < 0) {
+ perror("mt");
+ exit(2);
+ }
+ status(&mt_status);
+ }
+}
+
+#ifdef vax
+#include <vaxmba/mtreg.h>
+#include <vaxmba/htreg.h>
+
+#include <vaxuba/utreg.h>
+#include <vaxuba/tmreg.h>
+#undef b_repcnt /* argh */
+#include <vaxuba/tsreg.h>
+#endif
+
+#ifdef sun
+#include <sundev/tmreg.h>
+#include <sundev/arreg.h>
+#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
+ { 0 }
+};
+
+/*
+ * Interpret the status buffer returned
+ */
+status(bp)
+ register struct mtget *bp;
+{
+ register struct tape_desc *mt;
+
+ for (mt = tapes; mt->t_type; mt++)
+ if (mt->t_type == bp->mt_type)
+ break;
+ if (mt->t_type == 0) {
+ printf("unknown tape drive type (%d)\n", bp->mt_type);
+ return;
+ }
+ 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);
+ putchar('\n');
+}
+
+/*
+ * Print a register a la the %b format of the kernel's printf
+ */
+printreg(s, v, bits)
+ char *s;
+ register char *bits;
+ register unsigned short v;
+{
+ 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('>');