luat_fs.h 8.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309
  1. /******************************************************************************
  2. * 文件系统操作抽象层
  3. * @author wendal
  4. * @since 0.1.5
  5. *****************************************************************************/
  6. #ifndef LUAT_FS_H
  7. #define LUAT_FS_H
  8. //#include "luat_base.h"
  9. #include "stdio.h"
  10. #ifndef LUAT_WEAK
  11. #define LUAT_WEAK __attribute__((weak))
  12. #endif
  13. /**
  14. * @defgroup luat_fs 文件系统接口
  15. * @{
  16. */
  17. typedef struct luat_fs_conf {
  18. char* busname;
  19. char* type;
  20. char* filesystem;
  21. const char* mount_point;
  22. } luat_fs_conf_t;
  23. typedef struct luat_fs_info
  24. {
  25. char filesystem[8]; // 文件系统类型
  26. unsigned char type; // 连接方式, 片上,spi flash, tf卡等
  27. size_t total_block;
  28. size_t block_used;
  29. size_t block_size;
  30. }luat_fs_info_t;
  31. /**
  32. * @brief 文件系统初始化
  33. * @return int =0成功,其他失败
  34. */
  35. int luat_fs_init(void);
  36. /**
  37. * @brief 文件系统格式化
  38. * @return int =0成功,其他失败
  39. */
  40. int luat_fs_mkfs(luat_fs_conf_t *conf);
  41. /**
  42. * @brief 文件系统挂载
  43. * @return int =0成功,其他失败
  44. */
  45. int luat_fs_mount(luat_fs_conf_t *conf);
  46. /**
  47. * @brief 文件系统取消挂载
  48. * @return int =0成功,其他失败
  49. */
  50. int luat_fs_umount(luat_fs_conf_t *conf);
  51. /**
  52. * @brief 获取文件系统状态
  53. * @param path[IN] 挂载路径, 通常为 /
  54. * @param info[OUT] 文件系统信息
  55. * @return int =0成功,其他失败
  56. */
  57. int luat_fs_info(const char* path, luat_fs_info_t *conf);
  58. /**
  59. * @brief 打开文件,类似于fopen
  60. * @param filename[IN] 文件路径
  61. * @param mode[IN] 打开模式,与posix类型, 例如 "r" "rw" "w" "w+" "a"
  62. * @return FILE* 文件句柄,失败返回NULL
  63. */
  64. FILE* luat_fs_fopen(const char *filename, const char *mode);
  65. /**
  66. * @brief 读到单个字节,类似于getc
  67. * @param stream[IN] 文件句柄
  68. * @return int >=0读取成功返回, -1失败, 例如读取到文件尾部
  69. */
  70. int luat_fs_getc(FILE* stream);
  71. /**
  72. * @brief 设置句柄位置,类似于fseek
  73. * @param stream[IN] 文件句柄
  74. * @param offset[IN] 偏移量
  75. * @param origin[IN] 参考点, 例如 SEEK_SET 绝对坐标, SEEK_END 结尾, SEEK_CUR 当前
  76. * @return int >=0成功,否则失败
  77. */
  78. int luat_fs_fseek(FILE* stream, long int offset, int origin);
  79. /**
  80. * @brief 获取句柄位置,类似于ftell
  81. * @param stream[IN] 文件句柄
  82. * @return int >=0当前位置, 否则失败
  83. */
  84. int luat_fs_ftell(FILE* stream);
  85. /**
  86. * @brief 关闭句柄位置,类似于fclose
  87. * @param stream[IN] 文件句柄
  88. * @return int =0成功,否则失败
  89. */
  90. int luat_fs_fclose(FILE* stream);
  91. /**
  92. * @brief 是否已经到文件结尾,类似于feof
  93. * @param stream[IN] 文件句柄
  94. * @return int =0未到文件尾部,其余为到达文件尾部
  95. */
  96. int luat_fs_feof(FILE* stream);
  97. /**
  98. * @brief 是否有文件系统错误,类似于ferror
  99. * @param stream[IN] 文件句柄
  100. * @return int =0无错误, 其余为错误值
  101. */
  102. int luat_fs_ferror(FILE *stream);
  103. /**
  104. * @brief 读取文件,类似于fread
  105. * @param ptr[OUT] 存放读取数据的缓冲区
  106. * @param size[IN] 单次读取大小
  107. * @param nmemb[IN] 读取次数
  108. * @param stream[IN] 文件句柄
  109. * @return int >=0实际读取的数量,<0出错
  110. */
  111. size_t luat_fs_fread(void *ptr, size_t size, size_t nmemb, FILE *stream);
  112. /**
  113. * @brief 写入文件,类似于fwrite
  114. * @param ptr[OUT] 存放写入数据的缓冲区
  115. * @param size[IN] 单次读取大小
  116. * @param nmemb[IN] 读取次数
  117. * @param stream[IN] 文件句柄
  118. * @return int >=0实际写入的数量,<0出错
  119. */
  120. size_t luat_fs_fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);
  121. int luat_fs_fflush(FILE *stream);
  122. /**
  123. * @brief 删除文件,类似于remove
  124. * @param filename[IN] 文件路径
  125. * @return int =0成功,否则失败
  126. */
  127. int luat_fs_remove(const char *filename);
  128. /**
  129. * @brief 文件改名,类似于rename
  130. * @param old_filename[IN] 原文件路径
  131. * @param new_filename[IN] 新文件路径
  132. * @return int =0成功,否则失败
  133. */
  134. int luat_fs_rename(const char *old_filename, const char *new_filename);
  135. /**
  136. * @brief 文件大小,类似于fsize
  137. * @param filename[IN] 文件路径
  138. * @return int >=0文件大小, 如果文件不存在也是返回0
  139. */
  140. size_t luat_fs_fsize(const char *filename);
  141. /**
  142. * @brief 文件是否存在,类似于fexist
  143. * @param filename[IN] 文件路径
  144. * @return int =0不存在,否则存在
  145. */
  146. int luat_fs_fexist(const char *filename);
  147. /**
  148. * @brief 行读取
  149. * @param buf[OUT] 读取缓冲区
  150. * @param bufsize[IN] 缓冲区大小
  151. * @param stream[IN] 文件句柄
  152. * @return int >=0实际写入的数量,<0出错
  153. */
  154. int luat_fs_readline(char * buf, int bufsize, FILE * stream);
  155. /**
  156. * @brief 获取文件映射地址
  157. * @param stream[IN] 文件句柄
  158. * @return void* 文件地址
  159. */
  160. void* luat_fs_mmap(FILE * stream);
  161. // TODO 文件夹相关的API
  162. //int luat_fs_diropen(char const* _FileName);
  163. typedef struct luat_fs_dirent
  164. {
  165. unsigned char d_type; //0:文件;1:文件夹
  166. char d_name[255];
  167. size_t d_size;
  168. }luat_fs_dirent_t;
  169. /**
  170. * @brief 创建文件夹
  171. * @param _DirName[IN] 文件夹路径
  172. * @return int =0成功,否则失败
  173. */
  174. int luat_fs_mkdir(char const* _DirName);
  175. /**
  176. * @brief 删除文件夹,必须为空文件夹
  177. * @param _DirName[IN] 文件夹路径
  178. * @return int =0成功,否则失败
  179. */
  180. int luat_fs_rmdir(char const* _DirName);
  181. /**
  182. * @brief 遍历文件夹
  183. * @param _DirName[IN] 文件夹路径
  184. * @param ents[OUT] 文件列表,必须已分配内存,且不小于len个元素
  185. * @param offset[IN] 跳过多少个文件
  186. * @param len[IN] 最多读取多少个文件
  187. * @return int =>0读取到文件个数,否则失败
  188. */
  189. int luat_fs_lsdir(char const* _DirName, luat_fs_dirent_t* ents, size_t offset, size_t len);
  190. /**
  191. * @brief 文件截断
  192. * @param filename[IN] 文件名
  193. * @param len[IN] 长度
  194. * @return int =>0读取到文件个数,否则失败
  195. */
  196. int luat_fs_truncate(const char* filename, size_t len);
  197. /**
  198. * @brief 文件夹是否存在
  199. * @param dir[IN] 文件夹名称
  200. * @return int =0不存在,否则存在
  201. */
  202. int luat_fs_dexist(const char *dir);
  203. /** @}*/
  204. #ifdef LUAT_USE_FS_VFS
  205. #ifndef LUAT_VFS_FILESYSTEM_MAX
  206. #define LUAT_VFS_FILESYSTEM_MAX 8
  207. #endif
  208. #ifndef LUAT_VFS_FILESYSTEM_MOUNT_MAX
  209. #define LUAT_VFS_FILESYSTEM_MOUNT_MAX 8
  210. #endif
  211. #ifndef LUAT_VFS_FILESYSTEM_FD_MAX
  212. #define LUAT_VFS_FILESYSTEM_FD_MAX 16
  213. #endif
  214. struct luat_vfs_file_opts {
  215. FILE* (*fopen)(void* fsdata, const char *filename, const char *mode);
  216. int (*getc)(void* fsdata, FILE* stream);
  217. int (*fseek)(void* fsdata, FILE* stream, long int offset, int origin);
  218. int (*ftell)(void* fsdata, FILE* stream);
  219. int (*fclose)(void* fsdata, FILE* stream);
  220. int (*feof)(void* fsdata, FILE* stream);
  221. int (*ferror)(void* fsdata, FILE *stream);
  222. size_t (*fread)(void* fsdata, void *ptr, size_t size, size_t nmemb, FILE *stream);
  223. size_t (*fwrite)(void* fsdata, const void *ptr, size_t size, size_t nmemb, FILE *stream);
  224. void* (*mmap)(void* fsdata, FILE *stream);
  225. int (*fflush)(void* fsdata, FILE *stream);
  226. };
  227. struct luat_vfs_filesystem_opts {
  228. int (*remove)(void* fsdata, const char *filename);
  229. int (*rename)(void* fsdata, const char *old_filename, const char *new_filename);
  230. size_t (*fsize)(void* fsdata, const char *filename);
  231. int (*fexist)(void* fsdata, const char *filename);
  232. int (*mkfs)(void* fsdata, luat_fs_conf_t *conf);
  233. int (*mount)(void** fsdata, luat_fs_conf_t *conf);
  234. int (*umount)(void* fsdata, luat_fs_conf_t *conf);
  235. int (*info)(void* fsdata, const char* path, luat_fs_info_t *conf);
  236. int (*mkdir)(void* fsdata, char const* _DirName);
  237. int (*rmdir)(void* fsdata, char const* _DirName);
  238. int (*lsdir)(void* fsdata, char const* _DirName, luat_fs_dirent_t* ents, size_t offset, size_t len);
  239. int (*truncate)(void* fsdata, char const* _DirName, size_t nsize);
  240. };
  241. typedef struct luat_vfs_filesystem {
  242. char name[16];
  243. struct luat_vfs_filesystem_opts opts;
  244. struct luat_vfs_file_opts fopts;
  245. }luat_vfs_filesystem_t;
  246. typedef struct luat_vfs_mount {
  247. struct luat_vfs_filesystem *fs;
  248. void *userdata;
  249. char prefix[16];
  250. int ok;
  251. } luat_vfs_mount_t;
  252. typedef struct luat_vfs_fd{
  253. FILE* fd;
  254. luat_vfs_mount_t *fsMount;
  255. }luat_vfs_fd_t;
  256. typedef struct luat_vfs
  257. {
  258. struct luat_vfs_filesystem* fsList[LUAT_VFS_FILESYSTEM_MAX];
  259. luat_vfs_mount_t mounted[LUAT_VFS_FILESYSTEM_MOUNT_MAX];
  260. luat_vfs_fd_t fds[LUAT_VFS_FILESYSTEM_FD_MAX+1];
  261. }luat_vfs_t;
  262. int luat_vfs_init(void* params);
  263. int luat_vfs_reg(const struct luat_vfs_filesystem* fs);
  264. FILE* luat_vfs_add_fd(FILE* fd, luat_vfs_mount_t * mount);
  265. int luat_vfs_rm_fd(FILE* fd);
  266. const char* luat_vfs_mmap(FILE* fd);
  267. #endif
  268. #endif