static int r_io_def_mmap_refresh_def_mmap_buf(RIOMMapFileObj *mmo) { RIO* io = mmo->io_backref; ut64 cur; if (mmo->buf) { cur = mmo->buf->cur; r_buf_free (mmo->buf); mmo->buf = NULL; } else { cur = 0; } st64 sz = r_file_size (mmo->filename); if (sz == 0 || sz > ST32_MAX) { // Do not use mmap if the file is huge mmo->rawio = 1; } if (mmo->rawio) { mmo->fd = __io_posix_open (mmo->filename, mmo->flags, mmo->mode); return (mmo->fd != -1); } mmo->buf = r_buf_mmap (mmo->filename, mmo->flags); if (mmo->buf) { r_io_def_mmap_seek (io, mmo, cur, SEEK_SET); return true; } else { mmo->rawio = 1; mmo->fd = __io_posix_open (mmo->filename, mmo->flags, mmo->mode); return (mmo->fd != -1); } return false; }
static int r_io_def_mmap_refresh_def_mmap_buf(RIOMMapFileObj *mmo) { RIO* io = mmo->io_backref; ut64 cur = mmo->buf ? mmo->buf->cur : 0; if (mmo->buf) { r_buf_free (mmo->buf); mmo->buf = NULL; } if (mmo->rawio) { mmo->fd = __io_posix_open (mmo->filename, mmo->flags, mmo->mode); return (mmo->fd != -1); } mmo->buf = r_buf_mmap (mmo->filename, mmo->flags); if (mmo->buf) r_io_def_mmap_seek (io, mmo, cur, SEEK_SET); return (mmo->buf ? R_TRUE : R_FALSE); }
R_API RIODesc *r_io_open(RIO *io, const char *file, int flags, int mode) { RIODesc *desc = __getioplugin (io, file, flags, mode); int fd; if (desc) { fd = desc->fd; } else { fd = __io_posix_open (io, file, flags, mode); if (fd>=0) desc = r_io_desc_new (io->plugin, fd, file, flags, mode, NULL); } if (fd >= 0) { r_io_desc_add (io, desc); r_io_set_fd (io, desc); } return desc; }