From 0dd441e803f3563839541e7526f8294032aa7743 Mon Sep 17 00:00:00 2001 From: Leo C Date: Thu, 24 May 2018 04:22:55 +0200 Subject: [PATCH] some cleanup, more debugging --- avr/cmd_fat.c | 242 ++++++++++++++++++++++---------------------------- 1 file changed, 105 insertions(+), 137 deletions(-) diff --git a/avr/cmd_fat.c b/avr/cmd_fat.c index 0e7063a..a44de41 100644 --- a/avr/cmd_fat.c +++ b/avr/cmd_fat.c @@ -25,11 +25,15 @@ #define DEBUG_CP 1 /* set to 1 to debug */ #define DEBUG_LS 1 /* set to 1 to debug */ +#define DEBUG_RM 1 /* set to 1 to debug */ #define debug_cp(fmt, args...) \ debug_cond(DEBUG_CP, fmt, ##args) #define debug_ls(fmt, args...) \ debug_cond(DEBUG_LS, fmt, ##args) +#define debug_rm(fmt, args...) \ + debug_cond(DEBUG_RM, fmt, ##args) + /* TODO: use memory size test function (detect_ramsize() in cmd_loadihex.c) */ @@ -56,6 +60,17 @@ int blockbuf_size; PATH_T from; PATH_T to; command_ret_t command_ret; +char *cmdname; + +static uint8_t flags; +#define F_FLAG (1<<3) // overwrite existing file ignoring write protection +#define I_FLAG (1<<1) // prompt before overwrite (overrides a previous -n option) +#define N_FLAG (1<<2) // do not overwrite an existing file (overrides a previous -i option) +#define P_FLAG (1<<4) // preserve attributes and timestamps +#define R_FLAG (1<<0) // copy directories recursively +#define V_FLAG (1<<5) // explain what is being done + + void setup_fatfs(void) { @@ -154,10 +169,10 @@ void err(const char *fmt, ...) { va_list ap; va_start(ap, fmt); -// (void)fprintf(stderr, "%s: ", progname); - (void)vfprintf_P(stdout, fmt, ap); + printf_P(PSTR("fat %s: "), cmdname); + vfprintf_P(stdout, fmt, ap); va_end(ap); - (void)printf_P(PSTR("\n")); + printf_P(PSTR("\n")); _delay_ms(20); command_ret = CMD_RET_FAILURE; } @@ -317,6 +332,8 @@ command_ret_t do_pwd(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc FRESULT res; char *buf; + cmdname = argv[0]; + buf = (char *) malloc(BUFFER_SIZE); if (buf == NULL) { printf_P(PSTR("pwd: Out of Memory!\n")); @@ -347,6 +364,8 @@ command_ret_t do_cd(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char *arg; FRESULT res = 0; + cmdname = argv[0]; + if (argc < 2) { arg = getenv_str(PSTR(ENV_HOME)); if (arg == NULL) { @@ -402,44 +421,86 @@ command_ret_t do_rm(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, FILINFO Finfo; FRESULT res; - if (argc < 2) - err("missing operand"); + cmdname = argv[0]; - for (int i = 1; i < argc; i++) { - if (!path_set(&from, argv[1])) { - /* TODO: error out*/ - } - char *pattern = path_basename_pattern(&from); + /* reset getopt() */ + optind = 0; + flags = 0; - //debug_rm("==== path: '%s', pattern: '%s'\n", from.p_path ? from.p_path : "", pattern ? pattern : ""); + int opt; + while ((opt = getopt(argc, argv, PSTR("nv"))) != -1) { + switch (opt) { + case 'n': + flags |= N_FLAG; + break; + case 'v': + flags |= V_FLAG; + break; + default: + return CMD_RET_USAGE; + break; + } + } + argc -= optind; + argv += optind; - 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; + command_ret = CMD_RET_SUCCESS; + if (argc < 1) { + err(PSTR("missing operand")); + } else { + for (int i = 0; i < argc; i++) { + if (!path_set(&from, argv[i])) { + /* 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); + debug_rm("==== findfirst %d\n", res); + while (res == FR_OK && Finfo.fname[0]) { + if (Finfo.fattrib & AM_DIR) { + err(PSTR("cannot remove '%s': Is a directory"), Finfo.fname); + } else { + if (!(flags & N_FLAG)) { + if ((res = f_unlink(Finfo.fname)) == FR_OK) { + if (flags & V_FLAG) + printf_P(PSTR("removed '%s'\n"), Finfo.fname); + } else { + err(PSTR("cannot remove '%s': Read only?"), Finfo.fname); + put_rc(res); + } + } else { + printf_P(PSTR("not removed '%s'\n"), Finfo.fname); + } } + res = f_findnext(&Dir, &Finfo); + debug_rm("==== findnext %d\n", res); } - res = f_findnext(&Dir, &Finfo); + f_closedir(&Dir); } - f_closedir(&Dir); - } - if (res) { - put_rc(res); - return CMD_RET_FAILURE; + /* TODO */ + if (res) { + put_rc(res); + return CMD_RET_FAILURE; + } } - - return CMD_RET_SUCCESS; + return command_ret; } command_ret_t do_rmdir(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { + cmdname = argv[0]; + + return CMD_RET_SUCCESS; } command_ret_t do_mkdir(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char * const argv[]) { + cmdname = argv[0]; + + return CMD_RET_SUCCESS; } @@ -469,6 +530,9 @@ command_ret_t do_ls(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, unsigned int s1, s2; FRESULT res; + cmdname = argv[0]; + + path_init(); if (argc > 1) if (!path_set(&from, argv[1])) { @@ -517,14 +581,14 @@ command_ret_t do_tst(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc DIR Dir; /* Directory object */ FILINFO Finfo; FRESULT res = FR_OK; - char *path; + char *path = ""; + char *pattern = "*"; printf_P(PSTR("sizeof DIR: %u, sizeof FIL: %u\n"), sizeof (DIR), sizeof (FILINFO)); char * buf = (char *) malloc(BUFFER_SIZE); if (buf == NULL) { printf_P(PSTR("tst: Out of Memory!\n")); - free(buf); return CMD_RET_FAILURE; } res = f_getcwd(buf, BUFFER_SIZE); /* Get current directory path */ @@ -540,10 +604,10 @@ command_ret_t do_tst(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc if (argc > 1) path = argv[1]; - else - path = ""; + if (argc > 2) + pattern = argv[2]; - printf_P(PSTR("arg: '%s'\n"), path); + printf_P(PSTR("arg: '%s' '%s'\n"), path, pattern); printf_P(PSTR("==== f_stat: ")); res = f_stat(path, &Finfo); put_rc(res); @@ -552,7 +616,7 @@ command_ret_t do_tst(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc } printf_P(PSTR("==== f_findfirst: ")); - res = f_findfirst(&Dir, &Finfo, path, "*"); /* Start to search for files */ + res = f_findfirst(&Dir, &Finfo, path, pattern); /* Start to search for files */ put_rc(res); if (res == FR_OK) { print_dirent(&Finfo); @@ -569,14 +633,6 @@ command_ret_t do_tst(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc /******************************************************************************/ -static uint8_t flags; -#define F_FLAG (1<<3) // overwrite existing file ignoring write protection -#define I_FLAG (1<<1) // prompt before overwrite (overrides a previous -n option) -#define N_FLAG (1<<2) // do not overwrite an existing file (overrides a previous -i option) -#define P_FLAG (1<<4) // preserve attributes and timestamps -#define R_FLAG (1<<0) // copy directories recursively -#define V_FLAG (1<<5) // explain what is being done - static void setfile(FILINFO *fs) { @@ -674,17 +730,6 @@ debug_cp(" from:'%s' to:'%s'\n", from.p_path, to.p_path); static void copy(); -#if 0 -static void copy_dir(void) -{ -debug_cp("==== copy_dir()"); -debug_cp(" from:'%s' to:'%s'\n", from->p_path, to.p_path); - - printf_P(PSTR("directory copy not supported, ommitting dir '%s'\n"), - from->p_path); - command_ret = CMD_RET_FAILURE; -} -#else static void copy_dir(void) { DIR Dir; /* Directory object */ @@ -696,6 +741,13 @@ static void copy_dir(void) debug_cp("==== copy_dir(): freemem: %u\n", get_freemem()); debug_cp(" from:'%s' to:'%s'\n", from.p_path, to.p_path); +#if 0 + + printf_P(PSTR("directory copy not supported, ommitting dir '%s'\n"), + from->p_path); + command_ret = CMD_RET_FAILURE; + +#else for (res = f_findfirst(&Dir, &Finfo, from.p_path, pattern); res == FR_OK && Finfo.fname[0]; @@ -726,86 +778,6 @@ debug_cp(" from:'%s' to:'%s'\n", from.p_path, to.p_path); } } #endif -#if 0 -static void copy_dir(void) -{ - FILINFO from_stat; - struct dirent *dp, **dir_list; - int dir_cnt, i; - char *old_from, *old_to; - -debug_cp("==== copy_file(): dne: %u\n", dne, ); -debug_cp(" from:'%s' to:'%s'\n", from->p_path, to.p_path); - - dir_cnt = scandir(from->p_path, &dir_list, NULL, NULL); - if (dir_cnt == -1) { - (void)fprintf(stderr, "%s: can't read directory %s.\n", - progname, from->p_path); - command_ret = CMD_RET_FAILURE; - } - - /* - * Instead of handling directory entries in the order they appear - * on disk, do non-directory files before directory files. - * There are two reasons to do directories last. The first is - * efficiency. Files tend to be in the same cylinder group as - * their parent, whereas directories tend not to be. Copying files - * all at once reduces seeking. Second, deeply nested tree's - * could use up all the file descriptors if we didn't close one - * directory before recursivly starting on the next. - */ - /* copy files */ - for (i = 0; i < dir_cnt; ++i) { - dp = dir_list[i]; - if (dp->d_namlen <= 2 && dp->d_name[0] == '.' - && (dp->d_name[1] == NULL || dp->d_name[1] == '.')) - goto done; - if (!(old_from = - path_append(&from, dp->d_name, (int)dp->d_namlen))) - goto done; - - if (statfcn(from->p_path, &from_stat) < 0) { - err(PSTR("%s: %s"), dp->d_name, strerror(errno)); - path_restore(&from, old_from); - goto done; - } - if (S_ISDIR(from_stat.st_mode)) { - path_restore(&from, old_from); - continue; - } - if (old_to = path_append(&to, dp->d_name, (int)dp->d_namlen)) { - copy(); - path_restore(&to, old_to); - } - path_restore(&from, old_from); -done: dir_list[i] = NULL; - free(dp); - } - - /* copy directories */ - for (i = 0; i < dir_cnt; ++i) { - dp = dir_list[i]; - if (!dp) - continue; - if (!(old_from = - path_append(&from, dp->d_name, (int)dp->d_namlen))) { - free(dp); - continue; - } - if (!(old_to = - path_append(&to, dp->d_name, (int)dp->d_namlen))) { - free(dp); - path_restore(&from, old_from); - continue; - } - copy(); - free(dp); - path_restore(&from, old_from); - path_restore(&to, old_to); - } - free(dir_list); -} -#endif /* * copy file or directory at "from" to "to". @@ -853,8 +825,7 @@ debug_cp(" from:'%s' to:'%s'\n", from.p_path, to.p_path); err(PSTR("%s: %S"), to.p_path, rctostr(fr)); return; } - } - else if (!(to_stat.fattrib & AM_DIR)) { + } else if (!(to_stat.fattrib & AM_DIR)) { (void)printf_P(PSTR("%s: not a directory.\n"), to.p_path); return; } @@ -876,6 +847,7 @@ command_ret_t do_cp(cmd_tbl_t *cmdtp UNUSED, uint_fast8_t flag UNUSED, int argc, char *old_to; + cmdname = argv[0]; uint8_t tflags = 0; command_ret = CMD_RET_SUCCESS; @@ -995,10 +967,6 @@ cleanup: #endif - - - - /******************************************************************************/ /* @@ -1285,7 +1253,7 @@ CMD_TBL_ITEM( "path" ), CMD_TBL_ITEM( - tst, 2, CTBL_DBG|CTBL_RPT, do_tst, + tst, 3, CTBL_DBG|CTBL_RPT, do_tst, "FatFS test function", "path" ), -- 2.39.2