From 461f2ea513111dcc97760970a7e3af68004b5400 Mon Sep 17 00:00:00 2001 From: Mark Pizzolato Date: Mon, 8 Jul 2019 00:38:08 -0700 Subject: [PATCH] SCP: Add MKDIR and RMDIR commands --- scp.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ scp.h | 2 ++ 2 files changed, 65 insertions(+) diff --git a/scp.c b/scp.c index 6552a5d6..29aa54f3 100644 --- a/scp.c +++ b/scp.c @@ -1186,6 +1186,14 @@ static const char simh_help[] = #define HLP_CP "*Commands Copying_Files CP" "3CP\n" "++CP sfile dfile copies a file\n" + "2Creating Directories\n" +#define HLP_MKDIR "*Commands Creating_Directories MKDIR" + "3MKDIR\n" + "++MKDIR path creates a directory\n" + "2Deleting Directories\n" +#define HLP_RMDIR "*Commands Deleting_Directories RMDIR" + "3RMDIR\n" + "++RMDIR path deleting a directory\n" #define HLP_SET "*Commands SET" "2SET\n" /***************** 80 character line width template *************************/ @@ -2334,6 +2342,8 @@ 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 }, + { "MKDIR", &mkdir_cmd, 0, HLP_MKDIR, NULL, NULL }, + { "RMDIR", &rmdir_cmd, 0, HLP_RMDIR, NULL, NULL }, { "SET", &set_cmd, 0, HLP_SET, NULL, NULL }, { "SHOW", &show_cmd, 0, HLP_SHOW, NULL, NULL }, { "DO", &do_cmd, 1, HLP_DO, NULL, NULL }, @@ -6548,6 +6558,59 @@ if ((stat == SCPE_OK) && (copy_state.count)) return copy_state.stat; } +t_stat mkdir_cmd (int32 flg, CONST char *cptr) +{ +char path[CBUFSIZE]; +char *c; +struct stat filestat; + +if ((!cptr) || (*cptr == '\0')) + return sim_messagef (SCPE_2FARG, "Must specify a directory path\n"); +strlcpy (path, cptr, sizeof (path)); +while ((c = strchr (path, '\\'))) + *c = '/'; +c = path; +while ((c = strchr (c, '/'))) { + *c = '\0'; + if (!stat (path, &filestat)) { + if (filestat.st_mode & S_IFDIR) { + *c = '/'; /* restore / */ + ++c; + continue; + } + return sim_messagef (SCPE_ARG, "%s is not a directory\n", path); + } + if ( +#if defined(_MSC_VER) + mkdir (path) +#else + mkdir (path, 0777) +#endif + ) + return sim_messagef (SCPE_ARG, "Can't create directory: %s - %s\n", path, strerror (errno)); + *c = '/'; /* restore / */ + ++c; + } +if ( +#if defined(_MSC_VER) + mkdir (path) +#else + mkdir (path, 0777) +#endif + ) + return sim_messagef (SCPE_ARG, "Can't create directory: %s - %s\n", path, strerror (errno)); +return SCPE_OK; +} + +t_stat rmdir_cmd (int32 flg, CONST char *cptr) +{ +if ((!cptr) || (*cptr == '\0')) + return sim_messagef (SCPE_2FARG, "Must specify a directory\n"); +if (rmdir (cptr)) + return sim_messagef (SCPE_ARG, "Can't remove directory: %s - %s\n", cptr, strerror (errno)); +return SCPE_OK; +} + /* Debug command */ t_stat debug_cmd (int32 flg, CONST char *cptr) diff --git a/scp.h b/scp.h index c335e8a8..b2966d10 100644 --- a/scp.h +++ b/scp.h @@ -95,6 +95,8 @@ 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 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); t_stat do_cmd (int32 flag, CONST char *ptr); t_stat goto_cmd (int32 flag, CONST char *ptr);