TAPE: Report file access errors when attaching in-memory ANSI tapes
This commit is contained in:
parent
9fc982242c
commit
318b0e32bb
1 changed files with 38 additions and 10 deletions
48
sim_tape.c
48
sim_tape.c
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue