From 5be93dcbf99b79a75ac1022fa3ae7010e09c84f2 Mon Sep 17 00:00:00 2001 From: Leo C Date: Fri, 18 May 2018 13:07:45 +0200 Subject: [PATCH] add fat commands rm, rmdir, mkdir (WIP) --- avr/cmd_fat.c | 62 +++++++++++++++++++++++++++++++++++++++++++++++ include/command.h | 3 +-- 2 files changed, 63 insertions(+), 2 deletions(-) diff --git a/avr/cmd_fat.c b/avr/cmd_fat.c index 4d3e751..0e7063a 100644 --- a/avr/cmd_fat.c +++ b/avr/cmd_fat.c @@ -396,6 +396,53 @@ void strip_trailing_slash_relpath(char *p) } #endif +command_ret_t do_rm(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) +{ + DIR Dir; /* Directory object */ + FILINFO Finfo; + FRESULT res; + + if (argc < 2) + err("missing operand"); + + for (int i = 1; i < argc; i++) { + if (!path_set(&from, argv[1])) { + /* TODO: error out*/ + } + char *pattern = path_basename_pattern(&from); + + //debug_rm("==== path: '%s', pattern: '%s'\n", from.p_path ? from.p_path : "", pattern ? pattern : ""); + + res = f_findfirst(&Dir, &Finfo, from.p_path, pattern); + while (res == FR_OK && Finfo.fname[0]) { + if (!(Finfo.fattrib & AM_DIR)) { + if ((res = f_unlink(Finfo.fname)) != FR_OK) { + put_rc(res); + break; + } + } + res = f_findnext(&Dir, &Finfo); + } + f_closedir(&Dir); + } + + if (res) { + put_rc(res); + return CMD_RET_FAILURE; + } + + return CMD_RET_SUCCESS; +} + +command_ret_t do_rmdir(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) +{ +} + +command_ret_t do_mkdir(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) +{ +} + + int print_dirent(FILINFO *f) { return printf_P(PSTR("%c%c%c%c%c %u/%02u/%02u %02u:%02u %9lu %s\n"), @@ -1217,6 +1264,21 @@ CMD_TBL_ITEM( "Change the current/working directory.", "path" ), +CMD_TBL_ITEM( + rm, CONFIG_SYS_MAXARGS, 0, do_rm, + "Remove FILE(s)", + "[OPTION]... [FILE]..." +), +CMD_TBL_ITEM( + rmdir, CONFIG_SYS_MAXARGS, 0, do_rmdir, + "Remove the DIRECTORY(ies), if they are empty", + "[OPTION]... DIRECTORY..." +), +CMD_TBL_ITEM( + mkdir, CONFIG_SYS_MAXARGS, 0, do_mkdir, + "Create the DIRECTORY(ies), if they do not already exist.", + "[OPTION]... DIRECTORY..." +), CMD_TBL_ITEM( ls, 2, CTBL_RPT, do_ls, "Directory listing", diff --git a/include/command.h b/include/command.h index d7eccc9..54c0472 100644 --- a/include/command.h +++ b/include/command.h @@ -50,13 +50,12 @@ struct cmd_tbl_s { uint8_t maxargs; /* maximum number of arguments */ uint8_t flags; /* autorepeat allowed? */ /* Implementation function */ - command_ret_t (*cmd)(const FLASH struct cmd_tbl_s *, uint_fast8_t, int, char * const []); + command_ret_t (*cmd)(cmd_tbl_t *, uint_fast8_t, int, char * const []); const FLASH char *usage; /* Usage message (short) */ #ifdef CONFIG_SYS_LONGHELP const FLASH char *help; /* Help message (long) */ #endif cmd_tbl_t *subcmd; -// const FLASH struct cmd_tbl_s *subcommands; #ifdef CONFIG_AUTO_COMPLETE /* do auto completion on the arguments */ int (*complete)(int argc, char * const argv[], char last_char, int maxv, char *cmdv[]); -- 2.39.2