ioapi.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  1. /* ioapi.c -- IO base function header for compress/uncompress .zip
  2. files using zlib + zip or unzip API
  3. Version 1.01e, February 12th, 2005
  4. Copyright (C) 1998-2005 Gilles Vollant
  5. */
  6. #include <stdio.h>
  7. #include <stdlib.h>
  8. #include <string.h>
  9. #include <fs.h>
  10. #include "zlib.h"
  11. #include "ioapi.h"
  12. #include <fs.h>
  13. #include <part.h>
  14. #include <malloc.h>
  15. typedef struct {
  16. loff_t offset; // 当前文件偏移
  17. loff_t size; // 文件大小
  18. const char *fname; // 文件名
  19. int error; // 错误标志
  20. } uboot_file;
  21. #ifdef __UBOOT__
  22. #include <fs.h>
  23. #include <linux/types.h>
  24. //typedef loff_t off_t;
  25. #define FILE struct fs_dir_stream
  26. #endif
  27. /* I've found an old Unix (a SunOS 4.1.3_U1) without all SEEK_* defined.... */
  28. #ifndef SEEK_CUR
  29. #define SEEK_CUR 1
  30. #endif
  31. #ifndef SEEK_END
  32. #define SEEK_END 2
  33. #endif
  34. #ifndef SEEK_SET
  35. #define SEEK_SET 0
  36. #endif
  37. voidpf ZCALLBACK fopen_file_func OF((
  38. voidpf opaque,
  39. const char* filename,
  40. int mode));
  41. uLong ZCALLBACK fread_file_func OF((
  42. voidpf opaque,
  43. voidpf stream,
  44. void* buf,
  45. uLong size));
  46. uLong ZCALLBACK fwrite_file_func OF((
  47. voidpf opaque,
  48. voidpf stream,
  49. const void* buf,
  50. uLong size));
  51. long ZCALLBACK ftell_file_func OF((
  52. voidpf opaque,
  53. voidpf stream));
  54. long ZCALLBACK fseek_file_func OF((
  55. voidpf opaque,
  56. voidpf stream,
  57. uLong offset,
  58. int origin));
  59. int ZCALLBACK fclose_file_func OF((
  60. voidpf opaque,
  61. voidpf stream));
  62. int ZCALLBACK ferror_file_func OF((
  63. voidpf opaque,
  64. voidpf stream));
  65. #ifdef __UBOOT__
  66. voidpf ZCALLBACK fopen_file_func(voidpf opaque, const char* filename, int mode) {
  67. loff_t file_size = 0;
  68. if ((mode & ZLIB_FILEFUNC_MODE_READ) == 0)
  69. return NULL;
  70. if (fs_set_blk_dev("usb", "0", FS_TYPE_FAT)) {
  71. printf("Can't set block device\n");
  72. return NULL;
  73. }
  74. if (fs_size(filename, &file_size) < 0) {
  75. printf("ZIP file not found: %s\n", filename);
  76. return NULL;
  77. }
  78. uboot_file *file = malloc(sizeof(uboot_file));
  79. if (!file)
  80. return NULL;
  81. file->offset = 0;
  82. file->fname = filename;
  83. file->size = file_size;
  84. file->error = 0;
  85. return (voidpf)file;
  86. }
  87. #else
  88. voidpf ZCALLBACK fopen_file_func (opaque, filename, mode)
  89. voidpf opaque;
  90. const char* filename;
  91. int mode;
  92. {
  93. FILE* file = NULL;
  94. const char* mode_fopen = NULL;
  95. if ((mode & ZLIB_FILEFUNC_MODE_READWRITEFILTER)==ZLIB_FILEFUNC_MODE_READ)
  96. mode_fopen = "rb";
  97. else
  98. if (mode & ZLIB_FILEFUNC_MODE_EXISTING)
  99. mode_fopen = "r+b";
  100. else
  101. if (mode & ZLIB_FILEFUNC_MODE_CREATE)
  102. mode_fopen = "wb";
  103. if ((filename!=NULL) && (mode_fopen != NULL))
  104. file = fopen(filename, mode_fopen);
  105. return file;
  106. }
  107. #endif
  108. uLong ZCALLBACK fread_file_func (opaque, stream, buf, size)
  109. voidpf opaque;
  110. voidpf stream;
  111. void* buf;
  112. uLong size;
  113. {
  114. uboot_file *file = (uboot_file*)stream;
  115. loff_t actread;
  116. if (fs_set_blk_dev("usb", "0", FS_TYPE_FAT)) {
  117. printf("Can't set block device\n");
  118. return 1;
  119. }
  120. // 计算可读字节数
  121. uLong max_size = file->size - file->offset;
  122. if (size > max_size)
  123. size = max_size;
  124. // 调用 U-Boot FS API 读取
  125. if (fs_read(file->fname, (ulong)buf, file->offset, size, &actread)) {
  126. file->error = -1;
  127. printf(">>>>>>>>>>>>>>>>>>>>>>>>read error!!!\n");
  128. return 0;
  129. }
  130. file->offset += actread;
  131. return (uLong)actread;
  132. }
  133. uLong ZCALLBACK fwrite_file_func (opaque, stream, buf, size)
  134. voidpf opaque;
  135. voidpf stream;
  136. const void* buf;
  137. uLong size;
  138. {
  139. return 0;
  140. }
  141. long ZCALLBACK ftell_file_func (opaque, stream)
  142. voidpf opaque;
  143. voidpf stream;
  144. {
  145. return (unsigned int)((uboot_file*)stream)->offset;
  146. }
  147. long ZCALLBACK fseek_file_func (opaque, stream, offset, origin)
  148. voidpf opaque;
  149. voidpf stream;
  150. uLong offset;
  151. int origin;
  152. {
  153. uboot_file *file = (uboot_file*)stream;
  154. loff_t new_offset;
  155. switch (origin) {
  156. case ZLIB_FILEFUNC_SEEK_SET:
  157. new_offset = offset;
  158. break;
  159. case ZLIB_FILEFUNC_SEEK_CUR:
  160. new_offset = file->offset + offset;
  161. break;
  162. case ZLIB_FILEFUNC_SEEK_END:
  163. new_offset = file->size + offset;
  164. break;
  165. default: return -1;
  166. }
  167. if (new_offset < 0 || new_offset > file->size)
  168. return -1;
  169. file->offset = new_offset;
  170. return 0;
  171. }
  172. int ZCALLBACK fclose_file_func (opaque, stream)
  173. voidpf opaque;
  174. voidpf stream;
  175. {
  176. if (stream) {
  177. free(stream);
  178. return 0;
  179. }
  180. return -1;
  181. }
  182. int ZCALLBACK ferror_file_func (opaque, stream)
  183. voidpf opaque;
  184. voidpf stream;
  185. {
  186. return ((uboot_file*)stream)->error;
  187. }
  188. void fill_fopen_filefunc (pzlib_filefunc_def)
  189. zlib_filefunc_def* pzlib_filefunc_def;
  190. {
  191. pzlib_filefunc_def->zopen_file = fopen_file_func;
  192. pzlib_filefunc_def->zread_file = fread_file_func;
  193. pzlib_filefunc_def->zwrite_file = NULL;//fwrite_file_func;
  194. pzlib_filefunc_def->ztell_file = ftell_file_func;
  195. pzlib_filefunc_def->zseek_file = fseek_file_func;
  196. pzlib_filefunc_def->zclose_file = fclose_file_func;
  197. pzlib_filefunc_def->zerror_file = ferror_file_func;
  198. pzlib_filefunc_def->opaque = NULL;
  199. }