source: branches/stable/mindi-busybox/miscutils/mt.c @ 1247

Last change on this file since 1247 was 821, checked in by Bruno Cornec, 14 years ago

Addition of busybox 1.2.1 as a mindi-busybox new package
This should avoid delivering binary files in mindi not built there (Fedora and Debian are quite serious about that)

File size: 2.1 KB
RevLine 
[821]1/* vi: set sw=4 ts=4: */
2#include "busybox.h"
3#include <stdio.h>
4#include <stdlib.h>
5#include <string.h>
6#include <sys/mtio.h>
7#include <fcntl.h>
8
9struct mt_opcodes {
10    char *name;
11    short value;
12};
13
14/* missing: eod/seod, stoptions, stwrthreshold, densities */
15static const struct mt_opcodes opcodes[] = {
16    {"bsf", MTBSF},
17    {"bsfm", MTBSFM},
18    {"bsr", MTBSR},
19    {"bss", MTBSS},
20    {"datacompression", MTCOMPRESSION},
21    {"eom", MTEOM},
22    {"erase", MTERASE},
23    {"fsf", MTFSF},
24    {"fsfm", MTFSFM},
25    {"fsr", MTFSR},
26    {"fss", MTFSS},
27    {"load", MTLOAD},
28    {"lock", MTLOCK},
29    {"mkpart", MTMKPART},
30    {"nop", MTNOP},
31    {"offline", MTOFFL},
32    {"rewoffline", MTOFFL},
33    {"ras1", MTRAS1},
34    {"ras2", MTRAS2},
35    {"ras3", MTRAS3},
36    {"reset", MTRESET},
37    {"retension", MTRETEN},
38    {"rewind", MTREW},
39    {"seek", MTSEEK},
40    {"setblk", MTSETBLK},
41    {"setdensity", MTSETDENSITY},
42    {"drvbuffer", MTSETDRVBUFFER},
43    {"setpart", MTSETPART},
44    {"tell", MTTELL},
45    {"wset", MTWSM},
46    {"unload", MTUNLOAD},
47    {"unlock", MTUNLOCK},
48    {"eof", MTWEOF},
49    {"weof", MTWEOF},
50    {0, 0}
51};
52
53int mt_main(int argc, char **argv)
54{
55    const char *file = "/dev/tape";
56    const struct mt_opcodes *code = opcodes;
57    struct mtop op;
58    struct mtpos position;
59    int fd, mode;
60
61    if (argc < 2) {
62        bb_show_usage();
63    }
64
65    if (strcmp(argv[1], "-f") == 0) {
66        if (argc < 4) {
67            bb_show_usage();
68        }
69        file = argv[2];
70        argv += 2;
71        argc -= 2;
72    }
73
74    while (code->name != 0) {
75        if (strcmp(code->name, argv[1]) == 0)
76            break;
77        code++;
78    }
79
80    if (code->name == 0) {
81        bb_error_msg("unrecognized opcode %s.", argv[1]);
82        return EXIT_FAILURE;
83    }
84
85    op.mt_op = code->value;
86    if (argc >= 3)
87        op.mt_count = atoi(argv[2]);
88    else
89        op.mt_count = 1;        /* One, not zero, right? */
90
91    switch (code->value) {
92        case MTWEOF:
93        case MTERASE:
94        case MTWSM:
95        case MTSETDRVBUFFER:
96            mode = O_WRONLY;
97            break;
98
99        default:
100            mode = O_RDONLY;
101            break;
102    }
103
104    fd = bb_xopen3(file, mode, 0);
105
106    switch (code->value) {
107        case MTTELL:
108            if (ioctl(fd, MTIOCPOS, &position) < 0)
109                bb_perror_msg_and_die("%s", file);
110            printf ("At block %d.\n", (int) position.mt_blkno);
111            break;
112
113        default:
114            if (ioctl(fd, MTIOCTOP, &op) != 0)
115                bb_perror_msg_and_die("%s", file);
116            break;
117    }
118
119    return EXIT_SUCCESS;
120}
Note: See TracBrowser for help on using the repository browser.