static int dfs_uffs_seek(struct dfs_fd* file, rt_off_t offset) { int result; /* set offset as current offset */ if (file->type == FT_DIRECTORY) { uffs_rewinddir((uffs_DIR *)(file->data)); result = uffs_seekdir((uffs_DIR *)(file->data), offset/sizeof(struct dirent)); if (result >= 0) { file->pos = offset; return offset; } } else if (file->type == FT_REGULAR) { result = uffs_seek((int)(file->data), offset, USEEK_SET); if (result >= 0) return offset; } return uffs_result_to_dfs(uffs_get_error()); }
/// dir is the DOS equivalent of ls static byte DirCmd(const unsigned char *cmd, const CLS1_ConstStdIOType *io) { /* precondition: cmd starts with "dir" */ uffs_DIR *curdir = cwd; char d_name[UFFS_PATHSIZE]; byte res = ERR_OK; if (*(cmd + sizeof("dir") - 1) == ' ') { /* space after "dir": read name */ if (UTIL1_ReadEscapedName(cmd + sizeof("dir"), (unsigned char*)d_name, sizeof(d_name), NULL, NULL, NULL) == ERR_OK) { curdir = uffs_opendir(d_name); res = uffs_get_error(); } else { CLS1_SendStr((unsigned char*) "reading directory name failed!\r\n", io->stdErr); res = ERR_FAILED; } } // else use current directory struct uffs_dirent *entry; if (curdir == NULL) { CLS1_SendStr((unsigned char*) "can't open dir\r\n", io->stdErr); res = ERR_FAILED; } uffs_rewinddir(curdir); while ((entry = uffs_readdir(curdir))) { MSGLN( "%s", entry->d_name); } // unless it was cwd close it if (*(cmd + sizeof("dir") - 1) == ' ') uffs_closedir(curdir); return res; }