//------------------------------------------------------------------------------ static void Ymodem_PreparePacket(uint8_t *data, uint8_t pktNo, uint32_t sizeBlk) { uint16_t i, size; uint16_t tempCRC; data[0] = STX; data[1] = pktNo; data[2] = (~pktNo); size = sizeBlk < PACKET_1K_SIZE ? sizeBlk :PACKET_1K_SIZE; // Read block from file if (size > 0) SPIFFS_read(&fs, (spiffs_file)file_fd, data + PACKET_HEADER, size); if ( size <= PACKET_1K_SIZE) { for (i = size + PACKET_HEADER; i < PACKET_1K_SIZE + PACKET_HEADER; i++) { data[i] = 0x1A; // EOF (0x1A) or 0x00 } } tempCRC = Cal_CRC16(&data[PACKET_HEADER], PACKET_1K_SIZE); data[PACKET_1K_SIZE + PACKET_HEADER] = tempCRC >> 8; data[PACKET_1K_SIZE + PACKET_HEADER + 1] = tempCRC & 0xFF; }
int read_and_verify_fd(spiffs_file fd, char *name) { int32_t res; int pfd = open(make_test_fname(name), O_RDONLY); spiffs_stat s; res = SPIFFS_fstat(&__fs, fd, &s); if (res < 0) { printf(" read_and_verify: could not stat file %s\n", name); return res; } if (s.size == 0) { SPIFFS_close(&__fs, fd); close(pfd); return 0; } //printf("verifying %s, len %i\n", name, s.size); int offs = 0; uint8_t buf_d[256]; uint8_t buf_v[256]; while (offs < s.size) { int read_len = MIN(s.size - offs, sizeof(buf_d)); res = SPIFFS_read(&__fs, fd, buf_d, read_len); if (res < 0) { printf(" read_and_verify: could not read file %s offs:%i len:%i filelen:%i\n", name, offs, read_len, s.size); return res; } int pres = read(pfd, buf_v, read_len); (void)pres; //printf("reading offs:%i len:%i spiffs_res:%i posix_res:%i\n", offs, read_len, res, pres); int i; int veri_ok = 1; for (i = 0; veri_ok && i < read_len; i++) { if (buf_d[i] != buf_v[i]) { printf("file verification mismatch @ %i, %02x %c != %02x %c\n", offs+i, buf_d[i], buf_d[i], buf_v[i], buf_v[i]); int j = MAX(0, i-16); int k = MIN(sizeof(buf_d), i+16); k = MIN(s.size-offs, k); int l; for (l = j; l < k; l++) { printf("%c", buf_d[l] > 31 ? buf_d[l] : '.'); } printf("\n"); for (l = j; l < k; l++) { printf("%c", buf_v[l] > 31 ? buf_v[l] : '.'); } printf("\n"); veri_ok = 0; } } if (!veri_ok) { SPIFFS_close(&__fs, fd); close(pfd); printf("data mismatch\n"); return -1; } offs += read_len; } SPIFFS_close(&__fs, fd); close(pfd); return 0; }
ssize_t fs_spiffs_read(int fd, void *buf, size_t count) { struct mount_info *m = &s_fsm; if (!m->valid) return set_errno(EBADF); return set_spiffs_errno(m, SPIFFS_read(&m->fs, fd, buf, count)); }
int ICACHE_FLASH_ATTR roffs_read(ROFFS_FILE *file, char *buf, int len) { return SPIFFS_read(&fs, file->fd, buf, len); }
size_t spiffs_fread(void *ptr, size_t size, size_t count, int fd) { int res = SPIFFS_read(&fs, fd, ptr, size * count); set_errno(res); return res < 0 ? 0 : res; }
int main(int argc, char **argv) { FILE *fp; const char *filename = NULL; int i; int list = 0; const char *extDir = "."; for (i = 1; i < argc && argv[i][0] == '-'; i++) { if (strcmp(argv[i], "-d") == 0 && i + 1 < argc) { extDir = argv[i + 1]; i++; } else if (strcmp(argv[i], "-l") == 0) { list = 1; } else if (strcmp(argv[i], "-h") == 0) { show_usage(argv); } } if (argc - i < 1) { show_usage(argv); } filename = argv[i]; fp = fopen(filename, "r"); if (fp == NULL) { fprintf(stderr, "unable to open %s, err: %d\n", filename, errno); return 1; } fseek(fp, 0, SEEK_END); image_size = ftell(fp); fseek(fp, 0, SEEK_SET); image = (char *) malloc(image_size); if (fread(image, image_size, 1, fp) < 1) { fprintf(stderr, "cannot read %s, err: %d\n", filename, errno); return 1; } mem_spiffs_mount(); { spiffs_DIR d; struct spiffs_dirent de; SPIFFS_opendir(&fs, ".", &d); while (SPIFFS_readdir(&d, &de) != NULL) { if (list) { printf("%s\n", de.name); } else { char target[1024]; char *buf = NULL; FILE *out; spiffs_file in; sprintf(target, "%s/%s", extDir, de.name); fprintf(stderr, "extracting %s\n", de.name); out = fopen(target, "w"); if (out == NULL) { fprintf(stderr, "cannot write %s, err: %d\n", target, errno); return 1; } in = SPIFFS_open_by_dirent(&fs, &de, SPIFFS_RDONLY, 0); if (in < 0) { fprintf(stderr, "cannot open spiffs file %s, err: %d\n", de.name, SPIFFS_errno(&fs)); return 1; } buf = malloc(de.size); if (SPIFFS_read(&fs, in, buf, de.size) != de.size) { fprintf(stderr, "cannot read %s, err: %d\n", de.name, SPIFFS_errno(&fs)); return 1; } SPIFFS_close(&fs, in); fwrite(buf, de.size, 1, out); free(buf); fclose(out); } } SPIFFS_closedir(&d); } free(image); fclose(fp); return 0; }