mirror of
https://github.com/iustin/mt-st.git
synced 2025-12-23 05:45:13 +00:00
LARGE CHURN: reindent source code
The source code seems to have, over time, become less self-consistent in style. In order to not have to keep this up manually, switch over indenting to clang-format. A .clang-format file is provided to give repeatable results. The main difference is switching from tabs to non-tabs usage. Otherwise the changes are mostly minor and leading to more consistency. Contributions to the format style welcome! Nota bene: this should have had no code impact. Any actual code changes (beyond indenting) are bugs in the re-indent process.
This commit is contained in:
47
.clang-format
Normal file
47
.clang-format
Normal file
@@ -0,0 +1,47 @@
|
||||
AccessModifierOffset: 0
|
||||
AlignEscapedNewlinesLeft: true
|
||||
AlignTrailingComments: true
|
||||
AllowAllParametersOfDeclarationOnNextLine: false
|
||||
AllowShortFunctionsOnASingleLine: false
|
||||
AllowShortIfStatementsOnASingleLine: false
|
||||
AllowShortLoopsOnASingleLine: false
|
||||
AlwaysBreakBeforeMultilineStrings: false
|
||||
AlwaysBreakTemplateDeclarations: false
|
||||
BinPackParameters: false
|
||||
BreakBeforeBinaryOperators: false
|
||||
BreakBeforeBraces: Linux
|
||||
BreakBeforeTernaryOperators: false
|
||||
BreakConstructorInitializersBeforeComma: false
|
||||
ColumnLimit: 80
|
||||
CommentPragmas: ''
|
||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
||||
ConstructorInitializerIndentWidth: 0
|
||||
ContinuationIndentWidth: 0
|
||||
Cpp11BracedListStyle: false
|
||||
DerivePointerBinding: false
|
||||
IndentCaseLabels: false
|
||||
IndentFunctionDeclarationAfterType: false
|
||||
IndentWidth: 4
|
||||
Language: Cpp
|
||||
MaxEmptyLinesToKeep: 2
|
||||
NamespaceIndentation: None
|
||||
ObjCSpaceAfterProperty: true
|
||||
ObjCSpaceBeforeProtocolList: true
|
||||
PenaltyBreakBeforeFirstCallParameter: 100
|
||||
PenaltyBreakComment: 100
|
||||
PenaltyBreakFirstLessLess: 0
|
||||
PenaltyBreakString: 100
|
||||
PenaltyExcessCharacter: 1
|
||||
PenaltyReturnTypeOnItsOwnLine: 20
|
||||
PointerBindsToType: false
|
||||
SpaceBeforeAssignmentOperators: true
|
||||
SpaceBeforeParens: ControlStatements
|
||||
SpaceInEmptyParentheses: false
|
||||
SpacesBeforeTrailingComments: 2
|
||||
SpacesInAngles: false
|
||||
SpacesInCStyleCastParentheses: false
|
||||
SpacesInContainerLiterals: true
|
||||
SpacesInParentheses: false
|
||||
Standard: Cpp11
|
||||
TabWidth: 4
|
||||
UseTab: Never
|
||||
5
.dir-locals.el
Normal file
5
.dir-locals.el
Normal file
@@ -0,0 +1,5 @@
|
||||
;;; Directory Local Variables
|
||||
;;; For more information see (info "(emacs) Directory Variables")
|
||||
|
||||
((c-mode
|
||||
(c-basic-offset . 4)))
|
||||
9
Makefile
9
Makefile
@@ -21,7 +21,9 @@ DISTFILES = \
|
||||
README.md \
|
||||
stinit.8 \
|
||||
stinit.c \
|
||||
stinit.def.examples
|
||||
stinit.def.examples \
|
||||
.dir-locals.el \
|
||||
.clang-format
|
||||
|
||||
VERSION=1.3
|
||||
RELEASEDIR=mt-st-$(VERSION)
|
||||
@@ -82,4 +84,7 @@ release-tag:
|
||||
clean:
|
||||
rm -f *~ \#*\# *.o $(PROGS) version.h
|
||||
|
||||
.PHONY: dist distcheck clean
|
||||
reindent:
|
||||
clang-format -i mt.c stinit.c
|
||||
|
||||
.PHONY: dist distcheck clean reindent
|
||||
|
||||
627
mt.c
627
mt.c
@@ -1,12 +1,12 @@
|
||||
/* This file contains the source of the 'mt' program intended for
|
||||
Linux systems. The program supports the basic mt commands found
|
||||
in most Unix-like systems. In addition to this the program
|
||||
supports several commands designed for use with the Linux SCSI
|
||||
tape drive.
|
||||
Linux systems. The program supports the basic mt commands found
|
||||
in most Unix-like systems. In addition to this the program
|
||||
supports several commands designed for use with the Linux SCSI
|
||||
tape drive.
|
||||
|
||||
Maintained by Iustin Pop (iustin@k1024.org).
|
||||
Copyright by Kai Mäkisara, 1998 - 2008. The program may be distributed
|
||||
according to the GNU Public License.
|
||||
Maintained by Iustin Pop (iustin@k1024.org).
|
||||
Copyright by Kai Mäkisara, 1998 - 2008. The program may be distributed
|
||||
according to the GNU Public License.
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
@@ -27,12 +27,12 @@
|
||||
#include "version.h"
|
||||
|
||||
#ifndef DEFTAPE
|
||||
#define DEFTAPE "/dev/tape" /* default tape device */
|
||||
#endif /* DEFTAPE */
|
||||
#define DEFTAPE "/dev/tape" /* default tape device */
|
||||
#endif /* DEFTAPE */
|
||||
|
||||
typedef struct cmdef_tr cmdef_tr;
|
||||
|
||||
typedef int (* cmdfunc)(int, struct cmdef_tr *, int, char **);
|
||||
typedef int (*cmdfunc)(int, struct cmdef_tr *, int, char **);
|
||||
|
||||
struct cmdef_tr {
|
||||
char *cmd_name;
|
||||
@@ -44,24 +44,24 @@ struct cmdef_tr {
|
||||
int error_tests;
|
||||
};
|
||||
|
||||
#define NO_FD 0
|
||||
#define FD_RDONLY 1
|
||||
#define FD_RDWR 2
|
||||
#define NO_FD 0
|
||||
#define FD_RDONLY 1
|
||||
#define FD_RDWR 2
|
||||
|
||||
#define NO_ARGS 0
|
||||
#define ONE_ARG 1
|
||||
#define TWO_ARGS 2
|
||||
#define MANY_ARGS 255
|
||||
#define NO_ARGS 0
|
||||
#define ONE_ARG 1
|
||||
#define TWO_ARGS 2
|
||||
#define MANY_ARGS 255
|
||||
|
||||
#define DO_BOOLEANS 1002
|
||||
#define SET_BOOLEANS 1003
|
||||
#define DO_BOOLEANS 1002
|
||||
#define SET_BOOLEANS 1003
|
||||
#define CLEAR_BOOLEANS 1004
|
||||
|
||||
#define ET_ONLINE 1
|
||||
#define ET_WPROT 2
|
||||
#define ET_ONLINE 1
|
||||
#define ET_WPROT 2
|
||||
|
||||
static void usage(int);
|
||||
static void version() __attribute__ ((noreturn));
|
||||
static void version() __attribute__((noreturn));
|
||||
static int do_standard(int, cmdef_tr *, int, char **);
|
||||
static int do_drvbuffer(int, cmdef_tr *, int, char **);
|
||||
static int do_options(int, cmdef_tr *, int, char **);
|
||||
@@ -255,168 +255,158 @@ static struct booleans {
|
||||
/* clang-format on */
|
||||
};
|
||||
|
||||
static char *tape_name; /* The tape name for messages */
|
||||
static char *tape_name; /* The tape name for messages */
|
||||
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
int mtfd, i, argn, oflags;
|
||||
unsigned int len;
|
||||
char *cmdstr;
|
||||
cmdef_tr *comp, *comp2;
|
||||
|
||||
for (argn=1; argn < argc; argn++)
|
||||
if (*argv[argn] == '-')
|
||||
switch (*(argv[argn] + 1)) {
|
||||
case 'f':
|
||||
case 't':
|
||||
argn += 1;
|
||||
if (argn >= argc) {
|
||||
usage(0);
|
||||
exit(1);
|
||||
}
|
||||
tape_name = argv[argn];
|
||||
break;
|
||||
case 'h':
|
||||
usage(1);
|
||||
exit(0);
|
||||
break;
|
||||
case 'v':
|
||||
version();
|
||||
break;
|
||||
case '-':
|
||||
if (*(argv[argn] + 1) == '-' &&
|
||||
*(argv[argn] + 2) == 'v') {
|
||||
version();
|
||||
}
|
||||
/* Fall through */
|
||||
default:
|
||||
usage(0);
|
||||
exit(1);
|
||||
}
|
||||
else
|
||||
break;
|
||||
for (argn = 1; argn < argc; argn++)
|
||||
if (*argv[argn] == '-')
|
||||
switch (*(argv[argn] + 1)) {
|
||||
case 'f':
|
||||
case 't':
|
||||
argn += 1;
|
||||
if (argn >= argc) {
|
||||
usage(0);
|
||||
exit(1);
|
||||
}
|
||||
tape_name = argv[argn];
|
||||
break;
|
||||
case 'h':
|
||||
usage(1);
|
||||
exit(0);
|
||||
break;
|
||||
case 'v':
|
||||
version();
|
||||
break;
|
||||
case '-':
|
||||
if (*(argv[argn] + 1) == '-' && *(argv[argn] + 2) == 'v') {
|
||||
version();
|
||||
}
|
||||
/* Fall through */
|
||||
default:
|
||||
usage(0);
|
||||
exit(1);
|
||||
}
|
||||
else
|
||||
break;
|
||||
|
||||
if (tape_name == NULL && (tape_name = getenv("TAPE")) == NULL) {
|
||||
struct stat stbuf;
|
||||
struct stat stbuf;
|
||||
|
||||
tape_name = DEFTAPE;
|
||||
if (!stat(tape_name, &stbuf) &&
|
||||
!S_ISCHR(stbuf.st_mode)) {
|
||||
fprintf(stderr, "The default '%s' is not a character device.\n\n", tape_name);
|
||||
usage(1);
|
||||
exit(1);
|
||||
}
|
||||
tape_name = DEFTAPE;
|
||||
if (!stat(tape_name, &stbuf) && !S_ISCHR(stbuf.st_mode)) {
|
||||
fprintf(stderr, "The default '%s' is not a character device.\n\n", tape_name);
|
||||
usage(1);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
|
||||
if (argn >= argc ) {
|
||||
usage(0);
|
||||
exit(1);
|
||||
|
||||
if (argn >= argc) {
|
||||
usage(0);
|
||||
exit(1);
|
||||
}
|
||||
cmdstr = argv[argn++];
|
||||
|
||||
len = strlen(cmdstr);
|
||||
for (comp = cmds; comp->cmd_name != NULL; comp++)
|
||||
if (strncmp(cmdstr, comp->cmd_name, len) == 0)
|
||||
break;
|
||||
if (strncmp(cmdstr, comp->cmd_name, len) == 0)
|
||||
break;
|
||||
if (comp->cmd_name == NULL) {
|
||||
fprintf(stderr, "mt: unknown command \"%s\"\n", cmdstr);
|
||||
usage(1);
|
||||
exit(1);
|
||||
fprintf(stderr, "mt: unknown command \"%s\"\n", cmdstr);
|
||||
usage(1);
|
||||
exit(1);
|
||||
}
|
||||
if (len != strlen(comp->cmd_name)) {
|
||||
for (comp2 = comp + 1; comp2->cmd_name != NULL; comp2++)
|
||||
if (strncmp(cmdstr, comp2->cmd_name, len) == 0)
|
||||
break;
|
||||
if (comp2->cmd_name != NULL) {
|
||||
fprintf(stderr, "mt: ambiguous command \"%s\"\n", cmdstr);
|
||||
usage(1);
|
||||
exit(1);
|
||||
}
|
||||
for (comp2 = comp + 1; comp2->cmd_name != NULL; comp2++)
|
||||
if (strncmp(cmdstr, comp2->cmd_name, len) == 0)
|
||||
break;
|
||||
if (comp2->cmd_name != NULL) {
|
||||
fprintf(stderr, "mt: ambiguous command \"%s\"\n", cmdstr);
|
||||
usage(1);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
if (comp->arg_cnt != MANY_ARGS && comp->arg_cnt < argc - argn) {
|
||||
fprintf(stderr, "mt: too many arguments for the command '%s'.\n",
|
||||
comp->cmd_name);
|
||||
exit(1);
|
||||
fprintf(stderr, "mt: too many arguments for the command '%s'.\n", comp->cmd_name);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (comp->cmd_fdtype != NO_FD) {
|
||||
oflags = comp->cmd_fdtype == FD_RDONLY ? O_RDONLY : O_RDWR;
|
||||
if ((comp->error_tests & ET_ONLINE) == 0)
|
||||
oflags |= O_NONBLOCK;
|
||||
if ((mtfd = open(tape_name, oflags)) < 0) {
|
||||
perror(tape_name);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
else
|
||||
mtfd = (-1);
|
||||
oflags = comp->cmd_fdtype == FD_RDONLY ? O_RDONLY : O_RDWR;
|
||||
if ((comp->error_tests & ET_ONLINE) == 0)
|
||||
oflags |= O_NONBLOCK;
|
||||
if ((mtfd = open(tape_name, oflags)) < 0) {
|
||||
perror(tape_name);
|
||||
exit(1);
|
||||
}
|
||||
} else
|
||||
mtfd = (-1);
|
||||
|
||||
if (comp->cmd_function != NULL) {
|
||||
i = comp->cmd_function(mtfd, comp, argc - argn,
|
||||
(argc - argn > 0 ? argv + argn : NULL));
|
||||
if (i) {
|
||||
if (errno == ENOSYS)
|
||||
fprintf(stderr, "mt: Command not supported by this kernel.\n");
|
||||
else if (comp->error_tests != 0)
|
||||
test_error(mtfd, comp);
|
||||
}
|
||||
}
|
||||
else {
|
||||
fprintf(stderr, "mt: Internal error: command without function.\n");
|
||||
i = 1;
|
||||
i = comp->cmd_function(mtfd, comp, argc - argn,
|
||||
(argc - argn > 0 ? argv + argn : NULL));
|
||||
if (i) {
|
||||
if (errno == ENOSYS)
|
||||
fprintf(stderr, "mt: Command not supported by this kernel.\n");
|
||||
else if (comp->error_tests != 0)
|
||||
test_error(mtfd, comp);
|
||||
}
|
||||
} else {
|
||||
fprintf(stderr, "mt: Internal error: command without function.\n");
|
||||
i = 1;
|
||||
}
|
||||
|
||||
if (mtfd >= 0)
|
||||
close(mtfd);
|
||||
close(mtfd);
|
||||
return i;
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
version()
|
||||
static void version()
|
||||
{
|
||||
printf("mt-st v. %s\n", VERSION);
|
||||
printf("default tape device: '%s'\n", DEFTAPE);
|
||||
exit(0);
|
||||
printf("mt-st v. %s\n", VERSION);
|
||||
printf("default tape device: '%s'\n", DEFTAPE);
|
||||
exit(0);
|
||||
}
|
||||
|
||||
static void
|
||||
usage(int explain)
|
||||
static void usage(int explain)
|
||||
{
|
||||
int ind;
|
||||
char line[100];
|
||||
|
||||
fprintf(stderr, "usage: mt [-v] [--version] [-h] [ -f device ] command [ count ]\n");
|
||||
fprintf(stderr, "usage: mt [-v] [--version] [-h] [ -f device ] command [ "
|
||||
"count ]\n");
|
||||
if (explain) {
|
||||
for (ind=0; cmds[ind].cmd_name != NULL; ) {
|
||||
if (ind == 0)
|
||||
strcpy(line, "commands: ");
|
||||
else
|
||||
strcpy(line, " ");
|
||||
for ( ; cmds[ind].cmd_name != NULL; ind++) {
|
||||
strcat(line, cmds[ind].cmd_name);
|
||||
if (cmds[ind+1].cmd_name != NULL)
|
||||
strcat(line, ", ");
|
||||
else
|
||||
strcat(line, ".");
|
||||
if (strlen(line) >= 70 || cmds[ind+1].cmd_name == NULL) {
|
||||
fprintf(stderr, "%s\n", line);
|
||||
ind++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (ind = 0; cmds[ind].cmd_name != NULL;) {
|
||||
if (ind == 0)
|
||||
strcpy(line, "commands: ");
|
||||
else
|
||||
strcpy(line, " ");
|
||||
for (; cmds[ind].cmd_name != NULL; ind++) {
|
||||
strcat(line, cmds[ind].cmd_name);
|
||||
if (cmds[ind + 1].cmd_name != NULL)
|
||||
strcat(line, ", ");
|
||||
else
|
||||
strcat(line, ".");
|
||||
if (strlen(line) >= 70 || cmds[ind + 1].cmd_name == NULL) {
|
||||
fprintf(stderr, "%s\n", line);
|
||||
ind++;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* Do a command that simply feeds an argument to the MTIOCTOP ioctl */
|
||||
static int
|
||||
do_standard(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
static int do_standard(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
{
|
||||
int multiplier, max_count;
|
||||
struct mtop mt_com;
|
||||
@@ -425,32 +415,32 @@ do_standard(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
mt_com.mt_op = cmd->cmd_code;
|
||||
mt_com.mt_count = (argc > 0 ? strtol(*argv, &endp, 0) : 1);
|
||||
if (argc > 0 && endp != *argv) {
|
||||
multiplier = 1;
|
||||
if (*endp == 'k')
|
||||
multiplier = 1024;
|
||||
else if (*endp == 'M')
|
||||
multiplier = 1024 * 1024;
|
||||
else if (*endp == 'G')
|
||||
multiplier = 1024 * 1024 * 1024;
|
||||
else if (*endp != 0) {
|
||||
fprintf(stderr, "mt: illegal count unit.\n");
|
||||
return 3;
|
||||
}
|
||||
max_count = INT_MAX / multiplier;
|
||||
if (abs(mt_com.mt_count) > max_count) {
|
||||
fprintf(stderr, "mt: repeat count too large.\n");
|
||||
return 3;
|
||||
}
|
||||
mt_com.mt_count *= multiplier;
|
||||
multiplier = 1;
|
||||
if (*endp == 'k')
|
||||
multiplier = 1024;
|
||||
else if (*endp == 'M')
|
||||
multiplier = 1024 * 1024;
|
||||
else if (*endp == 'G')
|
||||
multiplier = 1024 * 1024 * 1024;
|
||||
else if (*endp != 0) {
|
||||
fprintf(stderr, "mt: illegal count unit.\n");
|
||||
return 3;
|
||||
}
|
||||
max_count = INT_MAX / multiplier;
|
||||
if (abs(mt_com.mt_count) > max_count) {
|
||||
fprintf(stderr, "mt: repeat count too large.\n");
|
||||
return 3;
|
||||
}
|
||||
mt_com.mt_count *= multiplier;
|
||||
}
|
||||
mt_com.mt_count |= cmd->cmd_count_bits;
|
||||
if (mt_com.mt_op != MTMKPART && mt_com.mt_count < 0) {
|
||||
fprintf(stderr, "mt: negative repeat count\n");
|
||||
return 1;
|
||||
fprintf(stderr, "mt: negative repeat count\n");
|
||||
return 1;
|
||||
}
|
||||
if (ioctl(mtfd, MTIOCTOP, (char *)&mt_com) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -458,33 +448,31 @@ do_standard(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
|
||||
/* The the drive buffering and other things with this (highly overloaded)
|
||||
ioctl function. (See also do_options below.) */
|
||||
static int
|
||||
do_drvbuffer(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
static int do_drvbuffer(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
{
|
||||
struct mtop mt_com;
|
||||
|
||||
mt_com.mt_op = MTSETDRVBUFFER;
|
||||
mt_com.mt_count = (argc > 0 ? strtol(*argv, NULL, 0) : 1);
|
||||
if ((cmd->cmd_count_bits & MT_ST_OPTIONS) == MT_ST_DEF_OPTIONS)
|
||||
mt_com.mt_count &= 0xfffff;
|
||||
mt_com.mt_count &= 0xfffff;
|
||||
#ifdef MT_ST_TIMEOUTS
|
||||
else if ((cmd->cmd_count_bits & MT_ST_OPTIONS) == MT_ST_TIMEOUTS)
|
||||
mt_com.mt_count &= 0x7ffffff;
|
||||
mt_com.mt_count &= 0x7ffffff;
|
||||
#endif
|
||||
else
|
||||
mt_com.mt_count &= 0xfffffff;
|
||||
mt_com.mt_count &= 0xfffffff;
|
||||
mt_com.mt_count |= cmd->cmd_count_bits;
|
||||
if (ioctl(mtfd, MTIOCTOP, (char *)&mt_com) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Set the tape driver options */
|
||||
static int
|
||||
do_options(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
static int do_options(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
{
|
||||
int i, an;
|
||||
unsigned int len;
|
||||
@@ -492,63 +480,63 @@ do_options(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
|
||||
mt_com.mt_op = MTSETDRVBUFFER;
|
||||
if (argc == 0)
|
||||
mt_com.mt_count = 0;
|
||||
mt_com.mt_count = 0;
|
||||
else if (isdigit(**argv))
|
||||
mt_com.mt_count = strtol(*argv, NULL, 0) & ~MT_ST_OPTIONS;
|
||||
mt_com.mt_count = strtol(*argv, NULL, 0) & ~MT_ST_OPTIONS;
|
||||
else
|
||||
for (an = 0, mt_com.mt_count = 0; an < argc; an++) {
|
||||
len = strlen(argv[an]);
|
||||
for (i=0; boolean_tbl[i].name != NULL; i++)
|
||||
if (!strncmp(boolean_tbl[i].name, argv[an], len)) {
|
||||
mt_com.mt_count |= boolean_tbl[i].bitmask;
|
||||
break;
|
||||
}
|
||||
if (boolean_tbl[i].name == NULL) {
|
||||
fprintf(stderr, "Illegal property name '%s'.\n", argv[an]);
|
||||
fprintf(stderr, "The implemented property names are:\n");
|
||||
for (i=0; boolean_tbl[i].name != NULL; i++)
|
||||
fprintf(stderr, " %9s -> %s\n", boolean_tbl[i].name,
|
||||
boolean_tbl[i].expl);
|
||||
return 1;
|
||||
}
|
||||
if (len != strlen(boolean_tbl[i].name))
|
||||
for (i++ ; boolean_tbl[i].name != NULL; i++)
|
||||
if (!strncmp(boolean_tbl[i].name, argv[an], len)) {
|
||||
fprintf(stderr, "Property name '%s' ambiguous.\n",
|
||||
argv[an]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
for (an = 0, mt_com.mt_count = 0; an < argc; an++) {
|
||||
len = strlen(argv[an]);
|
||||
for (i = 0; boolean_tbl[i].name != NULL; i++)
|
||||
if (!strncmp(boolean_tbl[i].name, argv[an], len)) {
|
||||
mt_com.mt_count |= boolean_tbl[i].bitmask;
|
||||
break;
|
||||
}
|
||||
if (boolean_tbl[i].name == NULL) {
|
||||
fprintf(stderr, "Illegal property name '%s'.\n", argv[an]);
|
||||
fprintf(stderr, "The implemented property names are:\n");
|
||||
for (i = 0; boolean_tbl[i].name != NULL; i++)
|
||||
fprintf(stderr, " %9s -> %s\n", boolean_tbl[i].name,
|
||||
boolean_tbl[i].expl);
|
||||
return 1;
|
||||
}
|
||||
if (len != strlen(boolean_tbl[i].name))
|
||||
for (i++; boolean_tbl[i].name != NULL; i++)
|
||||
if (!strncmp(boolean_tbl[i].name, argv[an], len)) {
|
||||
fprintf(stderr, "Property name '%s' ambiguous.\n", argv[an]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
switch (cmd->cmd_code) {
|
||||
case DO_BOOLEANS:
|
||||
mt_com.mt_count |= MT_ST_BOOLEANS;
|
||||
break;
|
||||
mt_com.mt_count |= MT_ST_BOOLEANS;
|
||||
break;
|
||||
case SET_BOOLEANS:
|
||||
mt_com.mt_count |= MT_ST_SETBOOLEANS;
|
||||
break;
|
||||
mt_com.mt_count |= MT_ST_SETBOOLEANS;
|
||||
break;
|
||||
case CLEAR_BOOLEANS:
|
||||
mt_com.mt_count |= MT_ST_CLEARBOOLEANS;
|
||||
break;
|
||||
mt_com.mt_count |= MT_ST_CLEARBOOLEANS;
|
||||
break;
|
||||
}
|
||||
if (ioctl(mtfd, MTIOCTOP, (char *)&mt_com) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Tell where the tape is */
|
||||
static int
|
||||
do_tell(int mtfd, cmdef_tr *cmd __attribute__((unused)),
|
||||
int argc __attribute__((unused)), char **argv __attribute__((unused)))
|
||||
static int do_tell(int mtfd,
|
||||
cmdef_tr *cmd __attribute__((unused)),
|
||||
int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)))
|
||||
{
|
||||
struct mtpos mt_pos;
|
||||
|
||||
if (ioctl(mtfd, MTIOCPOS, (char *)&mt_pos) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
printf("At block %ld.\n", mt_pos.mt_blkno);
|
||||
return 0;
|
||||
@@ -556,22 +544,21 @@ do_tell(int mtfd, cmdef_tr *cmd __attribute__((unused)),
|
||||
|
||||
|
||||
/* Position the tape to a specific location within a specified partition */
|
||||
static int
|
||||
do_partseek(int mtfd, cmdef_tr *cmd __attribute__((unused)), int argc, char **argv)
|
||||
static int do_partseek(int mtfd, cmdef_tr *cmd __attribute__((unused)), int argc, char **argv)
|
||||
{
|
||||
struct mtop mt_com;
|
||||
|
||||
mt_com.mt_op = MTSETPART;
|
||||
mt_com.mt_count = (argc > 0 ? strtol(*argv, NULL, 0) : 0);
|
||||
if (ioctl(mtfd, MTIOCTOP, (char *)&mt_com) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
mt_com.mt_op = MTSEEK;
|
||||
mt_com.mt_count = (argc > 1 ? strtol(argv[1], NULL, 0) : 0);
|
||||
if (ioctl(mtfd, MTIOCTOP, (char *)&mt_com) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -579,35 +566,34 @@ do_partseek(int mtfd, cmdef_tr *cmd __attribute__((unused)), int argc, char **ar
|
||||
|
||||
/* Position to start of file n. This might be implemented more intelligently
|
||||
some day. */
|
||||
static int
|
||||
do_asf(int mtfd, cmdef_tr *cmd __attribute__((unused)), int argc, char **argv)
|
||||
static int do_asf(int mtfd, cmdef_tr *cmd __attribute__((unused)), int argc, char **argv)
|
||||
{
|
||||
struct mtop mt_com;
|
||||
|
||||
mt_com.mt_op = MTREW;
|
||||
mt_com.mt_count = 1;
|
||||
if (ioctl(mtfd, MTIOCTOP, (char *)&mt_com) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
mt_com.mt_count = (argc > 0 ? strtol(*argv, NULL, 0) : 0);
|
||||
if (mt_com.mt_count > 0) {
|
||||
mt_com.mt_op = MTFSF;
|
||||
if (ioctl(mtfd, MTIOCTOP, (char *)&mt_com) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
mt_com.mt_op = MTFSF;
|
||||
if (ioctl(mtfd, MTIOCTOP, (char *)&mt_com) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*** Decipher the status ***/
|
||||
/*** Decipher the status ***/
|
||||
|
||||
static int
|
||||
do_status(int mtfd, cmdef_tr *cmd __attribute__((unused)),
|
||||
int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)))
|
||||
static int do_status(int mtfd,
|
||||
cmdef_tr *cmd __attribute__((unused)),
|
||||
int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)))
|
||||
{
|
||||
struct mtget status;
|
||||
int dens;
|
||||
@@ -615,86 +601,80 @@ do_status(int mtfd, cmdef_tr *cmd __attribute__((unused)),
|
||||
char *type, *density;
|
||||
|
||||
if (ioctl(mtfd, MTIOCGET, (char *)&status) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
|
||||
if (status.mt_type == MT_ISSCSI1)
|
||||
type = "SCSI 1";
|
||||
type = "SCSI 1";
|
||||
else if (status.mt_type == MT_ISSCSI2)
|
||||
type = "SCSI 2";
|
||||
type = "SCSI 2";
|
||||
else if (status.mt_type == MT_ISONSTREAM_SC)
|
||||
type = "OnStream SC-, DI-, DP-, or USB";
|
||||
type = "OnStream SC-, DI-, DP-, or USB";
|
||||
else
|
||||
type = NULL;
|
||||
type = NULL;
|
||||
if (type == NULL) {
|
||||
if (status.mt_type & 0x800000)
|
||||
printf ("qic-117 drive type = 0x%05lx\n", status.mt_type & 0x1ffff);
|
||||
else if (status.mt_type == 0)
|
||||
printf("IDE-Tape (type code 0) ?\n");
|
||||
else
|
||||
printf("Unknown tape drive type (type code %ld)\n", status.mt_type);
|
||||
printf("File number=%d, block number=%d.\n",
|
||||
status.mt_fileno, status.mt_blkno);
|
||||
printf("mt_resid: %ld, mt_erreg: 0x%lx\n",
|
||||
status.mt_resid, status.mt_erreg);
|
||||
printf("mt_dsreg: 0x%lx, mt_gstat: 0x%lx\n",
|
||||
status.mt_dsreg, status.mt_gstat);
|
||||
}
|
||||
else {
|
||||
printf("%s tape drive:\n", type);
|
||||
if (status.mt_type == MT_ISSCSI2)
|
||||
printf("File number=%d, block number=%d, partition=%ld.\n",
|
||||
status.mt_fileno, status.mt_blkno, (status.mt_resid & 0xff));
|
||||
else
|
||||
printf("File number=%d, block number=%d.\n",
|
||||
status.mt_fileno, status.mt_blkno);
|
||||
if (status.mt_type == MT_ISSCSI1 ||
|
||||
status.mt_type == MT_ISSCSI2 ||
|
||||
status.mt_type == MT_ISONSTREAM_SC) {
|
||||
dens = (status.mt_dsreg & MT_ST_DENSITY_MASK) >> MT_ST_DENSITY_SHIFT;
|
||||
density = "no translation";
|
||||
for (i=0; i < NBR_DENSITIES; i++)
|
||||
if (density_tbl[i].code == dens) {
|
||||
density = density_tbl[i].name;
|
||||
break;
|
||||
}
|
||||
printf("Tape block size %ld bytes. Density code 0x%x (%s).\n",
|
||||
((status.mt_dsreg & MT_ST_BLKSIZE_MASK) >> MT_ST_BLKSIZE_SHIFT),
|
||||
dens, density);
|
||||
if (status.mt_type & 0x800000)
|
||||
printf("qic-117 drive type = 0x%05lx\n", status.mt_type & 0x1ffff);
|
||||
else if (status.mt_type == 0)
|
||||
printf("IDE-Tape (type code 0) ?\n");
|
||||
else
|
||||
printf("Unknown tape drive type (type code %ld)\n", status.mt_type);
|
||||
printf("File number=%d, block number=%d.\n", status.mt_fileno, status.mt_blkno);
|
||||
printf("mt_resid: %ld, mt_erreg: 0x%lx\n", status.mt_resid, status.mt_erreg);
|
||||
printf("mt_dsreg: 0x%lx, mt_gstat: 0x%lx\n", status.mt_dsreg, status.mt_gstat);
|
||||
} else {
|
||||
printf("%s tape drive:\n", type);
|
||||
if (status.mt_type == MT_ISSCSI2)
|
||||
printf("File number=%d, block number=%d, partition=%ld.\n",
|
||||
status.mt_fileno, status.mt_blkno, (status.mt_resid & 0xff));
|
||||
else
|
||||
printf("File number=%d, block number=%d.\n", status.mt_fileno, status.mt_blkno);
|
||||
if (status.mt_type == MT_ISSCSI1 || status.mt_type == MT_ISSCSI2 ||
|
||||
status.mt_type == MT_ISONSTREAM_SC) {
|
||||
dens = (status.mt_dsreg & MT_ST_DENSITY_MASK) >> MT_ST_DENSITY_SHIFT;
|
||||
density = "no translation";
|
||||
for (i = 0; i < NBR_DENSITIES; i++)
|
||||
if (density_tbl[i].code == dens) {
|
||||
density = density_tbl[i].name;
|
||||
break;
|
||||
}
|
||||
printf("Tape block size %ld bytes. Density code 0x%x (%s).\n",
|
||||
((status.mt_dsreg & MT_ST_BLKSIZE_MASK) >> MT_ST_BLKSIZE_SHIFT),
|
||||
dens, density);
|
||||
|
||||
printf("Soft error count since last status=%ld\n",
|
||||
(status.mt_erreg & MT_ST_SOFTERR_MASK) >> MT_ST_SOFTERR_SHIFT);
|
||||
}
|
||||
printf("Soft error count since last status=%ld\n",
|
||||
(status.mt_erreg & MT_ST_SOFTERR_MASK) >> MT_ST_SOFTERR_SHIFT);
|
||||
}
|
||||
}
|
||||
|
||||
printf("General status bits on (%lx):\n", status.mt_gstat);
|
||||
if (GMT_EOF(status.mt_gstat))
|
||||
printf(" EOF");
|
||||
printf(" EOF");
|
||||
if (GMT_BOT(status.mt_gstat))
|
||||
printf(" BOT");
|
||||
printf(" BOT");
|
||||
if (GMT_EOT(status.mt_gstat))
|
||||
printf(" EOT");
|
||||
printf(" EOT");
|
||||
if (GMT_SM(status.mt_gstat))
|
||||
printf(" SM");
|
||||
printf(" SM");
|
||||
if (GMT_EOD(status.mt_gstat))
|
||||
printf(" EOD");
|
||||
printf(" EOD");
|
||||
if (GMT_WR_PROT(status.mt_gstat))
|
||||
printf(" WR_PROT");
|
||||
printf(" WR_PROT");
|
||||
if (GMT_ONLINE(status.mt_gstat))
|
||||
printf(" ONLINE");
|
||||
printf(" ONLINE");
|
||||
if (GMT_D_6250(status.mt_gstat))
|
||||
printf(" D_6250");
|
||||
printf(" D_6250");
|
||||
if (GMT_D_1600(status.mt_gstat))
|
||||
printf(" D_1600");
|
||||
printf(" D_1600");
|
||||
if (GMT_D_800(status.mt_gstat))
|
||||
printf(" D_800");
|
||||
printf(" D_800");
|
||||
if (GMT_DR_OPEN(status.mt_gstat))
|
||||
printf(" DR_OPEN");
|
||||
printf(" DR_OPEN");
|
||||
if (GMT_IM_REP_EN(status.mt_gstat))
|
||||
printf(" IM_REP_EN");
|
||||
printf(" IM_REP_EN");
|
||||
if (GMT_CLN(status.mt_gstat))
|
||||
printf(" CLN");
|
||||
printf(" CLN");
|
||||
printf("\n");
|
||||
return 0;
|
||||
}
|
||||
@@ -705,18 +685,17 @@ do_status(int mtfd, cmdef_tr *cmd __attribute__((unused)),
|
||||
#define ST_NBR_MODES (1 << ST_NBR_MODE_BITS)
|
||||
#define ST_MODE_SHIFT (7 - ST_NBR_MODE_BITS)
|
||||
#define ST_MODE_MASK ((ST_NBR_MODES - 1) << ST_MODE_SHIFT)
|
||||
#define TAPE_NR(minor) ( (((minor) & ~255) >> (ST_NBR_MODE_BITS + 1)) | \
|
||||
((minor) & ~(-1 << ST_MODE_SHIFT)) )
|
||||
#define TAPE_MODE(minor) (((minor) & ST_MODE_MASK) >> ST_MODE_SHIFT)
|
||||
static const char *st_formats[] = {
|
||||
"", "r", "k", "s", "l", "t", "o", "u",
|
||||
"m", "v", "p", "x", "a", "y", "q", "z"};
|
||||
#define TAPE_NR(minor) \
|
||||
((((minor) & ~255) >> (ST_NBR_MODE_BITS + 1)) | ((minor) & ~(-1 << ST_MODE_SHIFT)))
|
||||
#define TAPE_MODE(minor) (((minor)&ST_MODE_MASK) >> ST_MODE_SHIFT)
|
||||
static const char *st_formats[] = { "", "r", "k", "s", "l", "t", "o", "u",
|
||||
"m", "v", "p", "x", "a", "y", "q", "z" };
|
||||
|
||||
/* Show the options if visible in sysfs */
|
||||
static int do_show_options(int mtfd,
|
||||
cmdef_tr *cmd __attribute__((unused)),
|
||||
int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)))
|
||||
cmdef_tr *cmd __attribute__((unused)),
|
||||
int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)))
|
||||
{
|
||||
int i, fd, options, tapeminor, tapeno, tapemode;
|
||||
struct stat stat;
|
||||
@@ -724,42 +703,40 @@ static int do_show_options(int mtfd,
|
||||
char fname[100], buf[20];
|
||||
|
||||
if (uname(&uts) < 0) {
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
perror(tape_name);
|
||||
return 2;
|
||||
}
|
||||
sscanf(uts.release, "%d.%d.%d", &i, &tapeno, &tapemode);
|
||||
|
||||
if (fstat(mtfd, &stat) < 0) {
|
||||
perror(tape_name);
|
||||
return 1;
|
||||
perror(tape_name);
|
||||
return 1;
|
||||
}
|
||||
|
||||
if (!(stat.st_mode & S_IFCHR)) {
|
||||
fprintf(stderr, "mt: not a character device.\n");
|
||||
return 1;
|
||||
fprintf(stderr, "mt: not a character device.\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
tapeminor = minor(stat.st_rdev);
|
||||
tapeno = TAPE_NR(tapeminor);
|
||||
tapemode = TAPE_MODE(tapeminor);
|
||||
tapemode <<= 4 - ST_NBR_MODE_BITS; /* from st.c */
|
||||
sprintf(fname, "/sys/class/scsi_tape/st%d%s/options", tapeno,
|
||||
st_formats[tapemode]);
|
||||
tapemode <<= 4 - ST_NBR_MODE_BITS; /* from st.c */
|
||||
sprintf(fname, "/sys/class/scsi_tape/st%d%s/options", tapeno, st_formats[tapemode]);
|
||||
/* printf("Trying file '%s' (st_rdev 0x%lx).\n", fname, stat.st_rdev); */
|
||||
|
||||
if ((fd = open(fname, O_RDONLY)) < 0 ||
|
||||
read(fd, buf, 20) < 0) {
|
||||
fprintf(stderr, "Can't read the sysfs file '%s'.\n", fname);
|
||||
return 2;
|
||||
if ((fd = open(fname, O_RDONLY)) < 0 || read(fd, buf, 20) < 0) {
|
||||
fprintf(stderr, "Can't read the sysfs file '%s'.\n", fname);
|
||||
return 2;
|
||||
}
|
||||
close(fd);
|
||||
|
||||
options = strtol(buf, NULL, 0);
|
||||
|
||||
printf("The options set:");
|
||||
for (i=0; boolean_tbl[i].name != NULL; i++)
|
||||
if (options & boolean_tbl[i].bitmask)
|
||||
printf(" %s", boolean_tbl[i].name);
|
||||
for (i = 0; boolean_tbl[i].name != NULL; i++)
|
||||
if (options & boolean_tbl[i].bitmask)
|
||||
printf(" %s", boolean_tbl[i].name);
|
||||
printf("\n");
|
||||
|
||||
return 0;
|
||||
@@ -767,42 +744,42 @@ static int do_show_options(int mtfd,
|
||||
|
||||
|
||||
/* Print a list of possible density codes */
|
||||
static int
|
||||
print_densities(int fd __attribute__((unused)),
|
||||
cmdef_tr *cmd __attribute__((unused)),
|
||||
int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)))
|
||||
static int print_densities(int fd __attribute__((unused)),
|
||||
cmdef_tr *cmd __attribute__((unused)),
|
||||
int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)))
|
||||
{
|
||||
unsigned int i, offset;
|
||||
|
||||
printf("Some SCSI tape density codes:\ncode explanation code explanation\n");
|
||||
printf("Some SCSI tape density codes:\ncode explanation "
|
||||
" code explanation\n");
|
||||
offset = (NBR_DENSITIES + 1) / 2;
|
||||
for (i=0; i < offset; i++) {
|
||||
printf("0x%02x %-28s", density_tbl[i].code, density_tbl[i].name);
|
||||
if (i + offset < NBR_DENSITIES)
|
||||
printf(" 0x%02x %s\n", density_tbl[i + offset].code, density_tbl[i + offset].name);
|
||||
else
|
||||
printf("\n");
|
||||
for (i = 0; i < offset; i++) {
|
||||
printf("0x%02x %-28s", density_tbl[i].code, density_tbl[i].name);
|
||||
if (i + offset < NBR_DENSITIES)
|
||||
printf(" 0x%02x %s\n", density_tbl[i + offset].code,
|
||||
density_tbl[i + offset].name);
|
||||
else
|
||||
printf("\n");
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* Try to find out why the command failed */
|
||||
static void
|
||||
test_error(int mtfd, cmdef_tr *cmd)
|
||||
static void test_error(int mtfd, cmdef_tr *cmd)
|
||||
{
|
||||
struct mtget status;
|
||||
|
||||
if (ioctl(mtfd, MTIOCGET, (char *)&status) < 0)
|
||||
return;
|
||||
return;
|
||||
|
||||
if (status.mt_type != MT_ISSCSI1 && status.mt_type != MT_ISSCSI2)
|
||||
return;
|
||||
return;
|
||||
|
||||
if ((cmd->error_tests & ET_ONLINE) && !GMT_ONLINE(status.mt_gstat))
|
||||
fprintf(stderr, "mt: The device is offline (not powered on, no tape ?).\n");
|
||||
fprintf(stderr,
|
||||
"mt: The device is offline (not powered on, no tape ?).\n");
|
||||
if ((cmd->error_tests & ET_WPROT) && !GMT_WR_PROT(status.mt_gstat))
|
||||
fprintf(stderr, "mt: The tape is write-protected.\n");
|
||||
fprintf(stderr, "mt: The tape is write-protected.\n");
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user