X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=mt.c;h=49dc70ac61e9610a9d6f6ff65c9e3a1c5218cabf;hb=1eb4acfc2399d3ab4a7a122a0aff3f5d5109bf2c;hp=2d35c7c22c4f80050edf0feae7d0254dd7a17370;hpb=f57c944e09417edcbcd69f2b01b937cadef39db2;p=oweals%2Fbusybox.git diff --git a/mt.c b/mt.c index 2d35c7c22..49dc70ac6 100644 --- a/mt.c +++ b/mt.c @@ -1,8 +1,10 @@ /* vi: set sw=4 ts=4: */ -#include "busybox.h" #include +#include +#include #include #include +#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,7 +78,7 @@ extern int mt_main(int argc, char **argv) } if (code->name == 0) { - error_msg("unrecognized opcode %s.\n", argv[1]); + error_msg("unrecognized opcode %s.", argv[1]); return EXIT_FAILURE; } @@ -85,14 +88,33 @@ 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); - return EXIT_FAILURE; + 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); - return EXIT_FAILURE; + 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 EXIT_SUCCESS;