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
|
||||
|
||||
141
mt.c
141
mt.c
@@ -32,7 +32,7 @@
|
||||
|
||||
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;
|
||||
@@ -61,7 +61,7 @@ struct cmdef_tr {
|
||||
#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 **);
|
||||
@@ -258,16 +258,14 @@ static struct booleans {
|
||||
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++)
|
||||
for (argn = 1; argn < argc; argn++)
|
||||
if (*argv[argn] == '-')
|
||||
switch (*(argv[argn] + 1)) {
|
||||
case 'f':
|
||||
@@ -287,8 +285,7 @@ main(int argc, char **argv)
|
||||
version();
|
||||
break;
|
||||
case '-':
|
||||
if (*(argv[argn] + 1) == '-' &&
|
||||
*(argv[argn] + 2) == 'v') {
|
||||
if (*(argv[argn] + 1) == '-' && *(argv[argn] + 2) == 'v') {
|
||||
version();
|
||||
}
|
||||
/* Fall through */
|
||||
@@ -303,15 +300,14 @@ main(int argc, char **argv)
|
||||
struct stat stbuf;
|
||||
|
||||
tape_name = DEFTAPE;
|
||||
if (!stat(tape_name, &stbuf) &&
|
||||
!S_ISCHR(stbuf.st_mode)) {
|
||||
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 ) {
|
||||
if (argn >= argc) {
|
||||
usage(0);
|
||||
exit(1);
|
||||
}
|
||||
@@ -337,8 +333,7 @@ main(int argc, char **argv)
|
||||
}
|
||||
}
|
||||
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);
|
||||
fprintf(stderr, "mt: too many arguments for the command '%s'.\n", comp->cmd_name);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
@@ -350,8 +345,7 @@ main(int argc, char **argv)
|
||||
perror(tape_name);
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
else
|
||||
} else
|
||||
mtfd = (-1);
|
||||
|
||||
if (comp->cmd_function != NULL) {
|
||||
@@ -363,8 +357,7 @@ main(int argc, char **argv)
|
||||
else if (comp->error_tests != 0)
|
||||
test_error(mtfd, comp);
|
||||
}
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
fprintf(stderr, "mt: Internal error: command without function.\n");
|
||||
i = 1;
|
||||
}
|
||||
@@ -375,34 +368,33 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
version()
|
||||
static void version()
|
||||
{
|
||||
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; ) {
|
||||
for (ind = 0; cmds[ind].cmd_name != NULL;) {
|
||||
if (ind == 0)
|
||||
strcpy(line, "commands: ");
|
||||
else
|
||||
strcpy(line, " ");
|
||||
for ( ; cmds[ind].cmd_name != NULL; ind++) {
|
||||
for (; cmds[ind].cmd_name != NULL; ind++) {
|
||||
strcat(line, cmds[ind].cmd_name);
|
||||
if (cmds[ind+1].cmd_name != NULL)
|
||||
if (cmds[ind + 1].cmd_name != NULL)
|
||||
strcat(line, ", ");
|
||||
else
|
||||
strcat(line, ".");
|
||||
if (strlen(line) >= 70 || cmds[ind+1].cmd_name == NULL) {
|
||||
if (strlen(line) >= 70 || cmds[ind + 1].cmd_name == NULL) {
|
||||
fprintf(stderr, "%s\n", line);
|
||||
ind++;
|
||||
break;
|
||||
@@ -413,10 +405,8 @@ usage(int explain)
|
||||
}
|
||||
|
||||
|
||||
|
||||
/* 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;
|
||||
@@ -458,8 +448,7 @@ 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;
|
||||
|
||||
@@ -483,8 +472,7 @@ do_drvbuffer(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
|
||||
|
||||
/* 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;
|
||||
@@ -498,7 +486,7 @@ do_options(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
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++)
|
||||
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;
|
||||
@@ -506,16 +494,15 @@ do_options(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
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++)
|
||||
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++)
|
||||
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]);
|
||||
fprintf(stderr, "Property name '%s' ambiguous.\n", argv[an]);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
@@ -540,9 +527,10 @@ do_options(int mtfd, cmdef_tr *cmd, int argc, char **argv)
|
||||
|
||||
|
||||
/* 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;
|
||||
|
||||
@@ -556,8 +544,7 @@ 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;
|
||||
|
||||
@@ -579,8 +566,7 @@ 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;
|
||||
|
||||
@@ -602,10 +588,10 @@ do_asf(int mtfd, cmdef_tr *cmd __attribute__((unused)), int argc, char **argv)
|
||||
}
|
||||
|
||||
|
||||
/*** Decipher the status ***/
|
||||
/*** Decipher the status ***/
|
||||
|
||||
static int
|
||||
do_status(int mtfd, cmdef_tr *cmd __attribute__((unused)),
|
||||
static int do_status(int mtfd,
|
||||
cmdef_tr *cmd __attribute__((unused)),
|
||||
int argc __attribute__((unused)),
|
||||
char **argv __attribute__((unused)))
|
||||
{
|
||||
@@ -629,32 +615,26 @@ do_status(int mtfd, cmdef_tr *cmd __attribute__((unused)),
|
||||
type = NULL;
|
||||
if (type == NULL) {
|
||||
if (status.mt_type & 0x800000)
|
||||
printf ("qic-117 drive type = 0x%05lx\n", status.mt_type & 0x1ffff);
|
||||
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("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 ||
|
||||
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++)
|
||||
for (i = 0; i < NBR_DENSITIES; i++)
|
||||
if (density_tbl[i].code == dens) {
|
||||
density = density_tbl[i].name;
|
||||
break;
|
||||
@@ -705,12 +685,11 @@ 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,
|
||||
@@ -743,12 +722,10 @@ static int do_show_options(int mtfd,
|
||||
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]);
|
||||
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) {
|
||||
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;
|
||||
}
|
||||
@@ -757,7 +734,7 @@ static int do_show_options(int mtfd,
|
||||
options = strtol(buf, NULL, 0);
|
||||
|
||||
printf("The options set:");
|
||||
for (i=0; boolean_tbl[i].name != NULL; i++)
|
||||
for (i = 0; boolean_tbl[i].name != NULL; i++)
|
||||
if (options & boolean_tbl[i].bitmask)
|
||||
printf(" %s", boolean_tbl[i].name);
|
||||
printf("\n");
|
||||
@@ -767,20 +744,21 @@ static int do_show_options(int mtfd,
|
||||
|
||||
|
||||
/* Print a list of possible density codes */
|
||||
static int
|
||||
print_densities(int fd __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++) {
|
||||
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);
|
||||
printf(" 0x%02x %s\n", density_tbl[i + offset].code,
|
||||
density_tbl[i + offset].name);
|
||||
else
|
||||
printf("\n");
|
||||
}
|
||||
@@ -789,8 +767,7 @@ print_densities(int fd __attribute__((unused)),
|
||||
|
||||
|
||||
/* 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;
|
||||
|
||||
@@ -801,8 +778,8 @@ test_error(int mtfd, cmdef_tr *cmd)
|
||||
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");
|
||||
}
|
||||
|
||||
|
||||
254
stinit.c
254
stinit.c
@@ -30,7 +30,7 @@
|
||||
#define TRUE 1
|
||||
#define FALSE 0
|
||||
#endif
|
||||
#define SKIP_WHITE(p) for ( ; *p == ' ' || *p == '\t'; p++)
|
||||
#define SKIP_WHITE(p) for (; *p == ' ' || *p == '\t'; p++)
|
||||
|
||||
typedef struct _modepar_tr {
|
||||
int defined;
|
||||
@@ -73,40 +73,34 @@ typedef struct _devdef_tr {
|
||||
static int verbose = 0;
|
||||
|
||||
/* The device directories being searched */
|
||||
typedef struct
|
||||
{
|
||||
typedef struct {
|
||||
char dir[PATH_MAX];
|
||||
int selective_scan;
|
||||
} devdir;
|
||||
static devdir devdirs[] = { {"/dev/scsi", 0}, {"/dev", 1}, {"", 0}};
|
||||
static devdir devdirs[] = { { "/dev/scsi", 0 }, { "/dev", 1 }, { "", 0 } };
|
||||
|
||||
#define DEVFS_PATH "/dev/tapes"
|
||||
#define DEVFS_TAPEFMT DEVFS_PATH "/tape%d"
|
||||
|
||||
/* The partial names of the tape devices being included in the
|
||||
search in selective scan */
|
||||
static char *tape_name_bases[] = {
|
||||
"st", "nst", "rmt", "nrmt", "tape", NULL};
|
||||
static char *tape_name_bases[] = { "st", "nst", "rmt", "nrmt", "tape", NULL };
|
||||
|
||||
/* The list of standard definition files being searched */
|
||||
static char *std_databases[] = {
|
||||
"/etc/stinit.def",
|
||||
NULL};
|
||||
static char *std_databases[] = { "/etc/stinit.def", NULL };
|
||||
|
||||
static FILE *
|
||||
open_database(char *base)
|
||||
static FILE *open_database(char *base)
|
||||
{
|
||||
int i;
|
||||
FILE *f;
|
||||
|
||||
if (base != NULL) {
|
||||
if ((f = fopen(base, "r")) == NULL)
|
||||
fprintf(stderr, "stinit: Can't find SCSI tape database '%s'.\n",
|
||||
base);
|
||||
fprintf(stderr, "stinit: Can't find SCSI tape database '%s'.\n", base);
|
||||
return f;
|
||||
}
|
||||
|
||||
for (i=0; std_databases[i] != NULL; i++) {
|
||||
for (i = 0; std_databases[i] != NULL; i++) {
|
||||
if (verbose > 1)
|
||||
fprintf(stderr, "Trying to open database '%s'.\n", std_databases[i]);
|
||||
if ((f = fopen(std_databases[i], "r")) != NULL) {
|
||||
@@ -121,8 +115,7 @@ open_database(char *base)
|
||||
}
|
||||
|
||||
|
||||
static char *
|
||||
find_string(char *s, char *target, char *buf, int buflen)
|
||||
static char *find_string(char *s, char *target, char *buf, int buflen)
|
||||
{
|
||||
int have_arg;
|
||||
char *cp, *cp2, c, *argp;
|
||||
@@ -130,10 +123,10 @@ find_string(char *s, char *target, char *buf, int buflen)
|
||||
if (buf != NULL && buflen > 0)
|
||||
*buf = '\0';
|
||||
|
||||
for ( ; *s != '\0'; ) {
|
||||
for (; *s != '\0';) {
|
||||
SKIP_WHITE(s);
|
||||
if (isalpha(*s)) {
|
||||
for (cp=s ; isalnum(*cp) || *cp == '-'; cp++)
|
||||
for (cp = s; isalnum(*cp) || *cp == '-'; cp++)
|
||||
;
|
||||
cp2 = cp;
|
||||
SKIP_WHITE(cp);
|
||||
@@ -142,18 +135,16 @@ find_string(char *s, char *target, char *buf, int buflen)
|
||||
SKIP_WHITE(cp);
|
||||
if (*cp == '"') {
|
||||
cp++;
|
||||
for (cp2=cp; *cp2 != '"' && *cp2 != '\0'; cp2++)
|
||||
for (cp2 = cp; *cp2 != '"' && *cp2 != '\0'; cp2++)
|
||||
;
|
||||
}
|
||||
else
|
||||
for (cp2=cp+1; isalnum(*cp2) || *cp2 == '-'; cp2++)
|
||||
} else
|
||||
for (cp2 = cp + 1; isalnum(*cp2) || *cp2 == '-'; cp2++)
|
||||
;
|
||||
if (*cp2 == '\0')
|
||||
return NULL;
|
||||
have_arg = TRUE;
|
||||
argp = cp;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
have_arg = FALSE;
|
||||
argp = "1";
|
||||
}
|
||||
@@ -182,17 +173,15 @@ find_string(char *s, char *target, char *buf, int buflen)
|
||||
return buf;
|
||||
}
|
||||
s = cp2;
|
||||
}
|
||||
else
|
||||
for ( ; *s != '\0' && *s != ' ' && *s != '\t'; s++)
|
||||
} else
|
||||
for (; *s != '\0' && *s != ' ' && *s != '\t'; s++)
|
||||
;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
num_arg(char *t)
|
||||
static int num_arg(char *t)
|
||||
{
|
||||
int nbr;
|
||||
char *tt;
|
||||
@@ -208,8 +197,7 @@ num_arg(char *t)
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
next_block(FILE *dbf, char *buf, size_t buflen, int limiter)
|
||||
static int next_block(FILE *dbf, char *buf, size_t buflen, int limiter)
|
||||
{
|
||||
size_t len;
|
||||
char *cp, *bp;
|
||||
@@ -221,7 +209,7 @@ next_block(FILE *dbf, char *buf, size_t buflen, int limiter)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
for (len = 0 ; ; ) {
|
||||
for (len = 0;;) {
|
||||
bp = buf + len;
|
||||
if ((cp = strchr(lbuf, limiter)) != NULL) {
|
||||
*cp = '\0';
|
||||
@@ -250,9 +238,8 @@ next_block(FILE *dbf, char *buf, size_t buflen, int limiter)
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
find_pars(FILE *dbf, char *company, char *product, char *rev, devdef_tr *defs,
|
||||
int parse_only)
|
||||
static int
|
||||
find_pars(FILE *dbf, char *company, char *product, char *rev, devdef_tr *defs, int parse_only)
|
||||
{
|
||||
int i, mode, modes_defined, errors;
|
||||
char line[LINEMAX], defstr[DEFMAX], comdef[DEFMAX], modebuf[DEFMAX];
|
||||
@@ -267,7 +254,7 @@ find_pars(FILE *dbf, char *company, char *product, char *rev, devdef_tr *defs,
|
||||
defs->cleaning = (-1);
|
||||
defs->nowait = (-1);
|
||||
defs->sili = (-1);
|
||||
for (i=0; i < NBR_MODES; i++) {
|
||||
for (i = 0; i < NBR_MODES; i++) {
|
||||
defs->modedefs[i].defined = FALSE;
|
||||
defs->modedefs[i].blocksize = (-1);
|
||||
defs->modedefs[i].density = (-1);
|
||||
@@ -288,7 +275,7 @@ find_pars(FILE *dbf, char *company, char *product, char *rev, devdef_tr *defs,
|
||||
next_block(dbf, NULL, 0, 0);
|
||||
|
||||
/* Find matching inquiry block */
|
||||
for (errors=0 ; ; ) {
|
||||
for (errors = 0;;) {
|
||||
|
||||
if (!next_block(dbf, defstr, DEFMAX, '{'))
|
||||
break;
|
||||
@@ -298,30 +285,25 @@ find_pars(FILE *dbf, char *company, char *product, char *rev, devdef_tr *defs,
|
||||
find_string(defstr, "rev", tmprev, LINEMAX);
|
||||
|
||||
if (!next_block(dbf, defstr, DEFMAX, '}')) {
|
||||
fprintf(stderr,
|
||||
"End of definition block not found for ('%s', '%s', '%s').\n",
|
||||
fprintf(stderr, "End of definition block not found for ('%s', "
|
||||
"'%s', '%s').\n",
|
||||
tmpcomp, tmpprod, tmprev);
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!parse_only) {
|
||||
if (tmpcomp[0] != '\0' &&
|
||||
strncmp(company, tmpcomp, strlen(tmpcomp)))
|
||||
if (tmpcomp[0] != '\0' && strncmp(company, tmpcomp, strlen(tmpcomp)))
|
||||
continue;
|
||||
if (tmpprod[0] != '\0' &&
|
||||
strncmp(product, tmpprod, strlen(tmpprod)))
|
||||
if (tmpprod[0] != '\0' && strncmp(product, tmpprod, strlen(tmpprod)))
|
||||
continue;
|
||||
if (tmprev[0] != '\0' &&
|
||||
strncmp(rev, tmprev, strlen(tmprev)))
|
||||
if (tmprev[0] != '\0' && strncmp(rev, tmprev, strlen(tmprev)))
|
||||
continue;
|
||||
}
|
||||
else if (verbose > 0)
|
||||
printf("\nParsing modes for ('%s', '%s', '%s').\n",
|
||||
tmpcomp, tmpprod, tmprev);
|
||||
} else if (verbose > 0)
|
||||
printf("\nParsing modes for ('%s', '%s', '%s').\n", tmpcomp, tmpprod, tmprev);
|
||||
|
||||
/* Block found, get the characteristics */
|
||||
for (nextdef=defstr; *nextdef != '\0' &&
|
||||
(*nextdef != 'm' || strncmp(nextdef, "mode", 2)); nextdef++)
|
||||
for (nextdef = defstr;
|
||||
*nextdef != '\0' && (*nextdef != 'm' || strncmp(nextdef, "mode", 2)); nextdef++)
|
||||
;
|
||||
c = *nextdef;
|
||||
*nextdef = '\0';
|
||||
@@ -330,19 +312,19 @@ find_pars(FILE *dbf, char *company, char *product, char *rev, devdef_tr *defs,
|
||||
comptr = comdef;
|
||||
SKIP_WHITE(comptr);
|
||||
|
||||
for ( ; *nextdef != '\0'; ) {
|
||||
for (; *nextdef != '\0';) {
|
||||
curdef = nextdef;
|
||||
SKIP_WHITE(curdef);
|
||||
for (nextdef++ ; *nextdef != '\0' &&
|
||||
(*nextdef != 'm' || strncmp(nextdef, "mode", 2)); nextdef++)
|
||||
for (nextdef++; *nextdef != '\0' &&
|
||||
(*nextdef != 'm' || strncmp(nextdef, "mode", 2));
|
||||
nextdef++)
|
||||
;
|
||||
c = *nextdef;
|
||||
*nextdef = '\0';
|
||||
|
||||
mode = strtol(curdef + 4, &cp, 0) - 1;
|
||||
if (mode < 0 || mode >= NBR_MODES) {
|
||||
fprintf(stderr,
|
||||
"Illegal mode for ('%s', '%s', '%s'):\n'%s'\n",
|
||||
fprintf(stderr, "Illegal mode for ('%s', '%s', '%s'):\n'%s'\n",
|
||||
tmpcomp, tmpprod, tmprev, curdef);
|
||||
*nextdef = c;
|
||||
errors++;
|
||||
@@ -407,11 +389,11 @@ find_pars(FILE *dbf, char *company, char *product, char *rev, devdef_tr *defs,
|
||||
if ((t = find_string(modebuf, "defs-for-w", line, LINEMAX)) != NULL)
|
||||
defs->modedefs[mode].defs_for_writes = num_arg(t);
|
||||
|
||||
for (t=modebuf; *t == ' ' || *t == '\t'; t++)
|
||||
for (t = modebuf; *t == ' ' || *t == '\t'; t++)
|
||||
;
|
||||
if (*t != '\0' && call_nbr <= 1) {
|
||||
fprintf(stderr,
|
||||
"Warning: errors in definition for ('%s', '%s', '%s'):\n%s\n",
|
||||
fprintf(stderr, "Warning: errors in definition for ('%s', "
|
||||
"'%s', '%s'):\n%s\n",
|
||||
tmpcomp, tmpprod, tmprev, modebuf);
|
||||
errors++;
|
||||
}
|
||||
@@ -425,14 +407,12 @@ find_pars(FILE *dbf, char *company, char *product, char *rev, devdef_tr *defs,
|
||||
if (errors) {
|
||||
printf("Errors found!\n");
|
||||
return FALSE;
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
printf("No errors found.\n");
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i=modes_defined=0; i < NBR_MODES; i++)
|
||||
} else {
|
||||
for (i = modes_defined = 0; i < NBR_MODES; i++)
|
||||
if (defs->modedefs[i].defined)
|
||||
modes_defined++;
|
||||
if (modes_defined == 0) {
|
||||
@@ -451,8 +431,7 @@ find_pars(FILE *dbf, char *company, char *product, char *rev, devdef_tr *defs,
|
||||
|
||||
static int sg_io_errcheck(struct sg_io_hdr *hdp)
|
||||
{
|
||||
if ((hdp->status & 0x7e) == 0 || hdp->host_status == 0 ||
|
||||
hdp->driver_status == 0)
|
||||
if ((hdp->status & 0x7e) == 0 || hdp->host_status == 0 || hdp->driver_status == 0)
|
||||
return 0;
|
||||
return EIO;
|
||||
}
|
||||
@@ -468,15 +447,14 @@ static int sg_io_errcheck(struct sg_io_hdr *hdp)
|
||||
#endif
|
||||
#define IOCTL_HEADER_LENGTH 8
|
||||
|
||||
static int
|
||||
do_inquiry(char *tname, char *company, char *product, char *rev, int print_non_found)
|
||||
static int do_inquiry(char *tname, char *company, char *product, char *rev, int print_non_found)
|
||||
{
|
||||
int fn;
|
||||
int result, *ip, i;
|
||||
#define BUFLEN 256
|
||||
unsigned char buffer[BUFLEN], *cmd, *inqptr;
|
||||
struct sg_io_hdr io_hdr;
|
||||
unsigned char inqCmdBlk[INQUIRY_CMDLEN] = {INQUIRY, 0, 0, 0, 200, 0};
|
||||
unsigned char inqCmdBlk[INQUIRY_CMDLEN] = { INQUIRY, 0, 0, 0, 200, 0 };
|
||||
unsigned char sense_b[SENSE_BUFF_LEN];
|
||||
|
||||
if ((fn = open(tname, O_RDONLY | O_NONBLOCK)) < 0) {
|
||||
@@ -484,8 +462,7 @@ do_inquiry(char *tname, char *company, char *product, char *rev, int print_non_f
|
||||
if (errno == ENXIO)
|
||||
fprintf(stderr, "Device '%s' not found by kernel.\n", tname);
|
||||
else
|
||||
fprintf(stderr, "Can't open tape device '%s' (errno %d).\n",
|
||||
tname, errno);
|
||||
fprintf(stderr, "Can't open tape device '%s' (errno %d).\n", tname, errno);
|
||||
}
|
||||
return FALSE;
|
||||
}
|
||||
@@ -511,7 +488,7 @@ do_inquiry(char *tname, char *company, char *product, char *rev, int print_non_f
|
||||
memset(buffer, 0, BUFLEN);
|
||||
ip = (int *)&(buffer[0]);
|
||||
*ip = 0;
|
||||
*(ip+1) = BUFLEN - 13;
|
||||
*(ip + 1) = BUFLEN - 13;
|
||||
|
||||
cmd = &(buffer[8]);
|
||||
cmd[0] = INQUIRY;
|
||||
@@ -523,23 +500,22 @@ do_inquiry(char *tname, char *company, char *product, char *rev, int print_non_f
|
||||
if (result) {
|
||||
close(fn);
|
||||
sprintf((char *)buffer,
|
||||
"The SCSI INQUIRY for device '%s' failed (power off?)",
|
||||
tname);
|
||||
"The SCSI INQUIRY for device '%s' failed (power off?)", tname);
|
||||
perror((char *)buffer);
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
memcpy(company, inqptr + 8, 8);
|
||||
for (i=8; i > 0 && company[i-1] == ' '; i--)
|
||||
for (i = 8; i > 0 && company[i - 1] == ' '; i--)
|
||||
;
|
||||
company[i] = '\0';
|
||||
memcpy(product, inqptr + 16, 16);
|
||||
for (i=16; i > 0 && product[i-1] == ' '; i--)
|
||||
for (i = 16; i > 0 && product[i - 1] == ' '; i--)
|
||||
;
|
||||
product[i] = '\0';
|
||||
memcpy(rev, inqptr + 32, 4);
|
||||
for (i=4; i > 0 && rev[i-1] == ' '; i--)
|
||||
for (i = 4; i > 0 && rev[i - 1] == ' '; i--)
|
||||
;
|
||||
rev[i] = '\0';
|
||||
|
||||
@@ -548,8 +524,7 @@ do_inquiry(char *tname, char *company, char *product, char *rev, int print_non_f
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
tapenum(char *name)
|
||||
static int tapenum(char *name)
|
||||
{
|
||||
int dev;
|
||||
struct dirent *dent;
|
||||
@@ -564,19 +539,17 @@ tapenum(char *name)
|
||||
fprintf(stderr, "Can't stat '%s'.\n", name);
|
||||
return (-1);
|
||||
}
|
||||
if (!S_ISCHR(statbuf.st_mode) ||
|
||||
major(statbuf.st_rdev) != SCSI_TAPE_MAJOR)
|
||||
if (!S_ISCHR(statbuf.st_mode) || major(statbuf.st_rdev) != SCSI_TAPE_MAJOR)
|
||||
return (-1);
|
||||
dev = minor(statbuf.st_rdev) & 31;
|
||||
return dev;
|
||||
}
|
||||
else { /* Search from the device directories */
|
||||
for (dvd=devdirs; dvd->dir[0] != 0; dvd++) {
|
||||
} else { /* Search from the device directories */
|
||||
for (dvd = devdirs; dvd->dir[0] != 0; dvd++) {
|
||||
dn = dvd->dir;
|
||||
if ((dirp = opendir(dn)) == NULL)
|
||||
continue;
|
||||
|
||||
for ( ; (dent = readdir(dirp)) != NULL; )
|
||||
for (; (dent = readdir(dirp)) != NULL;)
|
||||
if (!strcmp(dent->d_name, name)) {
|
||||
strcpy(tmpname, dn);
|
||||
strcat(tmpname, "/");
|
||||
@@ -585,8 +558,7 @@ tapenum(char *name)
|
||||
fprintf(stderr, "Can't stat '%s'.\n", tmpname);
|
||||
continue;
|
||||
}
|
||||
if (!S_ISCHR(statbuf.st_mode) ||
|
||||
major(statbuf.st_rdev) != SCSI_TAPE_MAJOR)
|
||||
if (!S_ISCHR(statbuf.st_mode) || major(statbuf.st_rdev) != SCSI_TAPE_MAJOR)
|
||||
continue;
|
||||
dev = minor(statbuf.st_rdev) & 31;
|
||||
closedir(dirp);
|
||||
@@ -600,20 +572,18 @@ tapenum(char *name)
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
accept_tape_name(char *name)
|
||||
static int accept_tape_name(char *name)
|
||||
{
|
||||
char **npp;
|
||||
|
||||
for (npp=tape_name_bases; *npp; npp++)
|
||||
for (npp = tape_name_bases; *npp; npp++)
|
||||
if (!strncmp(name, *npp, strlen(*npp)))
|
||||
return TRUE;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
find_devfiles(int tapeno, char **names)
|
||||
static int find_devfiles(int tapeno, char **names)
|
||||
{
|
||||
int dev, mode, found;
|
||||
int non_rew[NBR_MODES];
|
||||
@@ -627,21 +597,20 @@ find_devfiles(int tapeno, char **names)
|
||||
static devdir tmpdevdirs[MAX_TAPES + 1];
|
||||
struct stat statbuf;
|
||||
|
||||
for (found=0; found < NBR_MODES; found++) {
|
||||
for (found = 0; found < NBR_MODES; found++) {
|
||||
*names[found] = '\0';
|
||||
non_rew[found] = FALSE;
|
||||
}
|
||||
|
||||
if (dvd == NULL && !stat(DEVFS_PATH, &statbuf)) {
|
||||
if (S_ISDIR(statbuf.st_mode) && (dirp=opendir(DEVFS_PATH)) != NULL) {
|
||||
if (S_ISDIR(statbuf.st_mode) && (dirp = opendir(DEVFS_PATH)) != NULL) {
|
||||
/* Assume devfs, one directory for each tape */
|
||||
for ( ; (dent = readdir(dirp)) != NULL; ) {
|
||||
if (!strcmp (dent->d_name, ".")
|
||||
|| !strcmp (dent->d_name, ".."))
|
||||
for (; (dent = readdir(dirp)) != NULL;) {
|
||||
if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, ".."))
|
||||
continue;
|
||||
snprintf(tmpdevdirs[tmpdevdirsindex].dir,
|
||||
sizeof(tmpdevdirs[tmpdevdirsindex].dir),
|
||||
"%s/%s", DEVFS_PATH, dent->d_name);
|
||||
sizeof(tmpdevdirs[tmpdevdirsindex].dir), "%s/%s",
|
||||
DEVFS_PATH, dent->d_name);
|
||||
tmpdevdirs[tmpdevdirsindex].selective_scan = FALSE;
|
||||
if (++tmpdevdirsindex == MAX_TAPES)
|
||||
break;
|
||||
@@ -654,13 +623,13 @@ find_devfiles(int tapeno, char **names)
|
||||
if (dvd == NULL)
|
||||
dvd = devdirs;
|
||||
|
||||
for (found=0, dvp=dvd; found < NBR_MODES && dvp->dir[0] != 0; dvp++) {
|
||||
for (found = 0, dvp = dvd; found < NBR_MODES && dvp->dir[0] != 0; dvp++) {
|
||||
dn = dvp->dir;
|
||||
if ((dirp = opendir(dn)) == NULL)
|
||||
continue;
|
||||
|
||||
for ( ; (dent = readdir(dirp)) != NULL; ) {
|
||||
if (!strcmp (dent->d_name, ".") || !strcmp (dent->d_name, ".."))
|
||||
for (; (dent = readdir(dirp)) != NULL;) {
|
||||
if (!strcmp(dent->d_name, ".") || !strcmp(dent->d_name, ".."))
|
||||
continue;
|
||||
/* Ignore non-tape devices to avoid loading all the modules */
|
||||
if (dvp->selective_scan && !accept_tape_name(dent->d_name))
|
||||
@@ -672,8 +641,7 @@ find_devfiles(int tapeno, char **names)
|
||||
fprintf(stderr, "Can't stat '%s'.\n", tmpname);
|
||||
continue;
|
||||
}
|
||||
if (!S_ISCHR(statbuf.st_mode) || major(statbuf.st_rdev) !=
|
||||
SCSI_TAPE_MAJOR)
|
||||
if (!S_ISCHR(statbuf.st_mode) || major(statbuf.st_rdev) != SCSI_TAPE_MAJOR)
|
||||
continue;
|
||||
dev = minor(statbuf.st_rdev);
|
||||
if ((dev & 31) != tapeno)
|
||||
@@ -693,14 +661,13 @@ find_devfiles(int tapeno, char **names)
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
set_defs(devdef_tr *defs, char **fnames)
|
||||
static int set_defs(devdef_tr *defs, char **fnames)
|
||||
{
|
||||
int i, tape;
|
||||
int clear_set[2];
|
||||
struct mtop op;
|
||||
|
||||
for (i=0; i < NBR_MODES; i++) {
|
||||
for (i = 0; i < NBR_MODES; i++) {
|
||||
if (*fnames[i] == '\0' || !defs->modedefs[i].defined)
|
||||
continue;
|
||||
|
||||
@@ -721,8 +688,7 @@ set_defs(devdef_tr *defs, char **fnames)
|
||||
op.mt_op = MTSETDRVBUFFER;
|
||||
op.mt_count = MT_ST_DEF_DRVBUFFER | defs->drive_buffering;
|
||||
if (ioctl(tape, MTIOCTOP, &op) != 0) {
|
||||
fprintf(stderr, "Can't set drive buffering to %d.\n",
|
||||
defs->drive_buffering);
|
||||
fprintf(stderr, "Can't set drive buffering to %d.\n", defs->drive_buffering);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -730,8 +696,7 @@ set_defs(devdef_tr *defs, char **fnames)
|
||||
op.mt_op = MTSETDRVBUFFER;
|
||||
op.mt_count = MT_ST_SET_TIMEOUT | defs->timeout;
|
||||
if (ioctl(tape, MTIOCTOP, &op) != 0) {
|
||||
fprintf(stderr, "Can't set device timeout %d s.\n",
|
||||
defs->timeout);
|
||||
fprintf(stderr, "Can't set device timeout %d s.\n", defs->timeout);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -739,8 +704,7 @@ set_defs(devdef_tr *defs, char **fnames)
|
||||
op.mt_op = MTSETDRVBUFFER;
|
||||
op.mt_count = MT_ST_SET_LONG_TIMEOUT | defs->long_timeout;
|
||||
if (ioctl(tape, MTIOCTOP, &op) != 0) {
|
||||
fprintf(stderr, "Can't set device long timeout %d s.\n",
|
||||
defs->long_timeout);
|
||||
fprintf(stderr, "Can't set device long timeout %d s.\n", defs->long_timeout);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -748,8 +712,8 @@ set_defs(devdef_tr *defs, char **fnames)
|
||||
op.mt_op = MTSETDRVBUFFER;
|
||||
op.mt_count = MT_ST_SET_CLN | defs->cleaning;
|
||||
if (ioctl(tape, MTIOCTOP, &op) != 0) {
|
||||
fprintf(stderr, "Can't set cleaning request parameter to %x\n",
|
||||
defs->cleaning);
|
||||
fprintf(stderr,
|
||||
"Can't set cleaning request parameter to %x\n", defs->cleaning);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -789,14 +753,16 @@ set_defs(devdef_tr *defs, char **fnames)
|
||||
if (clear_set[0] != 0) {
|
||||
op.mt_count = MT_ST_CLEARBOOLEANS | clear_set[0];
|
||||
if (ioctl(tape, MTIOCTOP, &op) != 0) {
|
||||
fprintf(stderr, "Can't clear the tape options (bits 0x%x, mode %d).\n",
|
||||
fprintf(stderr,
|
||||
"Can't clear the tape options (bits 0x%x, mode %d).\n",
|
||||
clear_set[0], i);
|
||||
}
|
||||
}
|
||||
if (clear_set[1] != 0) {
|
||||
op.mt_count = MT_ST_SETBOOLEANS | clear_set[1];
|
||||
if (ioctl(tape, MTIOCTOP, &op) != 0) {
|
||||
fprintf(stderr, "Can't set the tape options (bits 0x%x, mode %d).\n",
|
||||
fprintf(stderr,
|
||||
"Can't set the tape options (bits 0x%x, mode %d).\n",
|
||||
clear_set[1], i);
|
||||
}
|
||||
}
|
||||
@@ -829,8 +795,7 @@ set_defs(devdef_tr *defs, char **fnames)
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
define_tape(int tapeno, FILE *dbf, devdef_tr *defptr, int print_non_found)
|
||||
static int define_tape(int tapeno, FILE *dbf, devdef_tr *defptr, int print_non_found)
|
||||
{
|
||||
int i;
|
||||
char company[10], product[20], rev[5], *tname, *fnames[NBR_MODES];
|
||||
@@ -842,19 +807,17 @@ define_tape(int tapeno, FILE *dbf, devdef_tr *defptr, int print_non_found)
|
||||
fprintf(stderr, "Can't allocate name buffers.\n");
|
||||
return FALSE;
|
||||
}
|
||||
for (i=1; i < NBR_MODES; i++)
|
||||
fnames[i] = fnames[i-1] + PATH_MAX;
|
||||
for (i = 1; i < NBR_MODES; i++)
|
||||
fnames[i] = fnames[i - 1] + PATH_MAX;
|
||||
|
||||
if (!find_devfiles(tapeno, fnames) ||
|
||||
*fnames[0] == '\0') {
|
||||
if (!find_devfiles(tapeno, fnames) || *fnames[0] == '\0') {
|
||||
if (print_non_found)
|
||||
fprintf(stderr, "Can't find any device files for tape %d.\n",
|
||||
tapeno);
|
||||
fprintf(stderr, "Can't find any device files for tape %d.\n", tapeno);
|
||||
free(fnames[0]);
|
||||
return FALSE;
|
||||
}
|
||||
if (verbose > 1)
|
||||
for (i=0; i < NBR_MODES; i++)
|
||||
for (i = 0; i < NBR_MODES; i++)
|
||||
printf("Mode %d, name '%s'\n", i + 1, fnames[i]);
|
||||
|
||||
tname = fnames[0];
|
||||
@@ -863,7 +826,8 @@ define_tape(int tapeno, FILE *dbf, devdef_tr *defptr, int print_non_found)
|
||||
return FALSE;
|
||||
}
|
||||
if (verbose > 0)
|
||||
printf("The manufacturer is '%s', product is '%s', and revision '%s'.\n",
|
||||
printf(
|
||||
"The manufacturer is '%s', product is '%s', and revision '%s'.\n",
|
||||
company, product, rev);
|
||||
|
||||
if (!find_pars(dbf, company, product, rev, defptr, FALSE)) {
|
||||
@@ -882,17 +846,15 @@ define_tape(int tapeno, FILE *dbf, devdef_tr *defptr, int print_non_found)
|
||||
}
|
||||
|
||||
|
||||
static char
|
||||
usage(int retval)
|
||||
static char usage(int retval)
|
||||
{
|
||||
fprintf(stderr,
|
||||
"Usage: stinit [-h] [-v] [--version] [-f dbname] [-p] [-r] [drivename_or_number ...]\n");
|
||||
fprintf(stderr, "Usage: stinit [-h] [-v] [--version] [-f dbname] [-p] [-r] "
|
||||
"[drivename_or_number ...]\n");
|
||||
exit(retval);
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
main(int argc, char **argv)
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
FILE *dbf = NULL;
|
||||
int argn;
|
||||
@@ -901,7 +863,7 @@ main(int argc, char **argv)
|
||||
devdef_tr defs;
|
||||
|
||||
defs.do_rewind = FALSE;
|
||||
for (argn=1; argn < argc && *argv[argn] == '-'; argn++) {
|
||||
for (argn = 1; argn < argc && *argv[argn] == '-'; argn++) {
|
||||
if (*(argv[argn] + 1) == 'v')
|
||||
verbose++;
|
||||
else if (*(argv[argn] + 1) == 'p')
|
||||
@@ -915,14 +877,11 @@ main(int argc, char **argv)
|
||||
if (argn >= argc)
|
||||
usage(1);
|
||||
dbname = argv[argn];
|
||||
}
|
||||
else if (*(argv[argn] + 1) == '-' &&
|
||||
*(argv[argn] + 2) == 'v') {
|
||||
} else if (*(argv[argn] + 1) == '-' && *(argv[argn] + 2) == 'v') {
|
||||
printf("stinit v. %s\n", VERSION);
|
||||
exit(0);
|
||||
break;
|
||||
}
|
||||
else
|
||||
} else
|
||||
usage(1);
|
||||
}
|
||||
|
||||
@@ -938,27 +897,24 @@ main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if (argc > argn) { /* Initialize specific drives */
|
||||
for ( ; argn < argc; argn++) {
|
||||
for (; argn < argc; argn++) {
|
||||
if (*argv[argn] == '-') {
|
||||
usage(1);
|
||||
return 1; /* Never executed but makes gcc happy */
|
||||
}
|
||||
else if (isdigit(*argv[argn]))
|
||||
} else if (isdigit(*argv[argn]))
|
||||
tapeno = strtol(argv[argn], NULL, 0);
|
||||
else if ((tapeno = tapenum(argv[argn])) < 0) {
|
||||
fprintf(stderr, "Can't find tape number for name '%s'.\n",
|
||||
argv[argn]);
|
||||
fprintf(stderr, "Can't find tape number for name '%s'.\n", argv[argn]);
|
||||
continue;
|
||||
}
|
||||
if (!define_tape(tapeno, dbf, &defs, TRUE))
|
||||
fprintf(stderr, "Definition for '%s' failed.\n", argv[argn]);
|
||||
}
|
||||
}
|
||||
else { /* Initialize all SCSI tapes */
|
||||
for (tapeno=0; tapeno < MAX_TAPES; tapeno++)
|
||||
} else { /* Initialize all SCSI tapes */
|
||||
for (tapeno = 0; tapeno < MAX_TAPES; tapeno++)
|
||||
if (!define_tape(tapeno, dbf, &defs, FALSE)) {
|
||||
fprintf(stderr, "Initialized %d tape device%s.\n",
|
||||
tapeno, (tapeno != 1 ? "s" : ""));
|
||||
fprintf(stderr, "Initialized %d tape device%s.\n", tapeno,
|
||||
(tapeno != 1 ? "s" : ""));
|
||||
return 0; /* Process tapes until failure */
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user