From 4aca87515a5083ae0e31ce3177189fd43b6d05ac Mon Sep 17 00:00:00 2001 From: Andreas Baumann Date: Sat, 3 Jan 2015 13:58:15 +0100 Subject: patch to Vanilla Tomato 1.28 --- release/src/router/busybox/miscutils/mt.c | 169 +++++++++++++++++------------- 1 file changed, 94 insertions(+), 75 deletions(-) (limited to 'release/src/router/busybox/miscutils/mt.c') diff --git a/release/src/router/busybox/miscutils/mt.c b/release/src/router/busybox/miscutils/mt.c index e7995455..586373d1 100644 --- a/release/src/router/busybox/miscutils/mt.c +++ b/release/src/router/busybox/miscutils/mt.c @@ -1,94 +1,116 @@ /* vi: set sw=4 ts=4: */ -#include -#include -#include -#include -#include -#include "busybox.h" +/* + * Licensed under GPLv2 or later, see file LICENSE in this tarball for details. + */ -struct mt_opcodes { - char *name; - short value; -}; +#include "libbb.h" +#include /* 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}, - {"rewind", 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} +static const short opcode_value[] = { + MTBSF, + MTBSFM, + MTBSR, + MTBSS, + MTCOMPRESSION, + MTEOM, + MTERASE, + MTFSF, + MTFSFM, + MTFSR, + MTFSS, + MTLOAD, + MTLOCK, + MTMKPART, + MTNOP, + MTOFFL, + MTOFFL, + MTRAS1, + MTRAS2, + MTRAS3, + MTRESET, + MTRETEN, + MTREW, + MTSEEK, + MTSETBLK, + MTSETDENSITY, + MTSETDRVBUFFER, + MTSETPART, + MTTELL, + MTWSM, + MTUNLOAD, + MTUNLOCK, + MTWEOF, + MTWEOF }; -extern int mt_main(int argc, char **argv) +static const char opcode_name[] ALIGN1 = + "bsf" "\0" + "bsfm" "\0" + "bsr" "\0" + "bss" "\0" + "datacompression" "\0" + "eom" "\0" + "erase" "\0" + "fsf" "\0" + "fsfm" "\0" + "fsr" "\0" + "fss" "\0" + "load" "\0" + "lock" "\0" + "mkpart" "\0" + "nop" "\0" + "offline" "\0" + "rewoffline" "\0" + "ras1" "\0" + "ras2" "\0" + "ras3" "\0" + "reset" "\0" + "retension" "\0" + "rewind" "\0" + "seek" "\0" + "setblk" "\0" + "setdensity" "\0" + "drvbuffer" "\0" + "setpart" "\0" + "tell" "\0" + "wset" "\0" + "unload" "\0" + "unlock" "\0" + "eof" "\0" + "weof" "\0"; + +int mt_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE; +int mt_main(int argc UNUSED_PARAM, char **argv) { const char *file = "/dev/tape"; - const struct mt_opcodes *code = opcodes; struct mtop op; struct mtpos position; - int fd, mode; - - if (argc < 2) { + int fd, mode, idx; + + if (!argv[1]) { bb_show_usage(); } if (strcmp(argv[1], "-f") == 0) { - if (argc < 4) { + if (!argv[2] || !argv[3]) bb_show_usage(); - } file = argv[2]; argv += 2; - argc -= 2; } - while (code->name != 0) { - if (strcmp(code->name, argv[1]) == 0) - break; - code++; - } + idx = index_in_strings(opcode_name, argv[1]); - if (code->name == 0) { - bb_error_msg("unrecognized opcode %s.", argv[1]); - return EXIT_FAILURE; - } + if (idx < 0) + bb_error_msg_and_die("unrecognized opcode %s", argv[1]); - op.mt_op = code->value; - if (argc >= 3) - op.mt_count = atoi(argv[2]); + op.mt_op = opcode_value[idx]; + if (argv[2]) + op.mt_count = xatoi_u(argv[2]); else op.mt_count = 1; /* One, not zero, right? */ - switch (code->value) { + switch (opcode_value[idx]) { case MTWEOF: case MTERASE: case MTWSM: @@ -101,19 +123,16 @@ extern int mt_main(int argc, char **argv) break; } - if ((fd = open(file, mode, 0)) < 0) - bb_perror_msg_and_die("%s", file); + fd = xopen(file, mode); - switch (code->value) { + switch (opcode_value[idx]) { case MTTELL: - if (ioctl(fd, MTIOCPOS, &position) < 0) - bb_perror_msg_and_die("%s", file); - printf ("At block %d.\n", (int) position.mt_blkno); + ioctl_or_perror_and_die(fd, MTIOCPOS, &position, "%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); + ioctl_or_perror_and_die(fd, MTIOCTOP, &op, "%s", file); break; } -- cgit v1.2.3-54-g00ecf