X-Git-Url: https://git.librecmc.org/?a=blobdiff_plain;f=miscutils%2Fmt.c;h=e7995455291d733c077409642fee73300e78fa13;hb=0d6d88a2058d191c34d25a8709aca40311bb0c2e;hp=7d75fbd3d50d9a298b0937cf07c6149a23735370;hpb=cc8ed39b240180b58810784f844e253263594ac3;p=oweals%2Fbusybox.git diff --git a/miscutils/mt.c b/miscutils/mt.c index 7d75fbd3d..e79954552 100644 --- a/miscutils/mt.c +++ b/miscutils/mt.c @@ -1,98 +1,121 @@ -#include "internal.h" +/* vi: set sw=4 ts=4: */ #include +#include +#include #include #include - -const char mt_usage[] = "mt [-f device] opcode value\n"; +#include "busybox.h" struct mt_opcodes { - char * name; - short value; + 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 } +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} }; -extern int -mt_main(struct FileInfo * i, int argc, char * * argv) +extern int mt_main(int argc, char **argv) { - const char * file = "/dev/tape"; - const struct mt_opcodes * code = opcodes; - struct mtop op; - int fd; + const char *file = "/dev/tape"; + const struct mt_opcodes *code = opcodes; + struct mtop op; + struct mtpos position; + int fd, mode; - if ( strcmp(argv[1], "-f") == 0 ) { - if ( argc < 4 ) { - usage(mt_usage); - return 1; + if (argc < 2) { + bb_show_usage(); + } + + if (strcmp(argv[1], "-f") == 0) { + if (argc < 4) { + bb_show_usage(); } file = argv[2]; argv += 2; argc -= 2; } - while ( code->name != 0 ) { - if ( strcmp(code->name, argv[1]) == 0 ) + 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; + if (code->name == 0) { + bb_error_msg("unrecognized opcode %s.", argv[1]); + return EXIT_FAILURE; } op.mt_op = code->value; - if ( argc >= 3 ) - op.mt_count = atoi(argv[2]); + if (argc >= 3) + op.mt_count = atoi(argv[2]); else - op.mt_count = 1; /* One, not zero, right? */ + op.mt_count = 1; /* One, not zero, right? */ + + switch (code->value) { + case MTWEOF: + case MTERASE: + case MTWSM: + case MTSETDRVBUFFER: + mode = O_WRONLY; + break; - if ( (fd = open(file, O_RDONLY, 0)) < 0 ) { - name_and_error(file); - return 1; + default: + mode = O_RDONLY; + break; } - if ( ioctl(fd, MTIOCTOP, &op) != 0 ) { - name_and_error(file); - return 1; + if ((fd = open(file, mode, 0)) < 0) + bb_perror_msg_and_die("%s", file); + + 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; } - return 0; + return EXIT_SUCCESS; }