mirror of
https://github.com/radareorg/radare2.git
synced 2024-10-08 02:53:29 +00:00
add fd abstraction api, and make desc-api a bit more consistent
This commit is contained in:
parent
bbf05a13c4
commit
ea52254c52
@ -857,10 +857,10 @@ static int cb_cfgdebug(void *user, void *data) {
|
||||
r_config_set (core->config, "asm.arch", "bf");
|
||||
if (core->file) {
|
||||
#if __WINDOWS__
|
||||
r_debug_select (core->dbg, core->dbg->pid, core->dbg->tid);
|
||||
r_debug_select (core->dbg, core->dbg->pid, core->dbg->tid); //XXX use desc-api here for pid and tid
|
||||
#else
|
||||
int pid = r_io_desc_get_pid (core->io, core->file->desc->fd);
|
||||
r_debug_select (core->dbg, pid, pid);
|
||||
r_debug_select (core->dbg, r_io_desc_get_pid (core->file->desc),
|
||||
r_io_desc_get_tid (core->file->desc));
|
||||
#endif
|
||||
}
|
||||
} else {
|
||||
|
@ -351,11 +351,11 @@ static int r_core_file_do_load_for_debug(RCore *r, ut64 baseaddr, const char *fi
|
||||
return false;
|
||||
}
|
||||
if (cf && desc) {
|
||||
int newpid = r_io_desc_get_pid (r->io, desc->fd);
|
||||
#if __WINDOWS__
|
||||
r_debug_select (r->dbg, r->dbg->pid, r->dbg->tid);
|
||||
#else
|
||||
r_debug_select (r->dbg, newpid, newpid);
|
||||
r_debug_select (r->dbg, r_io_desc_get_pid (desc),
|
||||
r_io_desc_get_tid (desc));
|
||||
#endif
|
||||
}
|
||||
#if !__linux__
|
||||
|
@ -1512,7 +1512,7 @@ R_API ut64 r_debug_get_baddr(RDebug *dbg, const char *file) {
|
||||
// Tell gdb that we want baddr, not full mem map
|
||||
dbg->iob.system(dbg->iob.io, "baddr");
|
||||
}
|
||||
int pid = r_io_desc_get_pid (dbg->iob.io, dbg->iob.io->desc->fd);
|
||||
int pid = r_io_desc_get_pid (dbg->iob.io->desc);
|
||||
if (r_debug_attach (dbg, pid) == -1) {
|
||||
return 0LL;
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
/* radare2 - LGPL - Copyright 2017 - condret, pancake, alvaro */
|
||||
|
||||
#ifndef R2_IO_H
|
||||
#define R2_IO_H
|
||||
|
||||
@ -416,8 +418,10 @@ R_API int r_io_wundo_set(RIO *io, int n, int set);
|
||||
//desc.c
|
||||
R_API bool r_io_desc_init (RIO *io);
|
||||
R_API RIODesc *r_io_desc_new (RIO *io, RIOPlugin *plugin, const char *uri, int flags, int mode, void *data);
|
||||
R_API int r_io_desc_read(RIODesc *desc, ut8 *buf, int count);
|
||||
R_API int r_io_desc_write(RIODesc *desc, const ut8 *buf, int count);
|
||||
R_API RIODesc *r_io_desc_open (RIO *io, const char *uri, int flags, int mode);
|
||||
R_API bool r_io_desc_close (RIODesc *desc);
|
||||
R_API int r_io_desc_read (RIODesc *desc, ut8 *buf, int count);
|
||||
R_API int r_io_desc_write (RIODesc *desc, const ut8 *buf, int count);
|
||||
R_API void r_io_desc_free (RIODesc *desc);
|
||||
R_API bool r_io_desc_add (RIO *io, RIODesc *desc);
|
||||
R_API bool r_io_desc_del (RIO *io, int fd);
|
||||
@ -425,13 +429,13 @@ R_API RIODesc *r_io_desc_get (RIO *io, int fd);
|
||||
R_API ut64 r_io_desc_seek (RIODesc *desc, ut64 offset, int whence);
|
||||
R_API ut64 r_io_desc_size (RIODesc *desc);
|
||||
R_API bool r_io_desc_is_blockdevice (RIODesc *desc);
|
||||
R_API bool r_io_desc_exchange (RIO *io, int fd, int fdx);
|
||||
R_API int r_io_desc_get_pid (RIO *io, int fd);
|
||||
R_API int r_io_desc_get_tid (RIO *io, int fd);
|
||||
R_API bool r_io_desc_exchange (RIO *io, int fd, int fdx); //this should get 2 descs
|
||||
R_API int r_io_desc_get_pid (RIODesc *desc);
|
||||
R_API int r_io_desc_get_tid (RIODesc *desc);
|
||||
R_API int r_io_desc_read_at (RIODesc *desc, ut64 addr, ut8 *buf, int len);
|
||||
R_API int r_io_desc_write_at (RIODesc *desc, ut64 addr, const ut8 *buf, int len);
|
||||
R_API bool r_io_desc_fini (RIO *io);
|
||||
R_API void r_io_desc_cache_cleanup(RIODesc *desc);
|
||||
R_API void r_io_desc_cache_cleanup (RIODesc *desc);
|
||||
|
||||
|
||||
/* io/p_cache.c */
|
||||
@ -450,6 +454,20 @@ R_API int r_io_buffer_load(RIO* io, ut64 addr, int len);
|
||||
R_API const ut8* r_io_buffer_get (RIO *io, ut64 addr, int *len);
|
||||
R_API int r_io_buffer_read (RIO *io, ut64 addr, ut8* buf, int len);
|
||||
|
||||
/* io/fd.c */
|
||||
R_API int r_io_fd_open (RIO *io, const char *uri, int flags, int mode);
|
||||
R_API bool r_io_fd_close (RIO *io, int fd);
|
||||
R_API int r_io_fd_read (RIO *io, int fd, ut8 *buf, int len);
|
||||
R_API int r_io_fd_write (RIO *io, int fd, ut8 *buf, int len);
|
||||
R_API ut64 r_io_fd_seek (RIO *io, int fd, ut64 addr, int whence);
|
||||
R_API ut64 r_io_fd_size (RIO *io, int fd);
|
||||
R_API bool r_io_fd_is_blockdevice (RIO *io, int fd);
|
||||
R_API int r_io_fd_read_at (RIO *io, int fd, ut64 addr, ut8 *buf, int len);
|
||||
R_API int r_io_fd_write_at (RIO *io, int fd, ut64 addr, ut8 *buf, int len);
|
||||
R_API int r_io_fd_get_pid (RIO *io, int fd);
|
||||
R_API int r_io_fd_get_tid (RIO *io, int fd);
|
||||
|
||||
|
||||
#define r_io_range_new() R_NEW0(RIORange)
|
||||
#define r_io_range_free(x) free(x)
|
||||
|
||||
|
@ -5,7 +5,7 @@ DEPS+=r_util
|
||||
DEPS+=r_socket
|
||||
STATIC_OBJS=$(subst ..,p/..,$(subst io_,p/io_,$(STATIC_OBJ)))
|
||||
OBJS=${STATIC_OBJS}
|
||||
OBJS+=io.o plugin.o map.o section.o desc.o cache.o p_cache.o undo.o buffer.o
|
||||
OBJS+=io.o plugin.o map.o section.o desc.o cache.o p_cache.o undo.o buffer.o fd.o
|
||||
OBJS+=rbufplug.o
|
||||
|
||||
CFLAGS+=-Wall -DCORELIB
|
||||
|
@ -72,7 +72,7 @@ R_API bool r_io_desc_add(RIO* io, RIODesc* desc) {
|
||||
return true;
|
||||
}
|
||||
|
||||
R_API bool r_io_desc_del(RIO* io, int fd) {
|
||||
R_API bool r_io_desc_del(RIO* io, int fd) { //can we pass this a riodesc and check if it belongs to the desc->io ?
|
||||
RIODesc* desc;
|
||||
if (!io || !io->files || !(desc = r_id_storage_get (io->files, fd))) {
|
||||
return false;
|
||||
@ -91,6 +91,53 @@ R_API RIODesc* r_io_desc_get(RIO* io, int fd) {
|
||||
return (RIODesc*) r_id_storage_get (io->files, fd);
|
||||
}
|
||||
|
||||
R_API RIODesc *r_io_desc_open(RIO *io, const char *uri, int flags, int mode) {
|
||||
RIOPlugin *plugin;
|
||||
RIODesc *desc;
|
||||
if (!io || !io->files || !uri) {
|
||||
return NULL;
|
||||
}
|
||||
plugin = r_io_plugin_resolve (io, uri, 0);
|
||||
if (!plugin || !plugin->open || !plugin->close) {
|
||||
return NULL;
|
||||
}
|
||||
desc = plugin->open (io, uri, flags, mode);
|
||||
if (!desc) {
|
||||
return NULL;
|
||||
}
|
||||
//for none static callbacks, those that cannot use r_io_desc_new
|
||||
if (!desc->plugin) {
|
||||
desc->plugin = plugin;
|
||||
}
|
||||
if (!desc->uri) {
|
||||
desc->uri = strdup (uri);
|
||||
}
|
||||
if (!desc->name) {
|
||||
desc->name = strdup (uri);
|
||||
}
|
||||
r_io_desc_add (io, desc);
|
||||
return desc;
|
||||
}
|
||||
|
||||
R_API bool r_io_desc_close(RIODesc *desc) {
|
||||
RIO *io;
|
||||
if (!desc || !desc->io || !desc->plugin || !desc->plugin->close) {
|
||||
return false;
|
||||
}
|
||||
if (desc->plugin->close (desc)) {
|
||||
return false;
|
||||
}
|
||||
io = desc->io;
|
||||
// remove entry from idstorage and free the desc-struct
|
||||
r_io_desc_del (io, desc->fd);
|
||||
// remove all dead maps
|
||||
#if 0
|
||||
r_io_map_cleanup (io);
|
||||
r_io_section_cleanup (io);
|
||||
#endif
|
||||
return true;
|
||||
}
|
||||
|
||||
R_API int r_io_desc_write(RIODesc *desc, const ut8* buf, int count) {
|
||||
if (!buf || !desc || !desc->plugin || !desc->plugin->write || count < 0) {
|
||||
return -1;
|
||||
@ -173,13 +220,9 @@ R_API bool r_io_desc_exchange(RIO* io, int fd, int fdx) {
|
||||
return true;
|
||||
}
|
||||
|
||||
R_API int r_io_desc_get_pid(RIO* io, int fd) {
|
||||
RIODesc* desc;
|
||||
if (!io || !io->files) {
|
||||
//-1 is reserved for plugin internal errors
|
||||
return -2;
|
||||
}
|
||||
if (!(desc = r_io_desc_get (io, fd))) {
|
||||
R_API int r_io_desc_get_pid(RIODesc *desc) {
|
||||
//-1 and -2 are reserved
|
||||
if (!desc) {
|
||||
return -3;
|
||||
}
|
||||
if (!desc->plugin) {
|
||||
@ -194,12 +237,9 @@ R_API int r_io_desc_get_pid(RIO* io, int fd) {
|
||||
return desc->plugin->getpid (desc);
|
||||
}
|
||||
|
||||
R_API int r_io_desc_get_tid(RIO* io, int fd) {
|
||||
RIODesc* desc;
|
||||
if (!io || !io->files) {
|
||||
return -2; //-1 is reserved for plugin internal errors
|
||||
}
|
||||
if (!(desc = r_io_desc_get (io, fd))) {
|
||||
R_API int r_io_desc_get_tid(RIODesc *desc) {
|
||||
//-1 and -2 are reserved
|
||||
if (!desc) {
|
||||
return -3;
|
||||
}
|
||||
if (!desc->plugin) {
|
||||
|
77
libr/io/fd.c
Normal file
77
libr/io/fd.c
Normal file
@ -0,0 +1,77 @@
|
||||
/* radare2 - LGPL - Copyright 2017 - condret */
|
||||
|
||||
#include <r_io.h>
|
||||
|
||||
R_API int r_io_fd_open(RIO *io, const char *uri, int flags, int mode) {
|
||||
RIODesc *desc = r_io_desc_open (io, uri, flags, mode);
|
||||
return desc ? desc->fd : -1;
|
||||
}
|
||||
|
||||
R_API bool r_io_fd_close(RIO *io, int fd) {
|
||||
return r_io_desc_close (r_io_desc_get (io, fd));
|
||||
}
|
||||
|
||||
R_API int r_io_fd_read(RIO *io, int fd, ut8 *buf, int len) {
|
||||
RIODesc *desc;
|
||||
if (!io || !buf || !(desc = r_io_desc_get (io, fd))) {
|
||||
return -1;
|
||||
}
|
||||
return r_io_desc_read (desc, buf, len);
|
||||
}
|
||||
|
||||
R_API int r_io_fd_write(RIO *io, int fd, ut8 *buf, int len) {
|
||||
RIODesc *desc;
|
||||
if (!io || !buf || !(desc = r_io_desc_get (io, fd))) {
|
||||
return -1;
|
||||
}
|
||||
return r_io_desc_write (desc, buf, len);
|
||||
}
|
||||
|
||||
R_API ut64 r_io_fd_seek(RIO *io, int fd, ut64 addr, int whence) {
|
||||
if (!io) {
|
||||
return (ut64)-2;
|
||||
}
|
||||
return r_io_desc_seek (r_io_desc_get (io, fd), addr, whence);
|
||||
}
|
||||
|
||||
R_API ut64 r_io_fd_size(RIO *io, int fd) {
|
||||
return r_io_desc_size (r_io_desc_get (io, fd));
|
||||
}
|
||||
|
||||
R_API bool r_io_fd_is_blockdevice(RIO *io, int fd) {
|
||||
return r_io_desc_is_blockdevice (r_io_desc_get (io, fd));
|
||||
}
|
||||
|
||||
R_API int r_io_fd_read_at(RIO *io, int fd, ut64 addr, ut8 *buf, int len) {
|
||||
RIODesc *desc;
|
||||
if (!io || !buf || !(desc = r_io_desc_get (io, fd))) {
|
||||
return -1;
|
||||
}
|
||||
return r_io_desc_read_at (desc, addr, buf, len);
|
||||
}
|
||||
|
||||
R_API int r_io_fd_write_at(RIO *io, int fd, ut64 addr, ut8 *buf, int len) {
|
||||
RIODesc *desc;
|
||||
if (!io || !buf || !(desc = r_io_desc_get (io, fd))) {
|
||||
return -1;
|
||||
}
|
||||
return r_io_desc_write_at (desc, addr, buf, len);
|
||||
}
|
||||
|
||||
R_API int r_io_fd_get_pid(RIO *io, int fd) {
|
||||
RIODesc *desc;
|
||||
if (!io || !io->files) {
|
||||
return -2;
|
||||
}
|
||||
desc = r_io_desc_get (io, fd);
|
||||
return r_io_desc_get_pid (desc);
|
||||
}
|
||||
|
||||
R_API int r_io_fd_get_tid(RIO *io, int fd) {
|
||||
RIODesc *desc;
|
||||
if (!io || !io->files) {
|
||||
return -2;
|
||||
}
|
||||
desc = r_io_desc_get (io, fd);
|
||||
return r_io_desc_get_tid (desc);
|
||||
}
|
55
libr/io/io.c
55
libr/io/io.c
@ -278,32 +278,15 @@ static inline RList *__getioplugin_many(RIO *io, const char *_uri, int flags, in
|
||||
}
|
||||
|
||||
R_API RIODesc *r_io_open_nomap(RIO *io, const char *uri, int flags, int mode) {
|
||||
if (!io || !io->files || !uri) {
|
||||
RIODesc *desc;
|
||||
if (!io) {
|
||||
return NULL;
|
||||
}
|
||||
RIOPlugin *plugin = r_io_plugin_resolve (io, uri, 0);
|
||||
if (!plugin || !plugin->open) {
|
||||
return NULL;
|
||||
}
|
||||
RIODesc *desc = plugin->open (io, uri, flags, mode);
|
||||
if (!desc) {
|
||||
return NULL;
|
||||
}
|
||||
//for none static callbacks, those that cannot use r_io_desc_new
|
||||
if (!desc->plugin) {
|
||||
desc->plugin = plugin;
|
||||
}
|
||||
if (!desc->uri) {
|
||||
desc->uri = strdup (uri);
|
||||
}
|
||||
if (!desc->name) {
|
||||
desc->name = strdup (uri);
|
||||
}
|
||||
r_io_desc_add (io, desc);
|
||||
//set desc as current if autofd or io->desc==NULL
|
||||
if (io->autofd || !io->desc) {
|
||||
desc = r_io_desc_open (io, uri, flags, mode);
|
||||
if ((io->autofd || !io->desc) && desc) {
|
||||
io->desc = desc;
|
||||
}
|
||||
//set desc as current if autofd or io->desc==NULL
|
||||
return desc;
|
||||
}
|
||||
|
||||
@ -873,16 +856,6 @@ R_API ut64 r_io_seek(RIO *io, ut64 offset, int whence) {
|
||||
return ret;
|
||||
}
|
||||
|
||||
R_API ut64 r_io_fd_size(RIO *io, int fd) {
|
||||
RIODesc *desc = r_io_desc_get (io, fd);
|
||||
return r_io_desc_size (desc);
|
||||
}
|
||||
|
||||
R_API bool r_io_fd_is_blockdevice(RIO *io, int fd) {
|
||||
RIODesc *desc = r_io_desc_get (io, fd);
|
||||
return r_io_desc_is_blockdevice (desc);
|
||||
}
|
||||
|
||||
R_API ut64 r_io_size(RIO *io) {
|
||||
return io? r_io_desc_size (io->desc): 0LL;
|
||||
}
|
||||
@ -906,22 +879,8 @@ R_API int r_io_plugin_close(RIO *io, RIODesc *desc) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
R_API bool r_io_close(RIO *io, int fd) {
|
||||
RIODesc* desc = r_io_desc_get (io, fd);
|
||||
if (!desc || !desc->plugin || !desc->plugin->close) {
|
||||
return false;
|
||||
}
|
||||
if (desc->plugin->close (desc)) {
|
||||
return false;
|
||||
}
|
||||
// remove entry from sdb-instance and free the desc-struct
|
||||
r_io_desc_del (io, fd);
|
||||
// remove all dead maps
|
||||
#if 0
|
||||
r_io_map_cleanup (io);
|
||||
r_io_section_cleanup (io);
|
||||
#endif
|
||||
return true;
|
||||
R_API bool r_io_close(RIO *io, int fd) { //should close io->desc
|
||||
return r_io_desc_close (r_io_desc_get (io, fd));
|
||||
}
|
||||
|
||||
R_API int r_io_close_all(RIO *io) {
|
||||
|
Loading…
Reference in New Issue
Block a user