summaryrefslogtreecommitdiffhomepage
path: root/miscutils/mt.c
blob: 7d75fbd3d50d9a298b0937cf07c6149a23735370 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#include "internal.h"
#include <stdio.h>
#include <sys/mtio.h>
#include <sys/fcntl.h>

const char	mt_usage[] = "mt [-f device] opcode value\n";

struct mt_opcodes {
	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 }
};

extern int
mt_main(struct FileInfo * i, int argc, char * * argv)
{
	const char *				file = "/dev/tape";
	const struct mt_opcodes *	code = opcodes;
	struct mtop					op;
	int							fd;
	
	if ( strcmp(argv[1], "-f") == 0 ) {
		if ( argc < 4 ) {
			usage(mt_usage);
			return 1;
		}
		file = argv[2];
		argv += 2;
		argc -= 2;
	}

	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;
	}

	op.mt_op = code->value;
	if ( argc >= 3 )
		op.mt_count = atoi(argv[2]); 
	else
		op.mt_count = 1; /* One, not zero, right? */

	if ( (fd = open(file, O_RDONLY, 0)) < 0 ) {
		name_and_error(file);
		return 1;
	}

	if ( ioctl(fd, MTIOCTOP, &op) != 0 ) {
		name_and_error(file);
		return 1;
	}

	return 0;
}