X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=miscutils%2Fmt.c;h=2720f7eab8057cd8434e076c87a006c78118f0f8;hb=eea561871b45a2335ab6a09f14dad627ffcdc1cd;hp=cf20d1711bbf11d695cc31bfeadaf4cc66b81d1e;hpb=5e1189e187f6a7957dadb8eda2c271c4a0777a23;p=oweals%2Fbusybox.git diff --git a/miscutils/mt.c b/miscutils/mt.c index cf20d1711..2720f7eab 100644 --- a/miscutils/mt.c +++ b/miscutils/mt.c @@ -1,11 +1,14 @@ /* vi: set sw=4 ts=4: */ -#include "internal.h" +/* + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ + +#include "busybox.h" #include +#include +#include #include -#include - -static const char mt_usage[] = "mt [-f device] opcode value\n\n" - "Control magnetic tape drive operation\n"; +#include struct mt_opcodes { char *name; @@ -36,7 +39,7 @@ static const struct mt_opcodes opcodes[] = { {"ras3", MTRAS3}, {"reset", MTRESET}, {"retension", MTRETEN}, - {"rew", MTREW}, + {"rewind", MTREW}, {"seek", MTSEEK}, {"setblk", MTSETBLK}, {"setdensity", MTSETDENSITY}, @@ -51,20 +54,21 @@ static const struct mt_opcodes opcodes[] = { {0, 0} }; -extern int mt_main(int argc, char **argv) +int mt_main(int argc, char **argv) { const char *file = "/dev/tape"; const struct mt_opcodes *code = opcodes; struct mtop op; - int fd; - - if ((argc != 2 && argc != 3) || **(argv + 1) == '-') { - usage(mt_usage); + struct mtpos position; + int fd, mode; + + if (argc < 2) { + bb_show_usage(); } if (strcmp(argv[1], "-f") == 0) { if (argc < 4) { - usage(mt_usage); + bb_show_usage(); } file = argv[2]; argv += 2; @@ -78,8 +82,8 @@ extern int mt_main(int argc, char **argv) } if (code->name == 0) { - fprintf(stderr, "mt: unrecognized opcode %s.\n", argv[1]); - exit (FALSE); + bb_error_msg("unrecognized opcode %s.", argv[1]); + return EXIT_FAILURE; } op.mt_op = code->value; @@ -88,15 +92,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); - 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); + fd = bb_xopen3(file, mode, 0); + + switch (code->value) { + case MTTELL: + if (ioctl(fd, MTIOCPOS, &position) < 0) + bb_perror_msg_and_die("%s", file); + printf ("At block %d.\n", (int) position.mt_blkno); + break; + + default: + if (ioctl(fd, MTIOCTOP, &op) != 0) + bb_perror_msg_and_die("%s", file); + break; } - exit (TRUE); + return EXIT_SUCCESS; }