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; }
bool VFSFileReal::seekRel(vfspos offs) { VFS_GUARD_OPT(this); if(!_fh) return false; return real_fseek((FILE*)_fh, offs, SEEK_CUR) == 0; }
bool VFSFileReal::seek(vfspos pos) { VFS_GUARD_OPT(this); if(!_fh) return false; return real_fseek((FILE*)_fh, pos, SEEK_SET) == 0; }
static int cache_bseek (struct bfd *abfd, file_ptr offset, int whence) { FILE *f = bfd_cache_lookup (abfd, whence != SEEK_CUR ? CACHE_NO_SEEK : 0); if (f == NULL) return -1; return real_fseek (f, offset, whence); }
bool VFSFileReal::open(const char *mode /* = NULL */) { VFS_GUARD_OPT(this); if(isopen()) close(); dropBuf(true); _fh = real_fopen(fullname(), mode ? mode : "rb"); if(!_fh) return false; real_fseek((FILE*)_fh, 0, SEEK_END); _size = getpos(); real_fseek((FILE*)_fh, 0, SEEK_SET); return true; }
static int cache_bseek (struct bfd *abfd, file_ptr offset, int whence) { FILE *f = bfd_cache_lookup (abfd, whence != SEEK_CUR ? CACHE_NO_SEEK : 0); if (f == NULL) return -1; #if defined(__BEOS__) || defined(__HAIKU__) _bfdio_files[fileno(f)] = 1; #endif return real_fseek (f, offset, whence); }
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; }
static FILE * bfd_cache_lookup_worker (bfd *abfd, enum cache_flag flag) { bfd *orig_bfd = abfd; if ((abfd->flags & BFD_IN_MEMORY) != 0) abort (); if (abfd->my_archive) abfd = abfd->my_archive; if (abfd->iostream != NULL) { /* Move the file to the start of the cache. */ if (abfd != bfd_last_cache) { snip (abfd); insert (abfd); } return (FILE *) abfd->iostream; } if (flag & CACHE_NO_OPEN) return NULL; if (bfd_open_file (abfd) == NULL) ; else if (!(flag & CACHE_NO_SEEK) && real_fseek ((FILE *) abfd->iostream, abfd->where, SEEK_SET) != 0 && !(flag & CACHE_NO_SEEK_ERROR)) bfd_set_error (bfd_error_system_call); else return (FILE *) abfd->iostream; (*_bfd_error_handler) (_("reopening %B: %s\n"), orig_bfd, bfd_errmsg (bfd_get_error ())); return NULL; }
bool DiskFile::seek(vfspos pos, int whence) { return _fh && real_fseek((FILE*)_fh, pos, whence) == 0; }