static int _write(mtd_dev_t *dev, const void *buff, uint32_t addr, uint32_t size) { mtd_native_dev_t *_dev = (mtd_native_dev_t*) dev; size_t mtd_size = dev->sector_count * dev->pages_per_sector * dev->page_size; DEBUG("mtd_native: write from 0x%" PRIx32 " count %" PRIu32 "\n", addr, size); if (addr + size > mtd_size) { return -EOVERFLOW; } if (((addr % dev->page_size) + size) > dev->page_size) { return -EOVERFLOW; } FILE *f = real_fopen(_dev->fname, "r+"); if (!f) { return -EIO; } real_fseek(f, addr, SEEK_SET); for (size_t i = 0; i < size; i++) { uint8_t c = real_fgetc(f); real_fseek(f, -1, SEEK_CUR); real_fputc(c & ((uint8_t*)buff)[i], f); } real_fclose(f); return size; }
static int _erase(mtd_dev_t *dev, uint32_t addr, uint32_t size) { mtd_native_dev_t *_dev = (mtd_native_dev_t*) dev; size_t mtd_size = dev->sector_count * dev->pages_per_sector * dev->page_size; size_t sector_size = dev->pages_per_sector * dev->page_size; DEBUG("mtd_native: erase from sector %" PRIu32 " count %" PRIu32 "\n", addr, size); if (addr + size > mtd_size) { return -EOVERFLOW; } if (((addr % sector_size) != 0) || ((size % sector_size) != 0)) { return -EOVERFLOW; } FILE *f = real_fopen(_dev->fname, "r+"); if (!f) { return -EIO; } real_fseek(f, addr, SEEK_SET); for (size_t i = 0; i < size; i++) { real_fputc(0xff, f); } real_fclose(f); return 0; }
void DiskFile::close() { if(_fh) { real_fclose((FILE*)_fh); _fh = NULL; } }
bool VFSFileReal::close(void) { VFS_GUARD_OPT(this); if(_fh) { real_fclose((FILE*)_fh); _fh = NULL; } return true; }
bool FileExists(const char *fn) { #ifdef _WIN32 void *fp = real_fopen(fn, "rb"); if(fp) { real_fclose(fp); return true; } return false; #else return access(fn, F_OK) == 0; #endif }
static int _read(mtd_dev_t *dev, void *buff, uint32_t addr, uint32_t size) { mtd_native_dev_t *_dev = (mtd_native_dev_t*) dev; size_t mtd_size = dev->sector_count * dev->pages_per_sector * dev->page_size; DEBUG("mtd_native: read from page %" PRIu32 " count %" PRIu32 "\n", addr, size); if (addr + size > mtd_size) { return -EOVERFLOW; } FILE *f = real_fopen(_dev->fname, "r"); if (!f) { return -EIO; } real_fseek(f, addr, SEEK_SET); size = real_fread(buff, 1, size, f); real_fclose(f); return size; }
int fclose(FILE *stream) { int fd = fileno(stream); struct fd_info *info = fd_map_find(fileno(stream)); if (info) { if (info->count == 1 && !(info->flags & WO_PIPE)) { if (info->flags & O_WRONLY) { if (fflush(stream) < 0) die("fflush failed: %s", strerror(errno)); action_close_write(fd); } } fd_map_close(fd); } int ret = real_fclose(stream); if (info && ret < 0) die("error on fclose(%d): %s", fd, strerror(errno)); return ret; }
static int _init(mtd_dev_t *dev) { mtd_native_dev_t *_dev = (mtd_native_dev_t*) dev; DEBUG("mtd_native: init, filename=%s\n", _dev->fname); FILE *f = real_fopen(_dev->fname, "r"); if (!f) { DEBUG("mtd_native: init: creating file %s\n", _dev->fname); f = real_fopen(_dev->fname, "w+"); if (!f) { return -EIO; } size_t size = dev->sector_count * dev->pages_per_sector * dev->page_size; for (size_t i = 0; i < size; i++) { real_fputc(0xff, f); } } real_fclose(f); return 0; }