Rewritten by Manuel Novoa III.
[oweals/busybox.git] / mt.c
diff --git a/mt.c b/mt.c
index 6acae4ea1f846bcffd11f92cec56fc2c2a54e149..49dc70ac61e9610a9d6f6ff65c9e3a1c5218cabf 100644 (file)
--- a/mt.c
+++ b/mt.c
@@ -1,8 +1,10 @@
 /* vi: set sw=4 ts=4: */
-#include "busybox.h"
 #include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
 #include <sys/mtio.h>
 #include <sys/fcntl.h>
+#include "busybox.h"
 
 struct mt_opcodes {
        char *name;
@@ -33,7 +35,7 @@ static const struct mt_opcodes opcodes[] = {
        {"ras3", MTRAS3},
        {"reset", MTRESET},
        {"retension", MTRETEN},
-       {"rew", MTREW},
+       {"rewind", MTREW},
        {"seek", MTSEEK},
        {"setblk", MTSETBLK},
        {"setdensity", MTSETDENSITY},
@@ -53,15 +55,16 @@ extern int mt_main(int argc, char **argv)
        const char *file = "/dev/tape";
        const struct mt_opcodes *code = opcodes;
        struct mtop op;
-       int fd;
+       struct mtpos position;
+       int fd, mode;
        
        if (argc < 2) {
-               usage(mt_usage);
+               show_usage();
        }
 
        if (strcmp(argv[1], "-f") == 0) {
                if (argc < 4) {
-                       usage(mt_usage);
+                       show_usage();
                }
                file = argv[2];
                argv += 2;
@@ -75,8 +78,8 @@ extern int mt_main(int argc, char **argv)
        }
 
        if (code->name == 0) {
-               errorMsg("unrecognized opcode %s.\n", argv[1]);
-               exit (FALSE);
+               error_msg("unrecognized opcode %s.", argv[1]);
+               return EXIT_FAILURE;
        }
 
        op.mt_op = code->value;
@@ -85,15 +88,34 @@ extern int mt_main(int argc, char **argv)
        else
                op.mt_count = 1;                /* One, not zero, right? */
 
-       if ((fd = open(file, O_RDONLY, 0)) < 0) {
-               perror(file);
-               exit (FALSE);
+       switch (code->value) {
+               case MTWEOF:
+               case MTERASE:
+               case MTWSM:
+               case MTSETDRVBUFFER:
+                       mode = O_WRONLY;
+                       break;
+
+               default:
+                       mode = O_RDONLY;
+                       break;
        }
 
-       if (ioctl(fd, MTIOCTOP, &op) != 0) {
-               perror(file);
-               exit (FALSE);
+       if ((fd = open(file, mode, 0)) < 0)
+               perror_msg_and_die("%s", file);
+
+       switch (code->value) {
+               case MTTELL:
+                       if (ioctl(fd, MTIOCPOS, &position) < 0)
+                               perror_msg_and_die("%s", file);
+                       printf ("At block %d.\n", (int) position.mt_blkno);
+                       break;
+
+               default:
+                       if (ioctl(fd, MTIOCTOP, &op) != 0)
+                               perror_msg_and_die("%s", file);
+                       break;
        }
 
-       return (TRUE);
+       return EXIT_SUCCESS;
 }