From 6df72b87c0b98f670d6d450fa152ab7095b4fb13 Mon Sep 17 00:00:00 2001 From: Richard Cornwell Date: Sat, 7 Dec 2019 23:51:06 -0500 Subject: [PATCH] SCP: Updated to current. --- scp.c | 35 +++++++++++++++++++++++++++++++++-- scp.h | 1 + sim_disk.c | 2 +- sim_tape.c | 4 +++- 4 files changed, 38 insertions(+), 4 deletions(-) diff --git a/scp.c b/scp.c index 762e7eb..2b073e3 100644 --- a/scp.c +++ b/scp.c @@ -1186,6 +1186,15 @@ static const char simh_help[] = #define HLP_CP "*Commands Copying_Files CP" "3CP\n" "++CP sfile dfile copies a file\n" + "2Renaming Files\n" +#define HLP_RENAME "*Commands Renaming_Files RENAME" + "3RENAME\n" + "++RENAME origname newname renames a file\n" +#define HLP_MOVE "*Commands Renaming_Files MOVE" + "3MOVE\n" + "++MOVE origname newname renames a file\n" + "+or\n" + "++MV origname newname renames a file\n" "2Creating Directories\n" #define HLP_MKDIR "*Commands Creating_Directories MKDIR" "3MKDIR\n" @@ -2344,6 +2353,9 @@ static CTAB cmd_table[] = { { "RM", &delete_cmd, 0, HLP_RM, NULL, NULL }, { "COPY", ©_cmd, 0, HLP_COPY, NULL, NULL }, { "CP", ©_cmd, 0, HLP_CP, NULL, NULL }, + { "RENAME", &rename_cmd, 0, HLP_RENAME, NULL, NULL }, + { "MOVE", &rename_cmd, 0, HLP_MOVE, NULL, NULL }, + { "MV", &rename_cmd, 0, HLP_MOVE, NULL, NULL }, { "MKDIR", &mkdir_cmd, 0, HLP_MKDIR, NULL, NULL }, { "RMDIR", &rmdir_cmd, 0, HLP_RMDIR, NULL, NULL }, { "SET", &set_cmd, 0, HLP_SET, NULL, NULL }, @@ -6574,6 +6586,21 @@ if ((stat == SCPE_OK) && (copy_state.count)) return copy_state.stat; } +t_stat rename_cmd (int32 flg, CONST char *cptr) +{ +char sname[CBUFSIZE], dname[CBUFSIZE]; + +if ((!cptr) || (*cptr == 0)) + return SCPE_2FARG; +cptr = get_glyph_quoted (cptr, sname, 0); +if ((!cptr) || (*cptr == 0)) + return SCPE_2FARG; +cptr = get_glyph_quoted (cptr, dname, 0); +if (0 == rename (sname, dname)) + return SCPE_OK; +return sim_messagef (SCPE_ARG, "Can't rename '%s' to '%s': %s\n\n", sname, dname, strerror (errno)); +} + t_stat mkdir_cmd (int32 flg, CONST char *cptr) { char path[CBUFSIZE]; @@ -7325,8 +7352,10 @@ if (*cptr == 0) /* must be more */ gbuf[sizeof(gbuf)-1] = '\0'; strlcpy (gbuf, cptr, sizeof(gbuf)); sim_trim_endspc (gbuf); -if ((sfile = sim_fopen (gbuf, "wb")) == NULL) - return SCPE_OPENERR; +if ((sfile = sim_fopen (gbuf, "r+b")) == NULL) { /* try existing file */ + if ((sfile = sim_fopen (gbuf, "wb")) == NULL) /* create new empty file */ + return SCPE_OPENERR; + } r = sim_save (sfile); fclose (sfile); return r; @@ -7463,6 +7492,8 @@ for (i = 0; i < (device_count + sim_internal_device_count); i++) {/* loop thru d fputc ('\n', sfile); /* end registers */ } fputc ('\n', sfile); /* end devices */ +if (!ferror (sfile)) + sim_set_fsize (sfile, (t_addr)sim_ftell (sfile)); /* truncate the save file */ return (ferror (sfile))? SCPE_IOERR: SCPE_OK; /* error during save? */ } diff --git a/scp.h b/scp.h index b2966d1..8beaa05 100644 --- a/scp.h +++ b/scp.h @@ -95,6 +95,7 @@ t_stat dir_cmd (int32 flg, CONST char *cptr); t_stat type_cmd (int32 flg, CONST char *cptr); t_stat delete_cmd (int32 flg, CONST char *cptr); t_stat copy_cmd (int32 flg, CONST char *cptr); +t_stat rename_cmd (int32 flg, CONST char *cptr); t_stat mkdir_cmd (int32 flg, CONST char *cptr); t_stat rmdir_cmd (int32 flg, CONST char *cptr); t_stat brk_cmd (int32 flag, CONST char *ptr); diff --git a/sim_disk.c b/sim_disk.c index 1c8a2a2..a66dc1c 100644 --- a/sim_disk.c +++ b/sim_disk.c @@ -1123,7 +1123,7 @@ t_seccnt sects_read; if ((dptr = find_dev_from_unit (uptr)) == NULL) return ret_val; saved_capac = uptr->capac; -uptr->capac = temp_capac; +uptr->capac = (t_addr)temp_capac; if ((sim_disk_rdsect (uptr, 512 / ctx->sector_size, (uint8 *)&Home, §s_read, sizeof (Home) / ctx->sector_size)) || (sects_read != (sizeof (Home) / ctx->sector_size))) goto Return_Cleanup; diff --git a/sim_tape.c b/sim_tape.c index 4a24d1b..21ec102 100644 --- a/sim_tape.c +++ b/sim_tape.c @@ -3274,9 +3274,11 @@ tape_size = (t_addr)sim_fsize (uptr->fileref); sim_debug_unit (MTSE_DBG_STR, uptr, "tpc_map: tape_size: %" T_ADDR_FMT "u\n", tape_size); for (objc = 0, sizec = 0, tpos = 0;; ) { (void)sim_tape_seek (uptr, tpos); - i = sim_fread (&bc, sizeof (t_tpclnt), 1, uptr->fileref); + i = sim_fread (&bc, sizeof (bc), 1, uptr->fileref); if (i == 0) /* past or at eof? */ break; + if (bc > 65535) /* Range check length value to satisfy Coverity */ + break; if (countmap[bc] == 0) sizec++; ++countmap[bc];