From eabba4ca204e3d60c0442390fd29fa77183af47d Mon Sep 17 00:00:00 2001 From: anjiahao Date: Thu, 24 Feb 2022 15:04:58 +0800 Subject: [PATCH] cmd_mkdir:support mkdir opthon -p use "mkdir -p /test/test" to ceate a dir Signed-off-by: anjiahao --- nshlib/nsh_command.c | 2 +- nshlib/nsh_fscmds.c | 50 +++++++++++++++++++++++++++++++++++++++----- 2 files changed, 46 insertions(+), 6 deletions(-) diff --git a/nshlib/nsh_command.c b/nshlib/nsh_command.c index e5e2fed4d..a78190d6b 100644 --- a/nshlib/nsh_command.c +++ b/nshlib/nsh_command.c @@ -312,7 +312,7 @@ static const struct cmdmap_s g_cmdmap[] = #ifdef NSH_HAVE_DIROPTS # ifndef CONFIG_NSH_DISABLE_MKDIR - { "mkdir", cmd_mkdir, 2, 2, "" }, + { "mkdir", cmd_mkdir, 2, 3, "[-p] " }, # endif #endif diff --git a/nshlib/nsh_fscmds.c b/nshlib/nsh_fscmds.c index df122168b..1d5dbd39e 100644 --- a/nshlib/nsh_fscmds.c +++ b/nshlib/nsh_fscmds.c @@ -1215,16 +1215,56 @@ int cmd_ls(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) #ifndef CONFIG_NSH_DISABLE_MKDIR int cmd_mkdir(FAR struct nsh_vtbl_s *vtbl, int argc, char **argv) { - FAR char *fullpath = nsh_getfullpath(vtbl, argv[1]); + FAR char *fullpath = NULL; + bool parent = false; int ret = ERROR; + int option; + + while ((option = getopt(argc, argv, "p")) != ERROR) + { + switch (option) + { + case 'p': + parent = true; + break; + } + } + + if (optind < argc) + { + fullpath = nsh_getfullpath(vtbl, argv[optind]); + } if (fullpath != NULL) { - ret = mkdir(fullpath, 0777); - if (ret < 0) + char *slash = parent ? fullpath : ""; + + for (; ; ) { - nsh_error(vtbl, g_fmtcmdfailed, argv[0], "mkdir", NSH_ERRNO); - } + slash = strstr(slash, "/"); + if (slash != NULL) + { + *slash = '\0'; + } + + ret = mkdir(fullpath, 0777); + + if (ret < 0 && (errno != EEXIST || !parent)) + { + nsh_error(vtbl, g_fmtcmdfailed, + fullpath, "mkdir", NSH_ERRNO); + break; + } + + if (slash != NULL) + { + *slash++ = '/'; + } + else + { + break; + } + } nsh_freefullpath(fullpath); }