1 /* radare2 - LGPL - Copyright 2017-2020 - condret, pancake, alvaro */
2 
3 #ifndef R2_IO_H
4 #define R2_IO_H
5 
6 #include "r_list.h"
7 #include <r_util.h>
8 #include "r_socket.h"
9 #include "r_vector.h"
10 #include "r_skyline.h"
11 
12 #define R_IO_SEEK_SET	0
13 #define R_IO_SEEK_CUR	1
14 #define R_IO_SEEK_END	2
15 
16 #define R_IO_UNDOS 64
17 
18 #define r_io_map_begin(map) r_itv_begin (map->itv)
19 #define r_io_map_to(map) ( r_itv_end (map->itv) - 1 )
20 #define r_io_map_end(map) r_itv_end (map->itv)
21 #define r_io_map_size(map) r_itv_size (map->itv)
22 #define r_io_map_contain(map, addr) r_itv_contain (map->itv, addr)
23 
24 #define r_io_map_set_begin(map, new_addr)	\
25 	do {					\
26 		map->itv.addr = new_addr;	\
27 	} while (0)
28 #define r_io_map_set_size(map, new_size)	\
29 	do {					\
30 		map->itv.size = new_size;	\
31 	} while (0)
32 
33 #if HAVE_PTRACE
34 
35 #if __sun
36 #include <sys/types.h>
37 #else
38 #if DEBUGGER && HAVE_PTRACE
39 #include <sys/ptrace.h>
40 #endif
41 #endif
42 
43 #if (defined(__GLIBC__) && defined(__linux__))
44 typedef enum __ptrace_request r_ptrace_request_t;
45 typedef void * r_ptrace_data_t;
46 #define R_PTRACE_NODATA NULL
47 #else
48 #if __ANDROID__
49 typedef int r_ptrace_request_t;
50 typedef void * r_ptrace_data_t;
51 #define R_PTRACE_NODATA NULL
52 #else
53 typedef int r_ptrace_request_t;
54 typedef int r_ptrace_data_t;
55 #define R_PTRACE_NODATA 0
56 #endif
57 #endif
58 #endif
59 
60 #if __cplusplus
61 extern "C" {
62 #endif
63 
64 R_LIB_VERSION_HEADER(r_io);
65 
66 typedef struct r_io_undos_t {
67 	ut64 off;
68 	int cursor;
69 } RIOUndos;
70 
71 typedef struct r_io_undo_t {
72 	int s_enable;
73 	int w_enable;
74 	/* write stuff */
75 	RList *w_list;
76 	int w_init;
77 	/* seek stuff */
78 	int idx;
79 	int undos; /* available undos */
80 	int redos; /* available redos */
81 	RIOUndos seek[R_IO_UNDOS];
82 	/*int fd[R_IO_UNDOS]; // XXX: Must be RIODesc* */
83 } RIOUndo;
84 
85 typedef struct r_io_undo_w_t {
86 	int set;
87 	ut64 off;
88 	ut8 *o;   /* old data */
89 	ut8 *n;   /* new data */
90 	int len;  /* length */
91 } RIOUndoWrite;
92 
93 typedef struct r_io_t {
94 	struct r_io_desc_t *desc; // XXX deprecate... we should use only the fd integer, not hold a weak pointer
95 	ut64 off;
96 	int bits;
97 	int va;		//all of this config stuff must be in 1 int
98 	int ff;
99 	int Oxff;
100 	size_t addrbytes;
101 	int aslr;
102 	int autofd;
103 	int cached;
104 	bool cachemode; // write in cache all the read operations (EXPERIMENTAL)
105 	int p_cache;
106 	RIDPool *map_ids;
107 	RPVector maps; //from tail backwards maps with higher priority are found
108 	RSkyline map_skyline; // map parts that are not covered by others
109 	RIDStorage *files;
110 	RCache *buffer;
111 	RPVector cache;
112 	RSkyline cache_skyline;
113 	ut8 *write_mask;
114 	int write_mask_len;
115 	RIOUndo undo;
116 	SdbList *plugins;
117 	char *runprofile;
118 	char *envprofile;
119 #if USE_PTRACE_WRAP
120 	struct ptrace_wrap_instance_t *ptrace_wrap;
121 #endif
122 #if __WINDOWS__
123 	struct w32dbg_wrap_instance_t *w32dbg_wrap;
124 #endif
125 	char *args;
126 	REvent *event;
127 	PrintfCallback cb_printf;
128 	RCoreBind corebind;
129 } RIO;
130 
131 typedef struct r_io_desc_t {
132 	int fd;
133 	int perm;
134 	char *uri;
135 	char *name;
136 	char *referer;
137 	HtUP/*<ut64, RIODescCache *>*/ *cache;
138 	void *data;
139 	struct r_io_plugin_t *plugin;
140 	RIO *io;
141 } RIODesc;
142 
143 typedef struct {
144 	ut32 magic;
145 	int pid;
146 	int tid;
147 	void *data;
148 } RIODescData;
149 
150 // Move somewhere else?
151 typedef struct {
152 	RSocket *fd;
153 	RSocket *client;
154 	bool listener;
155 } RIORap;
156 
157 typedef struct r_io_plugin_t {
158 	const char *name;
159 	const char *desc;
160 	const char *version;
161 	const char *author;
162 	const char *license;
163 	void *widget;
164 	const char *uris;
165 	int (*listener)(RIODesc *io);
166 	int (*init)(void);
167 	RIOUndo undo;
168 	bool isdbg;
169 	// int (*is_file_opened)(RIO *io, RIODesc *fd, const char *);
170 	char *(*system)(RIO *io, RIODesc *fd, const char *);
171 	RIODesc* (*open)(RIO *io, const char *, int perm, int mode);
172 	RList* /*RIODesc* */ (*open_many)(RIO *io, const char *, int perm, int mode);
173 	int (*read)(RIO *io, RIODesc *fd, ut8 *buf, int count);
174 	ut64 (*lseek)(RIO *io, RIODesc *fd, ut64 offset, int whence);
175 	int (*write)(RIO *io, RIODesc *fd, const ut8 *buf, int count);
176 	int (*close)(RIODesc *desc);
177 	bool (*is_blockdevice)(RIODesc *desc);
178 	bool (*is_chardevice)(RIODesc *desc);
179 	int (*getpid)(RIODesc *desc);
180 	int (*gettid)(RIODesc *desc);
181 	bool (*getbase)(RIODesc *desc, ut64 *base);
182 	bool (*resize)(RIO *io, RIODesc *fd, ut64 size);
183 	int (*extend)(RIO *io, RIODesc *fd, ut64 size);
184 	bool (*accept)(RIO *io, RIODesc *desc, int fd);
185 	int (*create)(RIO *io, const char *file, int mode, int type);
186 	bool (*check)(RIO *io, const char *, bool many);
187 } RIOPlugin;
188 
189 typedef struct r_io_map_t {
190 	int fd;
191 	int perm;
192 	ut32 id;
193 	RInterval itv;
194 	ut64 delta; // paddr = itv.addr + delta
195 	char *name;
196 } RIOMap;
197 
198 typedef struct r_io_cache_t {
199 	RInterval itv;
200 	ut8 *data;
201 	ut8 *odata;
202 	int written;
203 } RIOCache;
204 
205 #define R_IO_DESC_CACHE_SIZE (sizeof(ut64) * 8)
206 typedef struct r_io_desc_cache_t {
207 	ut64 cached;
208 	ut8 cdata[R_IO_DESC_CACHE_SIZE];
209 } RIODescCache;
210 
211 struct r_io_bind_t;
212 
213 typedef bool (*RIODescUse)(RIO *io, int fd);
214 typedef RIODesc *(*RIODescGet)(RIO *io, int fd);
215 typedef ut64(*RIODescSize)(RIODesc *desc);
216 typedef RIODesc *(*RIOOpen)(RIO *io, const char *uri, int flags, int mode);
217 typedef RIODesc *(*RIOOpenAt)(RIO *io, const  char *uri, int flags, int mode, ut64 at);
218 typedef bool (*RIOClose)(RIO *io, int fd);
219 typedef bool (*RIOReadAt)(RIO *io, ut64 addr, ut8 *buf, int len);
220 typedef bool (*RIOWriteAt)(RIO *io, ut64 addr, const ut8 *buf, int len);
221 typedef char *(*RIOSystem)(RIO *io, const char* cmd);
222 typedef int (*RIOFdOpen)(RIO *io, const char *uri, int flags, int mode);
223 typedef bool (*RIOFdClose)(RIO *io, int fd);
224 typedef ut64 (*RIOFdSeek)(RIO *io, int fd, ut64 addr, int whence);
225 typedef ut64 (*RIOFdSize)(RIO *io, int fd);
226 typedef bool (*RIOFdResize)(RIO *io, int fd, ut64 newsize);
227 typedef ut64 (*RIOP2V)(RIO *io, ut64 pa);
228 typedef ut64 (*RIOV2P)(RIO *io, ut64 va);
229 typedef int (*RIOFdRead)(RIO *io, int fd, ut8 *buf, int len);
230 typedef int (*RIOFdWrite)(RIO *io, int fd, const ut8 *buf, int len);
231 typedef int (*RIOFdReadAt)(RIO *io, int fd, ut64 addr, ut8 *buf, int len);
232 typedef int (*RIOFdWriteAt)(RIO *io, int fd, ut64 addr, const ut8 *buf, int len);
233 typedef bool (*RIOFdIsDbg)(RIO *io, int fd);
234 typedef const char *(*RIOFdGetName)(RIO *io, int fd);
235 typedef RList *(*RIOFdGetMap)(RIO *io, int fd);
236 typedef bool (*RIOFdRemap)(RIO *io, int fd, ut64 addr);
237 typedef bool (*RIOIsValidOff)(RIO *io, ut64 addr, int hasperm);
238 typedef RIOMap *(*RIOMapGet)(RIO *io, ut64 addr);
239 typedef RIOMap *(*RIOMapGetPaddr)(RIO *io, ut64 paddr);
240 typedef bool (*RIOAddrIsMapped)(RIO *io, ut64 addr);
241 typedef RIOMap *(*RIOMapAdd)(RIO *io, int fd, int flags, ut64 delta, ut64 addr, ut64 size);
242 #if HAVE_PTRACE
243 typedef long (*RIOPtraceFn)(RIO *io, r_ptrace_request_t request, pid_t pid, void *addr, r_ptrace_data_t data);
244 typedef void *(*RIOPtraceFuncFn)(RIO *io, void *(*func)(void *), void *user);
245 #endif
246 
247 typedef struct r_io_bind_t {
248 	int init;
249 	RIO *io;
250 	RIODescUse desc_use;
251 	RIODescGet desc_get;
252 	RIODescSize desc_size;
253 	RIOOpen open;
254 	RIOOpenAt open_at;
255 	RIOClose close;
256 	RIOReadAt read_at;
257 	RIOWriteAt write_at;
258 	RIOSystem system;
259 	RIOFdOpen fd_open;
260 	RIOFdClose fd_close;
261 	RIOFdSeek fd_seek;	//needed for esil
262 	RIOFdSize fd_size;
263 	RIOFdResize fd_resize;
264 	RIOFdRead fd_read;	//needed for esil
265 	RIOFdWrite fd_write;	//needed for esil
266 	RIOFdReadAt fd_read_at;
267 	RIOFdWriteAt fd_write_at;
268 	RIOFdIsDbg fd_is_dbg;
269 	RIOFdGetName fd_get_name;
270 	RIOFdGetMap fd_get_map;
271 	RIOFdRemap fd_remap;
272 	RIOIsValidOff is_valid_offset;
273 	RIOAddrIsMapped addr_is_mapped;
274 	RIOMapGet map_get;
275 	RIOMapGetPaddr map_get_paddr;
276 	RIOMapAdd map_add;
277 	RIOV2P v2p;
278 	RIOP2V p2v;
279 #if HAVE_PTRACE
280 	RIOPtraceFn ptrace;
281 	RIOPtraceFuncFn ptrace_func;
282 #endif
283 } RIOBind;
284 
285 //map.c
286 R_API RIOMap *r_io_map_new(RIO *io, int fd, int flags, ut64 delta, ut64 addr, ut64 size);
287 R_API void r_io_map_init(RIO *io);
288 R_API bool r_io_map_remap(RIO *io, ut32 id, ut64 addr);
289 R_API bool r_io_map_remap_fd(RIO *io, int fd, ut64 addr);
290 R_API ut64 r_io_map_location(RIO *io, ut64 size);
291 R_API bool r_io_map_exists(RIO *io, RIOMap *map);
292 R_API bool r_io_map_exists_for_id(RIO *io, ut32 id);
293 R_API RIOMap *r_io_map_resolve(RIO *io, ut32 id);
294 R_API RIOMap *r_io_map_add(RIO *io, int fd, int flags, ut64 delta, ut64 addr, ut64 size);
295 // same as r_io_map_add but used when many maps need to be added. Call r_io_update when all maps have been added.
296 R_API RIOMap *r_io_map_add_batch(RIO *io, int fd, int flags, ut64 delta, ut64 addr, ut64 size);
297 R_API RIOMap *r_io_map_get(RIO *io, ut64 addr);		//returns the map at vaddr with the highest priority
298 // update the internal state of RIO after a series of _batch operations
299 R_API void r_io_update(RIO *io);
300 R_API bool r_io_map_is_mapped(RIO* io, ut64 addr);
301 R_API RIOMap *r_io_map_get_paddr(RIO *io, ut64 paddr);		//returns the map at paddr with the highest priority
302 R_API void r_io_map_reset(RIO* io);
303 R_API bool r_io_map_del(RIO *io, ut32 id);
304 R_API bool r_io_map_del_for_fd(RIO *io, int fd);
305 R_API bool r_io_map_depriorize(RIO* io, ut32 id);
306 R_API bool r_io_map_priorize(RIO *io, ut32 id);
307 R_API bool r_io_map_priorize_for_fd(RIO *io, int fd);
308 R_API void r_io_map_cleanup(RIO *io);
309 R_API void r_io_map_fini(RIO *io);
310 R_API bool r_io_map_is_in_range(RIOMap *map, ut64 from, ut64 to);
311 R_API void r_io_map_set_name(RIOMap *map, const char *name);
312 R_API void r_io_map_del_name(RIOMap *map);
313 R_API RList* r_io_map_get_for_fd(RIO *io, int fd);
314 R_API bool r_io_map_resize(RIO *io, ut32 id, ut64 newsize);
315 
316 // next free address to place a map.. maybe just unify
317 R_API ut64 r_io_map_next_available(RIO* io, ut64 addr, ut64 size, ut64 load_align);
318 R_API ut64 r_io_map_next_address(RIO* io, ut64 addr);
319 
320 // p2v/v2p
321 
322 R_API ut64 r_io_p2v(RIO *io, ut64 pa);
323 R_API ut64 r_io_v2p(RIO *io, ut64 va);
324 
325 //io.c
326 R_API RIO *r_io_new(void);
327 R_API RIO *r_io_init(RIO *io);
328 R_API RIODesc *r_io_open_nomap(RIO *io, const char *uri, int flags, int mode);		//should return int
329 R_API RIODesc *r_io_open(RIO *io, const char *uri, int flags, int mode);
330 R_API RIODesc *r_io_open_at(RIO *io, const char *uri, int flags, int mode, ut64 at);
331 R_API RList *r_io_open_many(RIO *io, const char *uri, int flags, int mode);
332 R_API RIODesc* r_io_open_buffer(RIO *io, RBuffer *b, int flags, int mode);
333 R_API bool r_io_close(RIO *io);
334 R_API bool r_io_reopen(RIO *io, int fd, int flags, int mode);
335 R_API int r_io_close_all(RIO *io);
336 R_API int r_io_pread_at(RIO *io, ut64 paddr, ut8 *buf, int len);
337 R_API int r_io_pwrite_at(RIO *io, ut64 paddr, const ut8 *buf, int len);
338 R_API bool r_io_vread_at_mapped(RIO* io, ut64 vaddr, ut8* buf, int len);
339 R_API bool r_io_read_at(RIO *io, ut64 addr, ut8 *buf, int len);
340 R_API bool r_io_read_at_mapped(RIO *io, ut64 addr, ut8 *buf, int len);
341 R_API int r_io_nread_at(RIO *io, ut64 addr, ut8 *buf, int len);
342 R_API void r_io_alprint(RList *ls);
343 R_API bool r_io_write_at(RIO *io, ut64 addr, const ut8 *buf, int len);
344 R_API bool r_io_read(RIO *io, ut8 *buf, int len);
345 R_API bool r_io_write(RIO *io, ut8 *buf, int len);
346 R_API ut64 r_io_size(RIO *io);
347 R_API bool r_io_is_listener(RIO *io);
348 R_API char *r_io_system(RIO *io, const char* cmd);
349 R_API bool r_io_resize(RIO *io, ut64 newsize);
350 R_API int r_io_extend_at(RIO *io, ut64 addr, ut64 size);
351 R_API bool r_io_set_write_mask(RIO *io, const ut8 *mask, int len);
352 R_API void r_io_bind(RIO *io, RIOBind *bnd);
353 R_API bool r_io_shift(RIO *io, ut64 start, ut64 end, st64 move);
354 R_API ut64 r_io_seek(RIO *io, ut64 offset, int whence);
355 R_API int r_io_fini(RIO *io);
356 R_API void r_io_free(RIO *io);
357 #define r_io_bind_init(x) memset(&x,0,sizeof(x))
358 
359 R_API bool r_io_plugin_init(RIO *io);
360 R_API bool r_io_plugin_add(RIO *io, RIOPlugin *plugin);
361 R_API int r_io_plugin_list(RIO *io);
362 R_API int r_io_plugin_list_json(RIO *io);
363 R_API int r_io_plugin_read(RIODesc *desc, ut8 *buf, int len);
364 R_API int r_io_plugin_write(RIODesc *desc, const ut8 *buf, int len);
365 R_API int r_io_plugin_read_at(RIODesc *desc, ut64 addr, ut8 *buf, int len);
366 R_API int r_io_plugin_write_at(RIODesc *desc, ut64 addr, const ut8 *buf, int len);
367 R_API RIOPlugin *r_io_plugin_resolve(RIO *io, const char *filename, bool many);
368 R_API RIOPlugin *r_io_plugin_get_default(RIO *io, const char *filename, bool many);
369 
370 /* undo api */
371 // track seeks and writes
372 // TODO: needs cleanup..kinda big?
373 R_API int r_io_undo_init(RIO *io);
374 R_API void r_io_undo_enable(RIO *io, int seek, int write);
375 /* seek undo */
376 R_API RIOUndos *r_io_sundo(RIO *io, ut64 offset);
377 R_API RIOUndos *r_io_sundo_redo(RIO *io);
378 R_API void r_io_sundo_push(RIO *io, ut64 off, int cursor);
379 R_API void r_io_sundo_reset(RIO *io);
380 R_API RList *r_io_sundo_list(RIO *io, int mode);
381 /* write undo */
382 R_API void r_io_wundo_new(RIO *io, ut64 off, const ut8 *data, int len);
383 R_API void r_io_wundo_apply_all(RIO *io, int set);
384 R_API int r_io_wundo_apply(RIO *io, struct r_io_undo_w_t *u, int set);
385 R_API void r_io_wundo_clear(RIO *io);
386 R_API int r_io_wundo_size(RIO *io);
387 R_API void r_io_wundo_list(RIO *io);
388 R_API int r_io_wundo_set_t(RIO *io, RIOUndoWrite *u, int set) ;
389 R_API void r_io_wundo_set_all(RIO *io, int set);
390 R_API int r_io_wundo_set(RIO *io, int n, int set);
391 
392 //desc.c
393 R_API RIODesc *r_io_desc_new(RIO *io, RIOPlugin *plugin, const char *uri, int flags, int mode, void *data);
394 R_API RIODesc *r_io_desc_open(RIO *io, const char *uri, int flags, int mode);
395 R_API RIODesc *r_io_desc_open_plugin(RIO *io, RIOPlugin *plugin, const char *uri, int flags, int mode);
396 R_API bool r_io_desc_close(RIODesc *desc);
397 R_API int r_io_desc_read(RIODesc *desc, ut8 *buf, int count);
398 R_API int r_io_desc_write(RIODesc *desc, const ut8 *buf, int count);
399 R_API void r_io_desc_free(RIODesc *desc);
400 R_API bool r_io_desc_add(RIO *io, RIODesc *desc);
401 R_API bool r_io_desc_del(RIO *io, int fd);
402 R_API RIODesc *r_io_desc_get(RIO *io, int fd);
403 R_API RIODesc *r_io_desc_get_next(RIO *io, RIODesc *desc);
404 R_API RIODesc *r_io_desc_get_prev(RIO *io, RIODesc *desc);
405 R_API RIODesc *r_io_desc_get_highest(RIO *io);
406 R_API RIODesc *r_io_desc_get_lowest(RIO *io);
407 R_API ut64 r_io_desc_seek(RIODesc *desc, ut64 offset, int whence);
408 R_API bool r_io_desc_resize(RIODesc *desc, ut64 newsize);
409 R_API ut64 r_io_desc_size(RIODesc *desc);
410 R_API bool r_io_desc_is_blockdevice(RIODesc *desc);
411 R_API bool r_io_desc_is_chardevice(RIODesc *desc);
412 R_API bool r_io_desc_exchange(RIO *io, int fd, int fdx);	//this should get 2 descs
413 R_API bool r_io_desc_is_dbg(RIODesc *desc);
414 R_API int r_io_desc_get_pid(RIODesc *desc);
415 R_API int r_io_desc_get_tid(RIODesc *desc);
416 R_API bool r_io_desc_get_base(RIODesc *desc, ut64 *base);
417 R_API int r_io_desc_read_at(RIODesc *desc, ut64 addr, ut8 *buf, int len);
418 R_API int r_io_desc_write_at(RIODesc *desc, ut64 addr, const ut8 *buf, int len);
419 
420 /* lifecycle */
421 R_IPI bool r_io_desc_init(RIO *io);
422 R_IPI bool r_io_desc_fini(RIO *io);
423 
424 /* io/cache.c */
425 R_API int r_io_cache_invalidate(RIO *io, ut64 from, ut64 to);
426 R_API bool r_io_cache_at(RIO *io, ut64 addr);
427 R_API void r_io_cache_commit(RIO *io, ut64 from, ut64 to);
428 R_API void r_io_cache_init(RIO *io);
429 R_API void r_io_cache_fini(RIO *io);
430 R_API bool r_io_cache_list(RIO *io, int rad);
431 R_API void r_io_cache_reset(RIO *io, int set);
432 R_API bool r_io_cache_write(RIO *io, ut64 addr, const ut8 *buf, int len);
433 R_API bool r_io_cache_read(RIO *io, ut64 addr, ut8 *buf, int len);
434 
435 /* io/p_cache.c */
436 R_API bool r_io_desc_cache_init(RIODesc *desc);
437 R_API int r_io_desc_cache_write(RIODesc *desc, ut64 paddr, const ut8 *buf, int len);
438 R_API int r_io_desc_cache_read(RIODesc *desc, ut64 paddr, ut8 *buf, int len);
439 R_API bool r_io_desc_cache_commit(RIODesc *desc);
440 R_API void r_io_desc_cache_cleanup(RIODesc *desc);
441 R_API void r_io_desc_cache_fini(RIODesc *desc);
442 R_API void r_io_desc_cache_fini_all(RIO *io);
443 R_API RList *r_io_desc_cache_list(RIODesc *desc);
444 R_API int r_io_desc_extend(RIODesc *desc, ut64 size);
445 
446 /* io/buffer.c */
447 R_API int r_io_buffer_read(RIO* io, ut64 addr, ut8* buf, int len);
448 R_API int r_io_buffer_load(RIO* io, ut64 addr, int len);
449 R_API void r_io_buffer_close(RIO* io);
450 
451 /* io/fd.c */
452 R_API int r_io_fd_open(RIO *io, const char *uri, int flags, int mode);
453 R_API bool r_io_fd_close(RIO *io, int fd);
454 R_API int r_io_fd_read(RIO *io, int fd, ut8 *buf, int len);
455 R_API int r_io_fd_write(RIO *io, int fd, const ut8 *buf, int len);
456 R_API ut64 r_io_fd_seek(RIO *io, int fd, ut64 addr, int whence);
457 R_API ut64 r_io_fd_size(RIO *io, int fd);
458 R_API bool r_io_fd_resize(RIO *io, int fd, ut64 newsize);
459 R_API bool r_io_fd_is_blockdevice(RIO *io, int fd);
460 R_API bool r_io_fd_is_chardevice(RIO *io, int fd);
461 R_API int r_io_fd_read_at(RIO *io, int fd, ut64 addr, ut8 *buf, int len);
462 R_API int r_io_fd_write_at(RIO *io, int fd, ut64 addr, const ut8 *buf, int len);
463 R_API bool r_io_fd_is_dbg(RIO *io, int fd);
464 R_API int r_io_fd_get_pid(RIO *io, int fd);
465 R_API int r_io_fd_get_tid(RIO *io, int fd);
466 R_API bool r_io_fd_get_base(RIO *io, int fd, ut64 *base);
467 R_API const char *r_io_fd_get_name(RIO *io, int fd);
468 R_API int r_io_fd_get_current(RIO *io);
469 R_API bool r_io_use_fd(RIO *io, int fd);
470 R_API int r_io_fd_get_next(RIO *io, int fd);
471 R_API int r_io_fd_get_prev(RIO *io, int fd);
472 R_API int r_io_fd_get_highest(RIO *io);
473 R_API int r_io_fd_get_lowest(RIO *io);
474 
475 
476 #define r_io_range_new()	R_NEW0(RIORange)
477 #define r_io_range_free(x)	free(x)
478 
479 /* io/ioutils.c */
480 R_API bool r_io_is_valid_offset(RIO *io, ut64 offset, int hasperm);
481 R_API bool r_io_addr_is_mapped(RIO *io, ut64 vaddr);
482 R_API bool r_io_read_i(RIO* io, ut64 addr, ut64 *val, int size, bool endian);
483 R_API bool r_io_write_i(RIO* io, ut64 addr, ut64 *val, int size, bool endian);
484 
485 #if HAVE_PTRACE
486 R_API long r_io_ptrace(RIO *io, r_ptrace_request_t request, pid_t pid, void *addr, r_ptrace_data_t data);
487 R_API pid_t r_io_ptrace_fork(RIO *io, void (*child_callback)(void *), void *child_callback_user);
488 R_API void *r_io_ptrace_func(RIO *io, void *(*func)(void *), void *user);
489 #endif
490 
491 extern RIOPlugin r_io_plugin_procpid;
492 extern RIOPlugin r_io_plugin_malloc;
493 extern RIOPlugin r_io_plugin_sparse;
494 extern RIOPlugin r_io_plugin_ptrace;
495 extern RIOPlugin r_io_plugin_w32dbg;
496 extern RIOPlugin r_io_plugin_windbg;
497 extern RIOPlugin r_io_plugin_mach;
498 extern RIOPlugin r_io_plugin_debug;
499 extern RIOPlugin r_io_plugin_shm;
500 extern RIOPlugin r_io_plugin_gdb;
501 extern RIOPlugin r_io_plugin_rap;
502 extern RIOPlugin r_io_plugin_http;
503 extern RIOPlugin r_io_plugin_bfdbg;
504 extern RIOPlugin r_io_plugin_w32;
505 extern RIOPlugin r_io_plugin_zip;
506 extern RIOPlugin r_io_plugin_mmap;
507 extern RIOPlugin r_io_plugin_default;
508 extern RIOPlugin r_io_plugin_ihex;
509 extern RIOPlugin r_io_plugin_self;
510 extern RIOPlugin r_io_plugin_gzip;
511 extern RIOPlugin r_io_plugin_winkd;
512 extern RIOPlugin r_io_plugin_r2pipe;
513 extern RIOPlugin r_io_plugin_r2web;
514 extern RIOPlugin r_io_plugin_qnx;
515 extern RIOPlugin r_io_plugin_r2k;
516 extern RIOPlugin r_io_plugin_tcp;
517 extern RIOPlugin r_io_plugin_bochs;
518 extern RIOPlugin r_io_plugin_null;
519 extern RIOPlugin r_io_plugin_ar;
520 extern RIOPlugin r_io_plugin_rbuf;
521 extern RIOPlugin r_io_plugin_winedbg;
522 extern RIOPlugin r_io_plugin_gprobe;
523 extern RIOPlugin r_io_plugin_fd;
524 
525 #if __cplusplus
526 }
527 #endif
528 
529 #endif
530