TAPE: Report file access errors when attaching in-memory ANSI tapes

This commit is contained in:
Mark Pizzolato 2019-11-16 00:39:01 -08:00
parent 9fc982242c
commit 318b0e32bb

View file

@ -598,6 +598,16 @@ if (MT_GET_FMT (uptr) < MTUF_F_ANSI)
fflush (uptr->fileref); fflush (uptr->fileref);
} }
static const char *_sim_tape_format_name (UNIT *uptr)
{
int32 f = MT_GET_FMT (uptr);
if (f == MTUF_F_ANSI)
return ansi_args[MT_GET_ANSI_TYP (uptr)].name;
else
return fmts[f].name;
}
/* Attach tape unit */ /* Attach tape unit */
t_stat sim_tape_attach (UNIT *uptr, CONST char *cptr) t_stat sim_tape_attach (UNIT *uptr, CONST char *cptr)
@ -662,6 +672,7 @@ switch (MT_GET_FMT (uptr)) {
if (1) { if (1) {
const char *ocptr = cptr; const char *ocptr = cptr;
char label[CBUFSIZE] = "simh"; char label[CBUFSIZE] = "simh";
int file_errors = 0;
if ((MT_GET_ANSI_TYP (uptr) == MTAT_F_RT11) || if ((MT_GET_ANSI_TYP (uptr) == MTAT_F_RT11) ||
(MT_GET_ANSI_TYP (uptr) == MTAT_F_RSX11) || (MT_GET_ANSI_TYP (uptr) == MTAT_F_RSX11) ||
@ -678,10 +689,16 @@ switch (MT_GET_FMT (uptr)) {
if (!uptr->fileref) if (!uptr->fileref)
return SCPE_MEM; return SCPE_MEM;
while (*cptr != 0) { /* do all mods */ while (*cptr != 0) { /* do all mods */
uint32 initial_file_count = tape->file_count;
cptr = get_glyph_nc (cptr, gbuf, ','); /* get filename */ cptr = get_glyph_nc (cptr, gbuf, ','); /* get filename */
sim_dir_scan (gbuf, sim_tape_add_ansi_entry, tape); r = sim_dir_scan (gbuf, sim_tape_add_ansi_entry, tape);
if (r != SCPE_OK)
sim_messagef (SCPE_ARG, "file not found: %s\n", gbuf);
if (tape->file_count == initial_file_count)
++file_errors;
} }
if (tape->file_count > 0) { if ((tape->file_count > 0) && (file_errors == 0)) {
r = SCPE_OK; r = SCPE_OK;
memory_tape_add_block (tape, NULL, 0); /* Tape Mark */ memory_tape_add_block (tape, NULL, 0); /* Tape Mark */
uptr->flags |= UNIT_ATT; uptr->flags |= UNIT_ATT;
@ -693,6 +710,7 @@ switch (MT_GET_FMT (uptr)) {
r = SCPE_ARG; r = SCPE_ARG;
memory_free_tape (uptr->fileref); memory_free_tape (uptr->fileref);
uptr->fileref = NULL; uptr->fileref = NULL;
cptr = ocptr;
} }
} }
break; break;
@ -798,11 +816,12 @@ switch (MT_GET_FMT (uptr)) {
break; break;
} }
if (r != SCPE_OK) { /* error? */ if (r != SCPE_OK) { /* error? */
r = sim_messagef (r, "Can't open %s format tape image: %s\n", _sim_tape_format_name (uptr), cptr);
if (auto_format) /* format was specified at attach time? */ if (auto_format) /* format was specified at attach time? */
sim_tape_set_fmt (uptr, 0, "SIMH", NULL); /* restore default format */ sim_tape_set_fmt (uptr, 0, "SIMH", NULL); /* restore default format */
uptr->recsize = 0; uptr->recsize = 0;
uptr->tape_eom = 0; uptr->tape_eom = 0;
return sim_messagef (r, "Can't open tape image: %s\n", cptr); return r;
} }
if ((sim_switches & SWMASK ('D')) && !had_debug) { if ((sim_switches & SWMASK ('D')) && !had_debug) {
@ -3220,12 +3239,7 @@ return sim_messagef (SCPE_ARG, "Unknown tape format: %s\n", cptr);
t_stat sim_tape_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc) t_stat sim_tape_show_fmt (FILE *st, UNIT *uptr, int32 val, CONST void *desc)
{ {
int32 f = MT_GET_FMT (uptr); fprintf (st, "%s format", _sim_tape_format_name (uptr));
if (f == MTUF_F_ANSI)
fprintf (st, "%s format", ansi_args[MT_GET_ANSI_TYP (uptr)].name);
else
fprintf (st, "%s format", fmts[f].name);
return SCPE_OK; return SCPE_OK;
} }
@ -4387,6 +4401,7 @@ return tape;
static int ansi_add_file_to_tape (MEMORY_TAPE *tape, const char *filename) static int ansi_add_file_to_tape (MEMORY_TAPE *tape, const char *filename)
{ {
FILE *f; FILE *f;
struct stat statb;
struct ansi_tape_parameters *ansi = &ansi_args[tape->ansi_type]; struct ansi_tape_parameters *ansi = &ansi_args[tape->ansi_type];
uint8 *block = NULL; uint8 *block = NULL;
size_t max_record_size; size_t max_record_size;
@ -4401,9 +4416,22 @@ HDR2 hdr2;
HDR3 hdr3; HDR3 hdr3;
HDR4 hdr4; HDR4 hdr4;
memset (&statb, 0, sizeof (statb));
if (stat (filename, &statb)) {
sim_printf ("Can't stat: %s\n", filename);
return -1;
}
if (S_IFDIR & statb.st_mode) {
sim_printf ("Can't put a directory on tape: %s\n", filename);
return -1;
}
if (!(S_IFREG & statb.st_mode)) {
sim_printf ("Can't put a non regular file on tape: %s\n", filename);
return -1;
}
f = fopen (filename, "rb"); f = fopen (filename, "rb");
if (f == NULL) { if (f == NULL) {
fprintf (stderr, "Can't open: %s - %s\n", filename, strerror(errno)); sim_printf ("Can't open: %s - %s\n", filename, strerror(errno));
return errno; return errno;
} }
tape_classify_file_contents (f, &max_record_size, &lf_line_endings, &crlf_line_endings); tape_classify_file_contents (f, &max_record_size, &lf_line_endings, &crlf_line_endings);