add fd abstraction api, and make desc-api a bit more consistent

This commit is contained in:
condret 2017-08-19 02:23:51 +00:00
parent bbf05a13c4
commit ea52254c52
8 changed files with 169 additions and 75 deletions

View File

@ -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 {

View File

@ -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__

View File

@ -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;
}

View File

@ -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)

View File

@ -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

View File

@ -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
View 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);
}

View File

@ -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) {