#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) */
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)
{
{
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;
}
FRESULT res;
char *buf;
+ cmdname = argv[0];
+
buf = (char *) malloc(BUFFER_SIZE);
if (buf == NULL) {
printf_P(PSTR("pwd: Out of Memory!\n"));
char *arg;
FRESULT res = 0;
+ cmdname = argv[0];
+
if (argc < 2) {
arg = getenv_str(PSTR(ENV_HOME));
if (arg == NULL) {
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 : "<NULL>", pattern ? pattern : "<NULL>");
+ 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 : "<NULL>", pattern ? pattern : "<NULL>");
+
+ 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;
}
unsigned int s1, s2;
FRESULT res;
+ cmdname = argv[0];
+
+
path_init();
if (argc > 1)
if (!path_set(&from, argv[1])) {
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 */
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);
}
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);
/******************************************************************************/
-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)
{
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 */
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];
}
}
#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".
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;
}
char *old_to;
+ cmdname = argv[0];
uint8_t tflags = 0;
command_ret = CMD_RET_SUCCESS;
#endif
-
-
-
-
/******************************************************************************/
/*
"path"
),
CMD_TBL_ITEM(
- tst, 2, CTBL_DBG|CTBL_RPT, do_tst,
+ tst, 3, CTBL_DBG|CTBL_RPT, do_tst,
"FatFS test function",
"path"
),