static int r_io_def_mmap_write(RIO *io, RIODesc *fd, const ut8 *buf, int count) { RIOMMapFileObj *mmo; int len = -1; ut64 addr = io->off; if (!fd || !fd->data || !buf) return -1; mmo = fd->data; if (mmo && mmo->buf) { if (!(mmo->flags & R_IO_WRITE)) return -1; if ( (count + addr > mmo->buf->length) || mmo->buf->empty) { ut64 sz = count + addr; r_file_truncate (mmo->filename, sz); } } len = r_file_mmap_write (mmo->filename, io->off, buf, count); if (len != count) { // aim to hack some corner cases? if (lseek (fd->fd, addr, 0) < 0) return -1; len = write (fd->fd, buf, count); } if (!r_io_def_mmap_refresh_def_mmap_buf (mmo) ) { eprintf ("io_def_mmap: failed to refresh the def_mmap backed buffer.\n"); // XXX - not sure what needs to be done here (error handling). } return len; }
static int r_io_def_mmap_truncate(RIOMMapFileObj *mmo, ut64 size) { int res = r_file_truncate (mmo->filename, size); if (res && !r_io_def_mmap_refresh_def_mmap_buf (mmo) ) { eprintf ("r_io_def_mmap_truncate: Error trying to refresh the def_mmap'ed file."); res = false; } else if (!res) eprintf ("r_io_def_mmap_truncate: Error trying to resize the file."); return res; }
static int r_io_mmap_write(RIO *io, RIODesc *fd, const ut8 *buf, int count) { RIOMMapFileObj *mmo; int len = count; ut64 addr = io->off; if (!fd || !fd->data || !buf) return -1; mmo = fd->data; if ( !(mmo->flags & R_IO_WRITE)) return -1; if ( (count + addr > mmo->buf->length) || mmo->buf->empty) { ut64 sz = count + addr; r_file_truncate (mmo->filename, sz); } len = r_file_mmap_write (mmo->filename, io->off, buf, len); if (!r_io_mmap_refresh_buf (mmo) ) { eprintf ("io_mmap: failed to refresh the mmap backed buffer.\n"); // XXX - not sure what needs to be done here (error handling). } return len; }
static int r_io_def_mmap_write(RIO *io, RIODesc *fd, const ut8 *buf, int count) { RIOMMapFileObj *mmo; int len = -1; ut64 addr = io->off; if (!fd || !fd->data || !buf) { return -1; } mmo = fd->data; if (!mmo) { return -1; } if (mmo->rawio) { if (fd->obsz) { char *a_buf; int a_count; // only do aligned reads in aligned offsets const int aligned = fd->obsz; //512; // XXX obey fd->obsz? or it may be too slow? 128K.. //ut64 a_off = (io->off >> 9 ) << 9; //- (io->off & aligned); ut64 a_off = io->off - (io->off % aligned); //(io->off >> 9 ) << 9; //- (io->off & aligned); int a_delta = io->off - a_off; if (a_delta < 0) { return -1; } a_count = count + (aligned - (count % aligned)); a_buf = malloc (a_count + aligned); if (a_buf) { int i; memset (a_buf, 0xff, a_count+aligned); for (i = 0; i < a_count; i += aligned) { (void)lseek (mmo->fd, a_off + i, SEEK_SET); (void)read (mmo->fd, a_buf + i, aligned); } memcpy (a_buf+a_delta, buf, count); for (i = 0; i < a_count; i += aligned) { (void)lseek (mmo->fd, a_off + i, SEEK_SET); (void)write (mmo->fd, a_buf + i, aligned); } } free (a_buf); return count; } if (lseek (mmo->fd, addr, 0) < 0) { return -1; } len = write (mmo->fd, buf, count); return len; } if (mmo && mmo->buf) { if (!(mmo->flags & R_IO_WRITE)) return -1; if ( (count + addr > mmo->buf->length) || mmo->buf->empty) { ut64 sz = count + addr; r_file_truncate (mmo->filename, sz); } } len = r_file_mmap_write (mmo->filename, io->off, buf, count); if (len != count) { // aim to hack some corner cases? if (lseek (fd->fd, addr, 0) < 0) { return -1; } len = write (fd->fd, buf, count); } if (!r_io_def_mmap_refresh_def_mmap_buf (mmo) ) { eprintf ("io_def_mmap: failed to refresh the def_mmap backed buffer.\n"); // XXX - not sure what needs to be done here (error handling). } return len; }