Initial revision
diff --git a/mt.c b/mt.c
new file mode 100644
index 0000000..7d75fbd
--- /dev/null
+++ b/mt.c
@@ -0,0 +1,98 @@
+#include "internal.h"
+#include <stdio.h>
+#include <sys/mtio.h>
+#include <sys/fcntl.h>
+
+const char mt_usage[] = "mt [-f device] opcode value\n";
+
+struct mt_opcodes {
+ char * name;
+ short value;
+};
+
+/* missing: eod/seod, stoptions, stwrthreshold, densities */
+static const struct mt_opcodes opcodes[] = {
+ { "bsf", MTBSF },
+ { "bsfm", MTBSFM },
+ { "bsr", MTBSR },
+ { "bss", MTBSS },
+ { "datacompression", MTCOMPRESSION },
+ { "eom", MTEOM },
+ { "erase", MTERASE },
+ { "fsf", MTFSF },
+ { "fsfm", MTFSFM },
+ { "fsr", MTFSR },
+ { "fss", MTFSS },
+ { "load", MTLOAD },
+ { "lock", MTLOCK },
+ { "mkpart", MTMKPART },
+ { "nop", MTNOP },
+ { "offline",MTOFFL },
+ { "rewoffline",MTOFFL },
+ { "ras1", MTRAS1 },
+ { "ras2", MTRAS2 },
+ { "ras3", MTRAS3 },
+ { "reset", MTRESET },
+ { "retension", MTRETEN },
+ { "rew", MTREW },
+ { "seek", MTSEEK },
+ { "setblk", MTSETBLK },
+ { "setdensity", MTSETDENSITY },
+ { "drvbuffer", MTSETDRVBUFFER },
+ { "setpart", MTSETPART },
+ { "tell", MTTELL },
+ { "wset", MTWSM },
+ { "unload", MTUNLOAD },
+ { "unlock", MTUNLOCK },
+ { "eof", MTWEOF },
+ { "weof", MTWEOF },
+ { 0, 0 }
+};
+
+extern int
+mt_main(struct FileInfo * i, int argc, char * * argv)
+{
+ const char * file = "/dev/tape";
+ const struct mt_opcodes * code = opcodes;
+ struct mtop op;
+ int fd;
+
+ if ( strcmp(argv[1], "-f") == 0 ) {
+ if ( argc < 4 ) {
+ usage(mt_usage);
+ return 1;
+ }
+ file = argv[2];
+ argv += 2;
+ argc -= 2;
+ }
+
+ while ( code->name != 0 ) {
+ if ( strcmp(code->name, argv[1]) == 0 )
+ break;
+ code++;
+ }
+
+ if ( code->name == 0 ) {
+ fprintf(stderr, "mt: unrecognized opcode %s.\n", argv[1]);
+ return 1;
+ }
+
+ op.mt_op = code->value;
+ if ( argc >= 3 )
+ op.mt_count = atoi(argv[2]);
+ else
+ op.mt_count = 1; /* One, not zero, right? */
+
+ if ( (fd = open(file, O_RDONLY, 0)) < 0 ) {
+ name_and_error(file);
+ return 1;
+ }
+
+ if ( ioctl(fd, MTIOCTOP, &op) != 0 ) {
+ name_and_error(file);
+ return 1;
+ }
+
+ return 0;
+}