2018-01-16 11:13:21 +01:00
/* radare - LGPL - Copyright 2009-2018 - pancake */
2016-09-22 20:31:40 +02:00
2009-02-05 22:08:46 +01:00
# include <r_core.h>
2013-07-17 22:12:14 +02:00
2017-04-30 19:35:14 +02:00
# define NODECB(w,x,y) r_config_set_cb (cfg,w,x,y)
# define NODEICB(w,x,y) r_config_set_i_cb (cfg,w,x,y)
# define SETDESC(x,y) r_config_node_desc (x,y)
# define SETOPTIONS(x, ...) set_options (x, __VA_ARGS__)
# define SETI(x,y,z) SETDESC (r_config_set_i (cfg,x,y), z)
# define SETICB(w,x,y,z) SETDESC (NODEICB (w,x,y), z)
# define SETPREF(x,y,z) SETDESC (r_config_set (cfg,x,y), z)
# define SETCB(w,x,y,z) SETDESC (NODECB (w,x,y), z)
2010-11-20 16:47:15 +01:00
2017-02-23 01:07:17 +01:00
static void set_options ( RConfigNode * node , . . . ) {
va_list argp ;
char * option = NULL ;
va_start ( argp , node ) ;
option = va_arg ( argp , char * ) ;
while ( option ) {
2017-07-21 00:37:49 -07:00
r_list_append ( node - > options , option ) ;
2017-02-23 01:07:17 +01:00
option = va_arg ( argp , char * ) ;
}
va_end ( argp ) ;
}
2017-10-22 23:52:07 +02:00
static bool isGdbPlugin ( RCore * core ) {
if ( core - > io & & core - > io - > desc & & core - > io - > desc - > plugin ) {
if ( core - > io - > desc - > plugin - > name & & ! strcmp ( core - > io - > desc - > plugin - > name , " gdb " ) ) {
return true ;
}
}
return false ;
}
2017-04-30 19:35:14 +02:00
static void print_node_options ( RConfigNode * node ) {
RListIter * iter ;
char * option ;
r_list_foreach ( node - > options , iter , option ) {
r_cons_printf ( " %s \n " , option ) ;
}
}
2016-09-22 20:31:40 +02:00
/* TODO: use loop here */
2016-09-22 20:48:26 +05:30
/*------------------------------------------------------------------------------------------*/
2016-09-22 20:31:40 +02:00
static int compareName ( const RAnalFunction * a , const RAnalFunction * b ) {
return a & & b & & a - > name & & b - > name & & strcmp ( a - > name , b - > name ) ;
2016-09-22 20:48:26 +05:30
}
2016-09-22 20:31:40 +02:00
static int compareNameLen ( const RAnalFunction * a , const RAnalFunction * b ) {
return a & & b & & a - > name & & b - > name & & strlen ( a - > name ) > strlen ( b - > name ) ;
}
static int compareAddress ( const RAnalFunction * a , const RAnalFunction * b ) {
return a & & b & & a - > addr & & b - > addr & & a - > addr > b - > addr ;
}
static int compareType ( const RAnalFunction * a , const RAnalFunction * b ) {
return a & & b & & a - > diff - > type & & b - > diff - > type & & a - > diff - > type > b - > diff - > type ;
}
static int compareSize ( const RAnalFunction * a , const RAnalFunction * b ) {
// return a && b && a->_size < b->_size;
return a & & b & & r_anal_fcn_realsize ( a ) > r_anal_fcn_realsize ( b ) ;
}
static int compareDist ( const RAnalFunction * a , const RAnalFunction * b ) {
return a & & b & & a - > diff - > dist & & b - > diff - > dist & & a - > diff - > dist > b - > diff - > dist ;
}
static int cb_diff_sort ( void * _core , void * _node ) {
RConfigNode * node = _node ;
const char * column = node - > value ;
RCore * core = _core ;
if ( column & & strcmp ( column , " ? " ) ) {
if ( ! strcmp ( column , " name " ) ) {
core - > anal - > columnSort = ( RListComparator ) compareName ;
} else if ( ! strcmp ( column , " namelen " ) ) {
core - > anal - > columnSort = ( RListComparator ) compareNameLen ;
} else if ( ! strcmp ( column , " addr " ) ) {
core - > anal - > columnSort = ( RListComparator ) compareAddress ;
} else if ( ! strcmp ( column , " type " ) ) {
core - > anal - > columnSort = ( RListComparator ) compareType ;
} else if ( ! strcmp ( column , " size " ) ) {
core - > anal - > columnSort = ( RListComparator ) compareSize ;
} else if ( ! strcmp ( column , " dist " ) ) {
core - > anal - > columnSort = ( RListComparator ) compareDist ;
} else {
goto fail ;
}
return true ;
}
fail :
eprintf ( " e diff.sort = [name, namelen, addr, type, size, dist] \n " ) ;
return false ;
}
2016-09-22 20:48:26 +05:30
2014-08-24 14:35:30 +02:00
static const char * has_esil ( RCore * core , const char * name ) {
RListIter * iter ;
RAnalPlugin * h ;
2017-05-29 15:00:51 +02:00
if ( ! core | | ! core - > anal | | ! name ) {
return NULL ;
}
2014-08-24 14:35:30 +02:00
RAnal * a = core - > anal ;
r_list_foreach ( a - > plugins , iter , h ) {
if ( ! strcmp ( name , h - > name ) ) {
2016-07-03 20:05:01 +02:00
return h - > esil ? " Ae " : " A_ " ;
2014-08-24 14:35:30 +02:00
}
}
return " __ " ;
}
2014-04-10 22:18:26 +02:00
// copypasta from binr/rasm2/rasm2.c
2016-05-19 00:38:33 +02:00
static void rasm2_list ( RCore * core , const char * arch , int fmt ) {
2014-04-10 22:18:26 +02:00
int i ;
2014-08-24 14:35:30 +02:00
const char * feat2 , * feat ;
RAsm * a = core - > assembler ;
2014-04-10 22:18:26 +02:00
char bits [ 32 ] ;
RAsmPlugin * h ;
RListIter * iter ;
2016-05-19 00:38:33 +02:00
if ( fmt = = ' j ' ) {
2016-09-22 20:31:40 +02:00
r_cons_print ( " { " ) ;
2016-05-19 00:38:33 +02:00
}
2014-04-10 22:18:26 +02:00
r_list_foreach ( a - > plugins , iter , h ) {
if ( arch & & * arch ) {
if ( h - > cpus & & ! strcmp ( arch , h - > name ) ) {
char * c = strdup ( h - > cpus ) ;
int n = r_str_split ( c , ' , ' ) ;
2016-09-22 20:31:40 +02:00
for ( i = 0 ; i < n ; i + + ) {
2016-06-26 00:51:17 -04:00
r_cons_println ( r_str_word_get0 ( c , i ) ) ;
}
2014-04-10 22:18:26 +02:00
free ( c ) ;
break ;
}
} else {
bits [ 0 ] = 0 ;
2014-09-12 20:18:55 +02:00
/* The underscore makes it easier to distinguish the
* columns */
2014-07-02 23:18:50 +02:00
if ( h - > bits & 8 ) strcat ( bits , " _8 " ) ;
if ( h - > bits & 16 ) strcat ( bits , " _16 " ) ;
if ( h - > bits & 32 ) strcat ( bits , " _32 " ) ;
if ( h - > bits & 64 ) strcat ( bits , " _64 " ) ;
if ( ! * bits ) strcat ( bits , " _0 " ) ;
2014-08-24 14:35:30 +02:00
feat = " __ " ;
2014-04-10 22:18:26 +02:00
if ( h - > assemble & & h - > disassemble ) feat = " ad " ;
if ( h - > assemble & & ! h - > disassemble ) feat = " a_ " ;
if ( ! h - > assemble & & h - > disassemble ) feat = " _d " ;
2014-08-24 14:35:30 +02:00
feat2 = has_esil ( core , h - > name ) ;
2016-05-19 00:38:33 +02:00
if ( fmt = = ' q ' ) {
2016-06-26 00:51:17 -04:00
r_cons_println ( h - > name ) ;
2016-05-19 00:38:33 +02:00
} else if ( fmt = = ' j ' ) {
const char * str_bits = " 32, 64 " ;
const char * license = " GPL " ;
r_cons_printf ( " \" %s \" :{ \" bits \" :[%s], \" license \" : \" %s \" , \" description \" : \" %s \" , \" features \" : \" %s \" }%s " ,
h - > name , str_bits , license , h - > desc , feat , iter - > n ? " , " : " " ) ;
} else {
r_cons_printf ( " %s%s %-9s %-11s %-7s %s \n " ,
feat , feat2 , bits , h - > name ,
h - > license ? h - > license : " unknown " , h - > desc ) ;
}
2014-04-10 22:18:26 +02:00
}
}
2016-05-19 00:38:33 +02:00
if ( fmt = = ' j ' ) {
2016-09-22 20:31:40 +02:00
r_cons_print ( " } \n " ) ;
2016-05-19 00:38:33 +02:00
}
2014-04-10 22:18:26 +02:00
}
2013-06-09 03:25:32 +02:00
static inline void __setsegoff ( RConfig * cfg , const char * asmarch , int asmbits ) {
2016-08-07 17:37:33 +02:00
int autoseg = ( ! strncmp ( asmarch , " x86 " , 3 ) & & asmbits = = 16 ) ;
2016-01-26 23:36:02 +01:00
r_config_set ( cfg , " asm.segoff " , r_str_bool ( autoseg ) ) ;
2013-06-09 01:21:06 +02:00
}
2016-09-01 19:11:46 +02:00
static int cb_debug_hitinfo ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > dbg - > hitinfo = node - > i_value ;
return true ;
}
2017-10-29 11:29:07 +01:00
static int cb_analarmthumb ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . armthumb = node - > i_value ;
return true ;
}
2014-10-20 23:13:38 +02:00
static int cb_analeobjmp ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2015-09-07 00:30:48 +02:00
core - > anal - > opt . eobjmp = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-10-20 23:13:38 +02:00
}
2014-11-02 02:01:09 +01:00
2018-02-07 00:02:40 +01:00
static int cb_analdepth ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . depth = node - > i_value ;
return true ;
}
2014-11-27 11:42:12 +01:00
static int cb_analafterjmp ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2015-09-07 00:30:48 +02:00
core - > anal - > opt . afterjmp = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-11-27 11:42:12 +01:00
}
2018-06-24 23:17:58 +02:00
static int cb_anal_endsize ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . endsize = node - > i_value ;
return true ;
}
2018-05-16 02:44:09 +05:30
static int cb_analvars ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . vars = node - > i_value ;
return true ;
}
2017-05-22 02:27:33 +02:00
static int cb_analstrings ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
r_config_set ( core - > config , " bin.strings " , " false " ) ;
}
return true ;
}
2014-11-02 02:01:09 +01:00
static int cb_analsleep ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > sleep = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-11-02 02:01:09 +01:00
}
2014-11-26 01:12:54 +01:00
static int cb_analmaxrefs ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > maxreflines = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-11-26 01:12:54 +01:00
}
2014-09-14 11:52:30 +02:00
static int cb_analnopskip ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2015-09-07 00:30:48 +02:00
core - > anal - > opt . nopskip = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-09-14 11:52:30 +02:00
}
2016-09-05 20:42:04 +02:00
static int cb_analhpskip ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . hpskip = node - > i_value ;
return true ;
}
2016-07-03 20:05:01 +02:00
/* obey section permissions */
2015-07-05 01:44:45 +02:00
static int cb_analnoncode ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2016-07-03 20:05:01 +02:00
core - > anal - > opt . noncode = ! ! node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2015-07-05 01:44:45 +02:00
}
2017-04-30 19:35:14 +02:00
static void update_analarch_options ( RCore * core , RConfigNode * node ) {
RAnalPlugin * h ;
RListIter * it ;
2017-08-31 23:30:26 +02:00
if ( core & & core - > anal & & node ) {
r_list_purge ( node - > options ) ;
r_list_foreach ( core - > anal - > plugins , it , h ) {
SETOPTIONS ( node , h - > name , NULL ) ;
}
2017-04-30 19:35:14 +02:00
}
}
2014-02-06 00:08:46 +04:00
static int cb_analarch ( void * user , void * data ) {
2013-11-05 02:58:00 +01:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( * node - > value = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
update_analarch_options ( core , node ) ;
print_node_options ( node ) ;
2015-09-14 12:35:38 +02:00
return false ;
2013-11-05 02:58:00 +01:00
}
2016-07-03 20:05:01 +02:00
if ( * node - > value ) {
if ( r_anal_use ( core - > anal , node - > value ) ) {
return true ;
}
const char * aa = r_config_get ( core - > config , " asm.arch " ) ;
if ( ! aa | | strcmp ( aa , node - > value ) ) {
eprintf ( " anal.arch: cannot find '%s' \n " , node - > value ) ;
2017-12-03 16:03:40 +01:00
} else {
2017-12-24 19:01:51 +01:00
r_config_set ( core - > config , " anal.arch " , " null " ) ;
return true ;
2016-07-03 20:05:01 +02:00
}
}
return false ;
2013-11-05 02:58:00 +01:00
}
2014-02-06 00:08:46 +04:00
static int cb_analcpu ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
r_anal_set_cpu ( core - > anal , node - > value ) ;
2018-04-24 13:10:47 +02:00
/* set pcalign */
{
int v = r_anal_archinfo ( core - > anal , R_ANAL_ARCHINFO_ALIGN ) ;
r_config_set_i ( core - > config , " asm.pcalign " , ( v ! = - 1 ) ? v : 0 ) ;
}
2015-09-14 12:35:38 +02:00
return true ;
2014-02-06 00:08:46 +04:00
}
2015-02-23 15:39:54 +01:00
static int cb_analrecont ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2015-09-07 00:30:48 +02:00
core - > anal - > opt . recont = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2015-02-23 15:39:54 +01:00
}
2018-04-18 18:20:03 +08:00
static int cb_analijmp ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . ijmp = node - > i_value ;
return true ;
}
2018-05-13 16:32:16 +08:00
static int cb_asmvarsubmin ( void * user , void * data ) {
2017-06-28 01:29:04 +02:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > parser - > minval = node - > i_value ;
return true ;
}
2017-08-31 01:11:34 +02:00
static int cb_scrrainbow ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
core - > print - > flags | = R_PRINT_FLAGS_RAINBOW ;
} else {
core - > print - > flags & = ( ~ R_PRINT_FLAGS_RAINBOW ) ;
}
r_print_set_flags ( core - > print , core - > print - > flags ) ;
return true ;
}
2017-03-28 22:55:58 +02:00
static int cb_asmsecsub ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
core - > print - > flags | = R_PRINT_FLAGS_SECSUB ;
} else {
core - > print - > flags & = ( ~ R_PRINT_FLAGS_SECSUB ) ;
}
r_print_set_flags ( core - > print , core - > print - > flags ) ;
return true ;
}
2016-05-30 18:53:32 +02:00
static int cb_asmassembler ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
r_asm_use_assembler ( core - > assembler , node - > value ) ;
return true ;
}
2017-04-30 19:35:14 +02:00
static void update_asmcpu_options ( RCore * core , RConfigNode * node ) {
RAsmPlugin * h ;
RListIter * iter ;
2017-05-01 15:58:49 +02:00
if ( ! core | | ! core - > assembler ) {
return ;
}
2017-04-30 19:35:14 +02:00
const char * arch = r_config_get ( core - > config , " asm.arch " ) ;
2017-05-01 15:58:49 +02:00
if ( ! arch | | ! * arch ) {
2017-04-30 19:35:14 +02:00
return ;
}
r_list_purge ( node - > options ) ;
r_list_foreach ( core - > assembler - > plugins , iter , h ) {
if ( h - > cpus & & ! strcmp ( arch , h - > name ) ) {
char * c = strdup ( h - > cpus ) ;
int i , n = r_str_split ( c , ' , ' ) ;
for ( i = 0 ; i < n ; i + + ) {
SETOPTIONS ( node , r_str_word_get0 ( c , i ) , NULL ) ;
}
free ( c ) ;
}
}
}
static int cb_asmcpu ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( * node - > value = = ' ? ' ) {
update_asmcpu_options ( core , node ) ;
/* print verbose help instead of plain option listing */
rasm2_list ( core , r_config_get ( core - > config , " asm.arch " ) , node - > value [ 1 ] ) ;
return 0 ;
}
r_asm_set_cpu ( core - > assembler , node - > value ) ;
r_config_set ( core - > config , " anal.cpu " , node - > value ) ;
return true ;
}
static void update_asmarch_options ( RCore * core , RConfigNode * node ) {
RAsmPlugin * h ;
RListIter * iter ;
2017-08-31 23:30:26 +02:00
if ( core & & node & & core - > assembler ) {
r_list_purge ( node - > options ) ;
r_list_foreach ( core - > assembler - > plugins , iter , h ) {
SETOPTIONS ( node , h - > name , NULL ) ;
}
2017-04-30 19:35:14 +02:00
}
}
2013-11-05 02:58:00 +01:00
static int cb_asmarch ( void * user , void * data ) {
2014-06-10 11:48:02 +02:00
char asmparser [ 32 ] ;
2013-11-05 02:58:00 +01:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2017-07-25 22:09:09 +05:30
const char * asmos = NULL ;
2015-08-31 12:46:29 +02:00
int bits = R_SYS_BITS ;
2016-12-04 19:54:01 +01:00
if ( ! * node - > value | | ! core | | ! core - > assembler ) {
return false ;
}
2016-12-19 17:10:52 +01:00
asmos = r_config_get ( core - > config , " asm.os " ) ;
2016-12-04 19:54:01 +01:00
if ( core & & core - > anal & & core - > anal - > bits ) {
2015-08-31 13:54:24 +02:00
bits = core - > anal - > bits ;
2015-08-31 12:46:29 +02:00
}
2017-08-27 18:27:53 +02:00
if ( node - > value [ 0 ] = = ' ? ' ) {
2018-06-13 01:20:12 +02:00
update_asmarch_options ( core , node ) ;
2017-08-27 18:27:53 +02:00
if ( strlen ( node - > value ) > 1 & & node - > value [ 1 ] = = ' ? ' ) {
/* print more verbose help instead of plain option values */
rasm2_list ( core , NULL , node - > value [ 1 ] ) ;
return false ;
} else {
print_node_options ( node ) ;
return false ;
}
2014-04-10 22:18:26 +02:00
}
2015-08-31 13:54:24 +02:00
r_egg_setup ( core - > egg , node - > value , bits , 0 , R_SYS_OS ) ;
2016-05-19 00:38:33 +02:00
if ( ! r_asm_use ( core - > assembler , node - > value ) ) {
eprintf ( " asm.arch: cannot find (%s) \n " , node - > value ) ;
return false ;
}
2017-01-25 23:20:20 +01:00
//we should strdup here otherwise will crash if any r_config_set
//free the old value
char * asm_cpu = strdup ( r_config_get ( core - > config , " asm.cpu " ) ) ;
2016-11-16 01:25:26 +01:00
if ( core - > assembler - > cur ) {
const char * newAsmCPU = core - > assembler - > cur - > cpus ;
if ( newAsmCPU ) {
if ( * newAsmCPU ) {
char * nac = strdup ( newAsmCPU ) ;
char * comma = strchr ( nac , ' , ' ) ;
if ( comma ) {
* comma = 0 ;
r_config_set ( core - > config , " asm.cpu " , nac ) ;
}
2016-12-04 19:54:01 +01:00
free ( nac ) ;
2016-11-16 01:25:26 +01:00
} else {
r_config_set ( core - > config , " asm.cpu " , " " ) ;
}
}
2015-08-31 13:54:24 +02:00
bits = core - > assembler - > cur - > bits ;
2016-08-07 17:37:33 +02:00
if ( 8 & bits ) {
bits = 8 ;
} else if ( 16 & bits ) {
bits = 16 ;
} else if ( 32 & bits ) {
bits = 32 ;
} else {
bits = 64 ;
}
2015-08-31 13:54:24 +02:00
}
2014-06-10 11:48:02 +02:00
snprintf ( asmparser , sizeof ( asmparser ) , " %s.pseudo " , node - > value ) ;
r_config_set ( core - > config , " asm.parser " , asmparser ) ;
2016-12-04 19:54:01 +01:00
if ( core - > assembler - > cur & & core - > anal & &
! ( core - > assembler - > cur - > bits & core - > anal - > bits ) ) {
2014-06-10 11:48:02 +02:00
r_config_set_i ( core - > config , " asm.bits " , bits ) ;
2013-11-05 02:58:00 +01:00
}
2015-08-31 12:46:29 +02:00
2015-10-22 03:11:03 +02:00
//r_debug_set_arch (core->dbg, r_sys_arch_id (node->value), bits);
r_debug_set_arch ( core - > dbg , node - > value , bits ) ;
2013-12-07 14:25:15 +01:00
if ( ! r_config_set ( core - > config , " anal.arch " , node - > value ) ) {
2013-11-05 02:58:00 +01:00
char * p , * s = strdup ( node - > value ) ;
2015-11-05 16:45:45 +01:00
if ( s ) {
p = strchr ( s , ' . ' ) ;
2016-08-10 18:49:44 +02:00
if ( p ) {
* p = 0 ;
}
2015-11-05 16:45:45 +01:00
if ( ! r_config_set ( core - > config , " anal.arch " , s ) ) {
/* fall back to the anal.null plugin */
r_config_set ( core - > config , " anal.arch " , " null " ) ;
}
free ( s ) ;
2014-09-27 03:10:44 +02:00
}
2013-11-05 02:58:00 +01:00
}
2015-11-02 18:57:01 +01:00
// set pcalign
2016-12-04 19:54:01 +01:00
if ( core - > anal ) {
2018-01-24 15:12:33 +01:00
const char * asmcpu = r_config_get ( core - > config , " asm.cpu " ) ;
if ( ! r_syscall_setup ( core - > anal - > syscall , node - > value , core - > anal - > bits , asmcpu , asmos ) ) {
2016-12-04 19:54:01 +01:00
//eprintf ("asm.arch: Cannot setup syscall '%s/%s' from '%s'\n",
// node->value, asmos, R2_LIBDIR"/radare2/"R2_VERSION"/syscall");
}
2013-11-05 02:58:00 +01:00
}
//if (!strcmp (node->value, "bf"))
// r_config_set (core->config, "dbg.backend", "bf");
__setsegoff ( core - > config , node - > value , core - > assembler - > bits ) ;
2016-05-10 21:12:50 +01:00
2016-04-26 19:09:15 +10:00
// set a default endianness
int bigbin = r_bin_is_big_endian ( core - > bin ) ;
if ( bigbin = = - 1 /* error: no endianness detected in binary */ ) {
2018-02-27 22:28:33 +01:00
bigbin = r_config_get_i ( core - > config , " cfg.bigendian " ) ;
2016-04-26 19:09:15 +10:00
}
2018-02-27 22:28:33 +01:00
// try to set endian of RAsm to match binary
r_asm_set_big_endian ( core - > assembler , bigbin ) ;
// set endian of display to match binary
core - > print - > big_endian = bigbin ;
2017-01-24 13:57:17 +01:00
r_asm_set_cpu ( core - > assembler , asm_cpu ) ;
2017-01-25 23:20:20 +01:00
free ( asm_cpu ) ;
2017-04-30 19:35:14 +02:00
RConfigNode * asmcpu = r_config_node_get ( core - > config , " asm.cpu " ) ;
if ( asmcpu ) {
update_asmcpu_options ( core , asmcpu ) ;
}
2018-04-24 13:10:47 +02:00
{
int v = r_anal_archinfo ( core - > anal , R_ANAL_ARCHINFO_ALIGN ) ;
if ( v ! = - 1 ) {
r_config_set_i ( core - > config , " asm.pcalign " , v ) ;
} else {
r_config_set_i ( core - > config , " asm.pcalign " , 0 ) ;
}
}
2016-08-16 11:56:55 +02:00
/* reload types and cc info */
2017-01-29 22:29:09 +02:00
// changing asm.arch changes anal.arch
// changing anal.arch sets types db
// so ressetting is redundant and may lead to bugs
// 1 case this is usefull is when sdb_types is null
2017-04-17 22:02:04 +02:00
if ( ! core - > anal | | ! core - > anal - > sdb_types ) {
2017-01-29 22:29:09 +02:00
r_core_anal_type_init ( core ) ;
}
2016-08-16 11:56:55 +02:00
r_core_anal_cc_init ( core ) ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
2014-09-26 13:57:03 +02:00
static int cb_dbgbpsize ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > dbg - > bpsize = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-09-26 13:57:03 +02:00
}
2015-08-22 20:19:33 +08:00
static int cb_dbgbtdepth ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > dbg - > btdepth = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2015-08-22 20:19:33 +08:00
}
2013-11-05 02:58:00 +01:00
static int cb_asmbits ( void * user , void * data ) {
2018-01-24 15:12:33 +01:00
const char * asmos , * asmarch , * asmcpu ;
2013-11-05 02:58:00 +01:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2016-04-08 13:36:15 +02:00
int ret = 0 , bits ;
2014-05-22 11:22:48 +02:00
if ( ! core ) {
eprintf ( " user can't be NULL \n " ) ;
2015-09-14 12:35:38 +02:00
return false ;
2014-05-22 11:22:48 +02:00
}
2016-04-08 13:36:15 +02:00
bits = node - > i_value ;
2018-04-28 10:00:28 +02:00
#if 0
// TODO: pretty good optimization, but breaks many tests when arch is different i think
if ( bits = = core - > assembler - > bits & & bits = = core - > anal - > bits & & bits = = core - > dbg - > bits ) {
// early optimization
return true ;
}
# endif
2016-04-08 13:36:15 +02:00
if ( bits > 0 ) {
ret = r_asm_set_bits ( core - > assembler , bits ) ;
2016-08-10 18:49:44 +02:00
if ( ! ret ) {
2016-04-08 13:36:15 +02:00
RAsmPlugin * h = core - > assembler - > cur ;
2018-05-30 18:47:45 +02:00
if ( ! h ) {
2016-04-08 13:36:15 +02:00
eprintf ( " e asm.bits: Cannot set value, no plugins defined yet \n " ) ;
ret = true ;
}
2018-05-30 18:47:45 +02:00
// else { eprintf ("Cannot set bits %d to '%s'\n", bits, h->name); }
2013-11-05 02:58:00 +01:00
}
2016-08-10 18:49:44 +02:00
if ( ! r_anal_set_bits ( core - > anal , bits ) ) {
2016-04-08 13:36:15 +02:00
eprintf ( " asm.arch: Cannot setup '%d' bits analysis engine \n " , bits ) ;
}
core - > print - > bits = bits ;
2013-11-05 02:58:00 +01:00
}
2015-09-22 01:49:14 +02:00
if ( core - > dbg & & core - > anal & & core - > anal - > cur ) {
2016-04-08 13:36:15 +02:00
r_debug_set_arch ( core - > dbg , core - > anal - > cur - > arch , bits ) ;
2017-11-04 15:36:38 +01:00
bool load_from_debug = r_config_get_i ( core - > config , " cfg.debug " ) ;
2015-05-21 02:26:54 +02:00
if ( load_from_debug ) {
if ( core - > dbg - > h & & core - > dbg - > h - > reg_profile ) {
2017-11-04 15:36:38 +01:00
// XXX. that should depend on the plugin, not the host os
2016-12-28 12:11:32 +01:00
# if __WINDOWS__
2017-06-24 21:25:12 +02:00
# if !defined(__MINGW64__) && !defined(_WIN64)
2016-12-28 12:11:32 +01:00
core - > dbg - > bits = R_SYS_BITS_32 ;
# else
core - > dbg - > bits = R_SYS_BITS_64 ;
# endif
# endif
2015-05-21 02:26:54 +02:00
char * rp = core - > dbg - > h - > reg_profile ( core - > dbg ) ;
r_reg_set_profile_string ( core - > dbg - > reg , rp ) ;
r_reg_set_profile_string ( core - > anal - > reg , rp ) ;
free ( rp ) ;
}
2017-11-04 15:36:38 +01:00
} else {
( void ) r_anal_set_reg_profile ( core - > anal ) ;
2014-06-26 10:27:10 +02:00
}
}
2013-11-05 02:58:00 +01:00
asmos = r_config_get ( core - > config , " asm.os " ) ;
asmarch = r_config_get ( core - > config , " asm.arch " ) ;
2018-01-24 15:12:33 +01:00
asmcpu = r_config_get ( core - > config , " asm.cpu " ) ;
2014-06-25 03:07:54 +02:00
if ( core - > anal ) {
2018-01-24 15:12:33 +01:00
if ( ! r_syscall_setup ( core - > anal - > syscall , asmarch , bits , asmcpu , asmos ) ) {
2013-11-05 02:58:00 +01:00
//eprintf ("asm.arch: Cannot setup syscall '%s/%s' from '%s'\n",
// node->value, asmos, R2_LIBDIR"/radare2/"R2_VERSION"/syscall");
}
2014-06-25 03:07:54 +02:00
__setsegoff ( core - > config , asmarch , core - > anal - > bits ) ;
2015-06-27 20:31:37 +03:00
if ( core - > dbg ) {
r_bp_use ( core - > dbg - > bp , asmarch , core - > anal - > bits ) ;
2017-12-03 18:57:42 +01:00
r_config_set_i ( core - > config , " dbg.bpsize " , r_bp_size ( core - > dbg - > bp ) ) ;
2015-06-27 20:31:37 +03:00
}
2014-06-25 03:07:54 +02:00
}
2016-07-03 20:05:01 +02:00
/* set pcalign */
2015-10-14 03:19:42 +02:00
{
int v = r_anal_archinfo ( core - > anal , R_ANAL_ARCHINFO_ALIGN ) ;
2017-11-04 15:36:38 +01:00
r_config_set_i ( core - > config , " asm.pcalign " , ( v ! = - 1 ) ? v : 0 ) ;
2015-10-14 03:19:42 +02:00
}
2013-11-05 02:58:00 +01:00
return ret ;
}
2017-04-30 19:35:14 +02:00
static void update_asmfeatures_options ( RCore * core , RConfigNode * node ) {
int i , argc ;
char * features ;
if ( core & & core - > assembler & & core - > assembler - > cur ) {
if ( core - > assembler - > cur - > features ) {
features = strdup ( core - > assembler - > cur - > features ) ;
argc = r_str_split ( features , ' , ' ) ;
for ( i = 0 ; i < argc ; i + + ) {
2018-05-03 18:55:07 +02:00
node - > options - > free = free ;
2017-04-30 19:35:14 +02:00
const char * feature = r_str_word_get0 ( features , i ) ;
2018-05-03 18:55:07 +02:00
r_list_append ( node - > options , strdup ( feature ) ) ;
2017-04-30 19:35:14 +02:00
}
free ( features ) ;
}
}
}
2018-07-02 20:06:09 +02:00
static int cb_flag_realnames ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > flags - > realnames = node - > i_value ;
return true ;
}
2015-02-11 03:50:56 +01:00
static int cb_asmfeatures ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2015-02-18 13:04:59 +01:00
if ( * node - > value = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
update_asmfeatures_options ( core , node ) ;
print_node_options ( node ) ;
2015-02-11 03:50:56 +01:00
return 0 ;
}
free ( core - > assembler - > features ) ;
2015-02-18 13:04:59 +01:00
core - > assembler - > features = NULL ;
2016-07-03 20:05:01 +02:00
if ( node - > value [ 0 ] ) {
2015-02-11 03:50:56 +01:00
core - > assembler - > features = strdup ( node - > value ) ;
2016-07-03 20:05:01 +02:00
}
2015-02-11 03:50:56 +01:00
return 1 ;
}
2013-11-05 02:58:00 +01:00
static int cb_asmlineswidth ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > lineswidth = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
2016-09-03 20:31:30 +02:00
static int cb_emustr ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
r_config_set ( core - > config , " asm.emu " , " true " ) ;
}
return true ;
}
2016-11-20 17:37:27 +01:00
static int cb_emuskip ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
if ( * node - > value = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
if ( strlen ( node - > value ) > 1 & & node - > value [ 1 ] = = ' ? ' ) {
r_cons_printf ( " Concatenation of meta types encoded as characters: \n " \
2016-11-20 17:37:27 +01:00
" 'd': data \n 'c': code \n 's': string \n 'f': format \n 'm': magic \n " \
" 'h': hide \n 'C': comment \n 'r': run \n " \
" (default is 'ds' to skip data and strings) \n " ) ;
2017-04-30 19:35:14 +02:00
} else {
print_node_options ( node ) ;
}
2016-11-20 17:37:27 +01:00
return false ;
}
return true ;
}
2017-08-15 17:47:43 -07:00
static int cb_asm_armimm ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > assembler - > immdisp = node - > i_value ? true : false ;
return true ;
}
2015-08-31 00:20:07 +02:00
static int cb_asm_invhex ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > assembler - > invhex = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2015-08-31 00:20:07 +02:00
}
2015-10-14 02:11:53 +02:00
static int cb_asm_pcalign ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
int align = node - > i_value ;
2016-08-10 18:49:44 +02:00
if ( align < 0 ) {
align = 0 ;
}
2015-10-14 02:11:53 +02:00
core - > assembler - > pcalign = align ;
core - > anal - > pcalign = align ;
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_asmos ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
int asmbits = r_config_get_i ( core - > config , " asm.bits " ) ;
2014-11-04 11:47:42 +01:00
RConfigNode * asmarch , * node = ( RConfigNode * ) data ;
2015-09-01 03:13:16 +02:00
if ( * node - > value = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
print_node_options ( node ) ;
2014-11-04 11:47:42 +01:00
return 0 ;
}
2015-09-01 03:13:16 +02:00
if ( ! node - > value [ 0 ] ) {
free ( node - > value ) ;
node - > value = strdup ( R_SYS_OS ) ;
}
2014-11-04 11:47:42 +01:00
asmarch = r_config_node_get ( core - > config , " asm.arch " ) ;
2013-11-05 02:58:00 +01:00
if ( asmarch ) {
2018-01-24 15:12:33 +01:00
const char * asmcpu = r_config_get ( core - > config , " asm.cpu " ) ;
r_syscall_setup ( core - > anal - > syscall , asmarch - > value , core - > anal - > bits , asmcpu , node - > value ) ;
2013-11-05 02:58:00 +01:00
__setsegoff ( core - > config , asmarch - > value , asmbits ) ;
}
2015-10-30 03:07:22 +01:00
r_anal_set_os ( core - > anal , node - > value ) ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
static int cb_asmparser ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
return r_parse_use ( core - > parser , node - > value ) ;
}
2017-07-02 15:46:59 +08:00
static int cb_asmstrenc ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > value [ 0 ] = = ' ? ' ) {
print_node_options ( node ) ;
2017-08-02 21:55:00 +08:00
r_cons_printf ( " -- if string's 2nd & 4th bytes are 0 then utf16le else "
2017-08-06 09:08:17 +08:00
" if 2nd - 4th & 6th bytes are 0 & no char > 0x10ffff then utf32le else "
2017-08-02 00:18:47 +08:00
" if utf8 char detected then utf8 else latin1 \n " ) ;
2017-07-02 15:46:59 +08:00
return false ;
}
return true ;
}
2015-07-04 23:42:48 +02:00
static int cb_binfilter ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > bin - > filter = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2015-07-04 23:42:48 +02:00
}
2016-05-03 04:31:36 +02:00
/* BinDemangleCmd */
static int cb_bdc ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > bin - > demanglercmd = node - > i_value ;
return true ;
}
2018-01-07 22:08:53 +01:00
static int cb_useldr ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > bin - > use_ldr = node - > i_value ;
return true ;
}
static int cb_usextr ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > bin - > use_xtr = node - > i_value ;
return true ;
}
2016-05-03 04:31:36 +02:00
2015-10-13 03:50:14 +02:00
static int cb_strpurge ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2018-01-23 21:08:33 +08:00
if ( * node - > value = = ' ? ' ) {
r_cons_printf (
" There can be multiple entries separated by commas. No whitespace before/after entries. \n "
" Possible entries: \n "
2018-01-28 06:33:51 +08:00
" all : purge all strings \n "
2018-01-23 21:08:33 +08:00
" true : use the false_positive() classifier in cbin.c \n "
" addr : purge string at addr \n "
" addr1-addr2 : purge all strings in the range addr1-addr2 inclusive \n "
" !addr : prevent purge of string at addr by prev entries \n "
" !addr1-addr2 : prevent purge of strings in range addr1-addr2 inclusive by prev entries \n "
" Neither !true nor !false is supported. \n "
" \n "
2018-01-28 06:33:51 +08:00
" Examples: \n "
" e bin.strpurge=true,0-0xff,!0x1a \n "
" -- purge strings using the false_positive() classifier in cbin.c and also strings \n "
" with addresses in the range 0-0xff, but not the string at 0x1a. \n "
2018-01-28 10:36:21 +08:00
" e bin.strpurge=all,!0x1000-0x1fff \n "
" -- purge all strings except the strings with addresses in the range 0x1000-0x1fff. \n " ) ;
2018-01-23 21:08:33 +08:00
return false ;
}
2018-01-18 03:34:53 +08:00
free ( core - > bin - > strpurge ) ;
core - > bin - > strpurge = ! * node - > value | | ! strcmp ( node - > value , " false " )
? NULL : strdup ( node - > value ) ;
2015-10-13 03:50:14 +02:00
return true ;
}
2015-12-17 20:18:50 +01:00
static int cb_midflags ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > value [ 0 ] = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
print_node_options ( node ) ;
2015-12-17 20:18:50 +01:00
return false ;
}
return true ;
}
2015-10-13 03:50:14 +02:00
static int cb_strfilter ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > value [ 0 ] = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
if ( strlen ( node - > value ) > 1 & & node - > value [ 1 ] = = ' ? ' ) {
r_cons_printf ( " Valid values for bin.strfilter: \n "
" a only alphanumeric printable \n "
" 8 only strings with utf8 chars \n "
" p file/directory paths \n "
" e email-like addresses \n "
" u urls \n "
" i IPv4 address-like strings \n "
" U only uppercase strings \n "
" f format-strings \n " ) ;
} else {
print_node_options ( node ) ;
}
2015-10-13 03:50:14 +02:00
return false ;
} else {
core - > bin - > strfilter = node - > value [ 0 ] ;
}
return true ;
}
2015-01-11 19:40:26 +01:00
static int cb_binforce ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
r_bin_force_plugin ( core - > bin , node - > value ) ;
2015-09-14 12:35:38 +02:00
return true ;
2015-01-11 19:40:26 +01:00
}
2013-11-05 02:58:00 +01:00
static int cb_asmsyntax ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2014-04-11 02:22:41 +02:00
if ( * node - > value = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
print_node_options ( node ) ;
2015-09-14 12:35:38 +02:00
return false ;
2016-10-04 15:01:02 +02:00
} else {
int syntax = r_asm_syntax_from_string ( node - > value ) ;
if ( syntax = = - 1 ) {
return false ;
}
r_asm_set_syntax ( core - > assembler , syntax ) ;
}
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
2017-04-28 14:37:00 +02:00
static int cb_dirzigns ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
free ( core - > anal - > zign_path ) ;
core - > anal - > zign_path = strdup ( node - > value ) ;
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_bigendian ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2016-04-26 19:09:15 +10:00
// Try to set endian based on preference, restrict by RAsmPlugin
bool isbig = r_asm_set_big_endian ( core - > assembler , node - > i_value ) ;
// Set anal endianness the same as asm
r_anal_set_big_endian ( core - > anal , isbig ) ;
2016-09-06 12:02:38 +02:00
// the big endian should also be assigned to dbg->bp->endian
2018-01-16 11:13:21 +01:00
if ( core - > dbg & & core - > dbg - > bp ) {
core - > dbg - > bp - > endian = isbig ;
}
2016-04-26 19:09:15 +10:00
// Set printing endian to user's choice
2013-11-05 02:58:00 +01:00
core - > print - > big_endian = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
static int cb_cfgdatefmt ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2014-04-22 18:39:17 -05:00
snprintf ( core - > print - > datefmt , 32 , " %s " , node - > value ) ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
2015-04-03 23:24:09 +02:00
static int cb_timezone ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > print - > datezone = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2015-04-03 23:24:09 +02:00
}
2017-05-09 02:10:11 +02:00
static int cb_cfglog ( void * user , void * data ) {
2017-05-09 02:58:39 +02:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > cfglog = node - > i_value ;
2017-05-09 02:10:11 +02:00
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_cfgdebug ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2017-12-03 18:57:42 +01:00
if ( ! core ) {
return false ;
}
2015-08-24 16:44:09 +02:00
if ( core - > io ) {
2018-07-31 11:26:18 +01:00
core - > io - > va = ! node - > i_value ;
2013-11-05 02:58:00 +01:00
core - > io - > debug = node - > i_value ;
2015-08-24 16:44:09 +02:00
}
2013-11-05 02:58:00 +01:00
if ( core - > dbg & & node - > i_value ) {
const char * dbgbackend = r_config_get ( core - > config , " dbg.backend " ) ;
2015-09-14 12:35:38 +02:00
core - > bin - > is_debugger = true ;
2013-11-05 02:58:00 +01:00
r_debug_use ( core - > dbg , dbgbackend ) ;
2015-08-24 04:45:04 +02:00
if ( ! strcmp ( r_config_get ( core - > config , " cmd.prompt " ) , " " ) ) {
r_config_set ( core - > config , " cmd.prompt " , " .dr* " ) ;
}
2017-11-04 15:36:38 +01:00
if ( ! strcmp ( dbgbackend , " bf " ) ) {
2013-11-05 02:58:00 +01:00
r_config_set ( core - > config , " asm.arch " , " bf " ) ;
2017-11-04 15:36:38 +01:00
}
2013-11-05 02:58:00 +01:00
if ( core - > file ) {
2017-08-22 07:42:16 +00:00
r_debug_select ( core - > dbg , r_io_fd_get_pid ( core - > io , core - > file - > fd ) ,
r_io_fd_get_tid ( core - > io , core - > file - > fd ) ) ;
2013-11-05 02:58:00 +01:00
}
2015-01-29 01:45:39 +01:00
} else {
2017-11-04 15:36:38 +01:00
r_debug_use ( core - > dbg , NULL ) ;
2015-09-14 12:35:38 +02:00
core - > bin - > is_debugger = false ;
2015-01-29 01:45:39 +01:00
}
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
2015-10-29 12:37:14 +01:00
static int cb_dirsrc ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
RCore * core = ( RCore * ) user ;
free ( core - > bin - > srcdir ) ;
core - > bin - > srcdir = strdup ( node - > value ) ;
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_cfgsanbox ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
int ret = r_sandbox_enable ( node - > i_value ) ;
2016-07-03 20:05:01 +02:00
if ( node - > i_value ! = ret ) {
2014-06-14 02:52:56 +02:00
eprintf ( " Cannot disable sandbox \n " ) ;
2016-07-03 20:05:01 +02:00
}
2013-11-05 02:58:00 +01:00
return ( ! node - > i_value & & ret ) ? 0 : 1 ;
}
2017-11-22 21:35:09 +08:00
static int cb_str_escbslash ( void * user , void * data ) {
2017-11-22 08:09:58 +08:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > print - > esc_bslash = node - > i_value ;
return true ;
}
2017-09-11 15:41:07 -07:00
static int cb_cfg_fortunes ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
// TODO CN_BOOL option does not receive the right hand side of assignment as an argument
if ( node - > value [ 0 ] = = ' ? ' ) {
r_core_fortune_list ( core ) ;
return false ;
}
return true ;
}
static int cb_cfg_fortunes_type ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > value [ 0 ] = = ' ? ' ) {
r_core_fortune_list_types ( ) ;
return false ;
}
return true ;
}
2018-03-14 12:25:37 +01:00
static int cb_cmdpdc ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > value [ 0 ] = = ' ? ' ) {
2018-03-14 12:31:16 +01:00
r_cons_printf ( " pdc \n " ) ;
2018-03-14 12:25:37 +01:00
return false ;
}
return true ;
}
2017-05-09 02:58:39 +02:00
static int cb_cmdlog ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
R_FREE ( core - > cmdlog ) ;
core - > cmdlog = strdup ( node - > value ) ;
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_cmdrepeat ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > cmdrepeat = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
2014-01-08 23:44:05 +01:00
static int cb_scrnull ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > cons - > null = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-01-08 23:44:05 +01:00
}
2013-11-05 02:58:00 +01:00
static int cb_color ( void * user , void * data ) {
2010-03-11 00:51:32 +01:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2013-11-05 02:58:00 +01:00
if ( node - > i_value ) {
core - > print - > flags | = R_PRINT_FLAGS_COLOR ;
} else {
core - > print - > flags & = ( ~ R_PRINT_FLAGS_COLOR ) ;
}
2018-03-13 11:40:19 +01:00
if ( ! strcmp ( node - > value , " true " ) ) {
node - > i_value = 1 ;
} else if ( ! strcmp ( node - > value , " false " ) ) {
node - > i_value = 0 ;
}
r_cons_singleton ( ) - > color = ( node - > i_value > COLOR_MODE_16M )
? COLOR_MODE_16M : node - > i_value ;
2018-02-24 11:47:38 +01:00
r_cons_pal_update_event ( ) ;
2013-11-05 02:58:00 +01:00
r_print_set_flags ( core - > print , core - > print - > flags ) ;
2015-09-14 12:35:38 +02:00
return true ;
2010-03-11 00:51:32 +01:00
}
2016-11-01 23:30:36 +01:00
static int cb_decoff ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
core - > print - > flags | = R_PRINT_FLAGS_ADDRDEC ;
} else {
core - > print - > flags & = ( ~ R_PRINT_FLAGS_ADDRDEC ) ;
}
r_print_set_flags ( core - > print , core - > print - > flags ) ;
return true ;
}
2014-05-07 23:21:34 +02:00
static int cb_dbgbep ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
if ( * node - > value = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
print_node_options ( node ) ;
2015-09-14 12:35:38 +02:00
return false ;
2014-05-07 23:21:34 +02:00
}
2015-09-14 12:35:38 +02:00
return true ;
2014-05-07 23:21:34 +02:00
}
2014-10-09 01:21:49 +02:00
2015-06-25 16:40:39 +02:00
static int cb_dbg_btalgo ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( * node - > value = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
print_node_options ( node ) ;
2015-09-14 12:35:38 +02:00
return false ;
2015-06-25 16:40:39 +02:00
}
free ( core - > dbg - > btalgo ) ;
core - > dbg - > btalgo = strdup ( node - > value ) ;
2015-09-14 12:35:38 +02:00
return true ;
2015-06-25 16:40:39 +02:00
}
2015-10-13 02:18:14 +02:00
static int cb_dbg_libs ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
free ( core - > dbg - > glob_libs ) ;
core - > dbg - > glob_libs = strdup ( node - > value ) ;
return true ;
}
static int cb_dbg_unlibs ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
free ( core - > dbg - > glob_unlibs ) ;
core - > dbg - > glob_unlibs = strdup ( node - > value ) ;
return true ;
}
2014-10-09 01:21:49 +02:00
static int cb_dbg_forks ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > dbg - > trace_forks = node - > i_value ;
2015-12-14 00:43:16 +01:00
if ( core - > io - > debug ) {
r_debug_attach ( core - > dbg , core - > dbg - > pid ) ;
}
2015-09-14 12:35:38 +02:00
return true ;
2014-10-09 01:21:49 +02:00
}
2017-09-20 13:33:45 +02:00
static int cb_dbg_gdb_page_size ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2017-09-29 17:40:01 +05:30
if ( node - > i_value < 64 ) { // 64 is hardcoded min packet size
return false ;
}
2017-10-22 23:52:07 +02:00
if ( isGdbPlugin ( core ) ) {
2017-09-20 13:33:45 +02:00
char cmd [ 64 ] ;
snprintf ( cmd , sizeof ( cmd ) , " page_size % " PFMT64d , node - > i_value ) ;
2017-10-22 23:52:07 +02:00
free ( r_io_system ( core - > io , cmd ) ) ;
2017-09-20 13:33:45 +02:00
}
return true ;
}
2017-09-29 17:40:01 +05:30
static int cb_dbg_gdb_retries ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value < = 0 ) {
return false ;
}
2017-10-22 23:52:07 +02:00
if ( isGdbPlugin ( core ) ) {
2017-09-29 17:40:01 +05:30
char cmd [ 64 ] ;
snprintf ( cmd , sizeof ( cmd ) , " retries % " PFMT64d , node - > i_value ) ;
2017-10-22 23:52:07 +02:00
free ( r_io_system ( core - > io , cmd ) ) ;
2017-09-29 17:40:01 +05:30
}
return true ;
}
2014-10-09 01:21:49 +02:00
static int cb_dbg_execs ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > dbg - > trace_execs = node - > i_value ;
2015-12-14 00:43:16 +01:00
if ( core - > io - > debug ) {
r_debug_attach ( core - > dbg , core - > dbg - > pid ) ;
}
2015-09-14 12:35:38 +02:00
return true ;
2014-10-09 01:21:49 +02:00
}
static int cb_dbg_clone ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > dbg - > trace_clone = node - > i_value ;
2015-12-14 00:43:16 +01:00
if ( core - > io - > debug ) {
r_debug_attach ( core - > dbg , core - > dbg - > pid ) ;
}
2015-09-14 12:35:38 +02:00
return true ;
2014-10-09 01:21:49 +02:00
}
2017-01-18 00:40:30 +01:00
static int cb_dbg_follow_child ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > dbg - > follow_child = node - > i_value ;
return true ;
}
2016-12-09 22:18:53 +01:00
static int cb_dbg_aftersc ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > dbg - > trace_aftersyscall = node - > i_value ;
if ( core - > io - > debug ) {
r_debug_attach ( core - > dbg , core - > dbg - > pid ) ;
}
return true ;
}
2014-08-11 16:07:17 +02:00
static int cb_runprofile ( void * user , void * data ) {
2014-07-09 02:24:31 +02:00
RCore * r = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
free ( ( void * ) r - > io - > runprofile ) ;
2016-07-03 20:05:01 +02:00
if ( ! node | | ! * ( node - > value ) ) {
r - > io - > runprofile = NULL ;
} else {
r - > io - > runprofile = strdup ( node - > value ) ;
}
2015-09-14 12:35:38 +02:00
return true ;
2014-07-09 02:24:31 +02:00
}
2014-05-07 23:21:34 +02:00
2015-09-30 13:10:49 +02:00
static int cb_dbg_args ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2016-07-03 20:05:01 +02:00
if ( ! node | | ! * ( node - > value ) ) {
core - > io - > args = NULL ;
} else {
core - > io - > args = strdup ( node - > value ) ;
}
2015-09-30 13:10:49 +02:00
return true ;
}
2014-07-02 02:36:41 +02:00
static int cb_dbgstatus ( void * user , void * data ) {
RCore * r = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( r_config_get_i ( r - > config , " cfg.debug " ) ) {
2016-07-03 20:05:01 +02:00
if ( node - > i_value ) {
2014-07-02 02:36:41 +02:00
r_config_set ( r - > config , " cmd.prompt " ,
2015-10-31 01:57:52 +01:00
" .dr*; drd; sr PC;pi 1;s- " ) ;
2016-07-03 20:05:01 +02:00
} else {
r_config_set ( r - > config , " cmd.prompt " , " .dr* " ) ;
}
2014-07-02 02:36:41 +02:00
}
2015-09-14 12:35:38 +02:00
return true ;
2014-07-02 02:36:41 +02:00
}
2013-11-05 02:58:00 +01:00
static int cb_dbgbackend ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2016-10-04 14:34:06 +02:00
if ( ! strcmp ( node - > value , " ? " ) ) {
r_debug_plugin_list ( core - > dbg , ' q ' ) ;
return false ;
}
2016-07-03 20:05:01 +02:00
if ( ! strcmp ( node - > value , " bf " ) ) {
2013-11-05 02:58:00 +01:00
r_config_set ( core - > config , " asm.arch " , " bf " ) ;
2016-07-03 20:05:01 +02:00
}
2013-11-05 02:58:00 +01:00
r_debug_use ( core - > dbg , node - > value ) ;
2015-09-14 12:35:38 +02:00
return true ;
2010-03-12 18:46:11 +01:00
}
2015-04-01 00:38:24 +02:00
static int cb_gotolimit ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( r_sandbox_enable ( 0 ) ) {
eprintf ( " Cannot change gotolimit \n " ) ;
2015-09-14 12:35:38 +02:00
return false ;
2015-04-01 00:38:24 +02:00
}
2016-07-03 20:05:01 +02:00
if ( core - > anal - > esil ) {
2015-04-01 00:38:24 +02:00
core - > anal - > esil_goto_limit = node - > i_value ;
2016-07-03 20:05:01 +02:00
}
2015-09-14 12:35:38 +02:00
return true ;
2015-04-01 00:38:24 +02:00
}
2016-11-14 01:17:58 +01:00
static int cb_esilverbose ( void * user , void * data ) {
2015-03-12 16:45:23 +01:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2016-11-14 01:17:58 +01:00
if ( core - > anal - > esil ) {
core - > anal - > esil - > verbose = node - > i_value ;
}
2015-09-14 12:35:38 +02:00
return true ;
2015-03-12 16:45:23 +01:00
}
2017-03-27 03:39:13 +02:00
static int cb_esilstackdepth ( void * user , void * data ) {
2016-01-19 23:36:21 +00:00
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value < 3 ) {
2017-03-27 03:39:13 +02:00
eprintf ( " esil.stack.depth must be greater than 2 \n " ) ;
2016-01-19 23:36:21 +00:00
node - > i_value = 32 ;
}
return true ;
}
2014-01-09 00:29:00 +01:00
static int cb_fixrows ( void * user , void * data ) {
2010-03-12 18:46:11 +01:00
RConfigNode * node = ( RConfigNode * ) data ;
2016-01-14 23:41:01 +01:00
r_cons_singleton ( ) - > fix_rows = ( int ) node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2010-03-12 18:46:11 +01:00
}
2014-01-09 00:29:00 +01:00
static int cb_fixcolumns ( void * user , void * data ) {
2011-08-27 20:25:37 +02:00
RConfigNode * node = ( RConfigNode * ) data ;
2016-01-14 23:41:01 +01:00
r_cons_singleton ( ) - > fix_columns = atoi ( node - > value ) ;
2015-09-14 12:35:38 +02:00
return true ;
2014-01-09 00:29:00 +01:00
}
static int cb_rows ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
r_cons_singleton ( ) - > force_rows = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2011-08-27 20:25:37 +02:00
}
2017-02-16 18:27:52 +01:00
static int cb_hexcompact ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
core - > print - > flags | = R_PRINT_FLAGS_COMPACT ;
} else {
core - > print - > flags & = ( ~ R_PRINT_FLAGS_COMPACT ) ;
}
return true ;
}
2014-04-10 22:18:26 +02:00
static int cb_hexpairs ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > print - > pairs = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-04-10 22:18:26 +02:00
}
2017-01-18 16:12:06 +01:00
static int cb_hexcomments ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
core - > print - > flags | = R_PRINT_FLAGS_COMMENT ;
} else {
core - > print - > flags & = ~ R_PRINT_FLAGS_COMMENT ;
}
return true ;
}
2017-05-03 17:19:49 +02:00
static int cb_iopcache ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( ( bool ) node - > i_value ) {
2017-08-23 02:35:48 +00:00
if ( core ) {
2017-08-23 12:46:07 +02:00
r_config_set_i ( core - > config , " io.pcache.read " , true ) ;
r_config_set_i ( core - > config , " io.pcache.write " , true ) ;
2017-05-03 17:19:49 +02:00
}
} else {
if ( core & & core - > io ) {
r_io_desc_cache_fini_all ( core - > io ) ;
2017-08-23 12:46:07 +02:00
r_config_set_i ( core - > config , " io.pcache.read " , false ) ;
r_config_set_i ( core - > config , " io.pcache.write " , false ) ;
2017-08-23 02:35:48 +00:00
}
}
return true ;
}
static int cb_iopcacheread ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( ( bool ) node - > i_value ) {
if ( core & & core - > io ) {
core - > io - > p_cache | = 1 ;
}
} else {
if ( core & & core - > io & & core - > io - > p_cache ) {
core - > io - > p_cache & = 2 ;
if ( ! ( core - > io - > p_cache & 2 ) ) {
r_io_desc_cache_fini_all ( core - > io ) ;
2017-08-23 12:46:07 +02:00
r_config_set_i ( core - > config , " io.pcache " , false ) ;
2017-08-23 02:35:48 +00:00
}
}
}
return true ;
}
static int cb_iopcachewrite ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( ( bool ) node - > i_value ) {
if ( core & & core - > io ) {
core - > io - > p_cache | = 2 ;
}
} else {
if ( core & & core - > io & & core - > io - > p_cache ) {
core - > io - > p_cache & = 1 ;
if ( ! ( core - > io - > p_cache & 1 ) ) {
r_io_desc_cache_fini_all ( core - > io ) ;
2017-08-23 12:46:07 +02:00
r_config_set_i ( core - > config , " io.pcache " , false ) ;
2017-08-23 02:35:48 +00:00
}
2017-05-03 17:19:49 +02:00
}
}
return true ;
}
2017-03-25 03:29:03 +01:00
R_API bool r_core_esil_cmd ( RAnalEsil * esil , const char * cmd , ut64 a1 , ut64 a2 ) {
2015-09-08 02:53:33 +02:00
if ( cmd & & * cmd ) {
RCore * core = esil - > anal - > user ;
2017-03-25 03:29:03 +01:00
r_core_cmdf ( core , " %s % " PFMT64d " % " PFMT64d , cmd , a1 , a2 ) ;
2015-09-14 12:35:38 +02:00
return true ;
2015-09-08 02:53:33 +02:00
}
2015-09-14 12:35:38 +02:00
return false ;
2015-09-08 02:53:33 +02:00
}
2017-06-10 20:40:16 +02:00
static int cb_cmd_esil_ioer ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( core & & core - > anal & & core - > anal - > esil ) {
core - > anal - > esil - > cmd = r_core_esil_cmd ;
free ( core - > anal - > esil - > cmd_ioer ) ;
core - > anal - > esil - > cmd_ioer = strdup ( node - > value ) ;
}
return true ;
}
2017-06-10 18:00:07 +02:00
static int cb_cmd_esil_todo ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( core & & core - > anal & & core - > anal - > esil ) {
core - > anal - > esil - > cmd = r_core_esil_cmd ;
2017-06-10 18:53:20 +02:00
free ( core - > anal - > esil - > cmd_todo ) ;
2017-06-10 20:40:16 +02:00
core - > anal - > esil - > cmd_todo = strdup ( node - > value ) ;
2017-06-10 18:00:07 +02:00
}
return true ;
}
2015-09-08 02:53:33 +02:00
static int cb_cmd_esil_intr ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( core & & core - > anal & & core - > anal - > esil ) {
core - > anal - > esil - > cmd = r_core_esil_cmd ;
2017-06-10 18:53:20 +02:00
free ( core - > anal - > esil - > cmd_intr ) ;
core - > anal - > esil - > cmd_intr = strdup ( node - > value ) ;
2015-09-08 02:53:33 +02:00
}
2015-09-14 12:35:38 +02:00
return true ;
2015-09-08 02:53:33 +02:00
}
2017-03-25 03:29:03 +01:00
static int cb_mdevrange ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( core & & core - > anal & & core - > anal - > esil ) {
2017-06-10 18:53:20 +02:00
core - > anal - > esil - > cmd = r_core_esil_cmd ;
free ( core - > anal - > esil - > mdev_range ) ;
core - > anal - > esil - > mdev_range = strdup ( node - > value ) ;
2017-03-25 03:29:03 +01:00
}
return true ;
}
static int cb_cmd_esil_mdev ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( core & & core - > anal & & core - > anal - > esil ) {
core - > anal - > esil - > cmd = r_core_esil_cmd ;
2017-06-10 18:53:20 +02:00
free ( core - > anal - > esil - > cmd_mdev ) ;
core - > anal - > esil - > cmd_mdev = strdup ( node - > value ) ;
2017-03-25 03:29:03 +01:00
}
return true ;
}
2015-09-19 19:39:25 +02:00
static int cb_cmd_esil_trap ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( core & & core - > anal & & core - > anal - > esil ) {
core - > anal - > esil - > cmd = r_core_esil_cmd ;
2017-06-10 20:40:16 +02:00
core - > anal - > esil - > cmd_trap = strdup ( node - > value ) ;
2015-09-19 19:39:25 +02:00
}
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_fsview ( void * user , void * data ) {
2011-05-13 02:31:18 +02:00
int type = R_FS_VIEW_NORMAL ;
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2014-04-11 02:22:41 +02:00
if ( * node - > value = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
print_node_options ( node ) ;
2015-09-14 12:35:38 +02:00
return false ;
2011-05-13 02:31:18 +02:00
}
2016-07-03 20:05:01 +02:00
if ( ! strcmp ( node - > value , " all " ) ) {
2011-05-13 02:31:18 +02:00
type = R_FS_VIEW_ALL ;
2016-07-03 20:05:01 +02:00
}
if ( ! strstr ( node - > value , " del " ) ) {
2011-05-13 02:31:18 +02:00
type | = R_FS_VIEW_DELETED ;
2016-07-03 20:05:01 +02:00
}
if ( ! strstr ( node - > value , " spe " ) ) {
2011-05-13 02:31:18 +02:00
type | = R_FS_VIEW_SPECIAL ;
2016-07-03 20:05:01 +02:00
}
2011-05-13 02:31:18 +02:00
r_fs_view ( core - > fs , type ) ;
2015-09-14 12:35:38 +02:00
return true ;
2011-05-13 02:31:18 +02:00
}
2013-12-22 01:53:15 +01:00
static int cb_cmddepth ( void * user , void * data ) {
2018-05-05 02:08:21 +08:00
RCore * core = ( RCore * ) user ;
2013-12-22 01:53:15 +01:00
int c = R_MAX ( ( ( RConfigNode * ) data ) - > i_value , 0 ) ;
2018-05-05 02:08:21 +08:00
core - > max_cmd_depth = c ;
core - > cmd_depth = c ;
2015-09-14 12:35:38 +02:00
return true ;
2013-12-22 01:53:15 +01:00
}
2013-11-05 02:58:00 +01:00
static int cb_hexcols ( void * user , void * data ) {
2015-10-03 13:33:08 +02:00
RCore * core = ( RCore * ) user ;
2017-05-29 04:36:34 +02:00
int c = R_MIN ( 1024 , R_MAX ( ( ( RConfigNode * ) data ) - > i_value , 0 ) ) ;
if ( c < 0 ) {
c = 0 ;
}
2015-10-03 13:33:08 +02:00
core - > print - > cols = c & ~ 1 ;
2016-02-25 11:35:59 +01:00
core - > dbg - > regcols = c / 4 ;
2015-09-14 12:35:38 +02:00
return true ;
2010-10-27 17:45:53 +02:00
}
2013-11-05 02:58:00 +01:00
static int cb_hexstride ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
( ( RCore * ) user ) - > print - > stride = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2012-07-06 02:17:44 +02:00
}
2015-02-03 00:46:44 +01:00
static int cb_search_kwidx ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > search - > n_kws = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2015-02-03 00:46:44 +01:00
}
2013-11-05 02:58:00 +01:00
static int cb_iobuffer ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
2011-08-27 03:31:55 +02:00
RConfigNode * node = ( RConfigNode * ) data ;
2013-11-05 02:58:00 +01:00
if ( node - > i_value ) {
ut64 from , to ;
from = r_config_get_i ( core - > config , " io.buffer.from " ) ;
to = r_config_get_i ( core - > config , " io.buffer.to " ) ;
if ( from > = to ) {
eprintf ( " ERROR: io.buffer.from >= io.buffer.to "
" (0x% " PFMT64x " >= 0x% " PFMT64x " ) \n " , from , to ) ;
2017-08-19 20:05:21 +02:00
} else {
r_io_buffer_load ( core - > io , from , ( int ) ( to - from ) ) ;
}
2016-07-03 20:05:01 +02:00
} else {
r_io_buffer_close ( core - > io ) ;
}
2016-08-15 13:56:23 -05:00
r_core_block_read ( core ) ;
2015-09-14 12:35:38 +02:00
return true ;
2011-08-27 03:31:55 +02:00
}
2017-12-18 01:44:22 +01:00
static int cb_io_cache_mode ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
core - > io - > cachemode = true ;
} else {
core - > io - > cachemode = false ;
}
return true ;
}
2017-09-15 02:32:01 -07:00
static int cb_io_cache_read ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
core - > io - > cached | = R_IO_READ ;
} else {
core - > io - > cached & = ~ R_IO_READ ;
2015-12-08 14:59:30 +01:00
}
2017-09-15 02:32:01 -07:00
return true ;
}
static int cb_io_cache_write ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
core - > io - > cached | = R_IO_WRITE ;
} else {
core - > io - > cached & = ~ R_IO_WRITE ;
}
return true ;
}
static int cb_io_cache ( void * user , void * data ) {
( void ) cb_io_cache_read ( user , data ) ;
( void ) cb_io_cache_write ( user , data ) ;
2015-09-14 12:35:38 +02:00
return true ;
2011-02-28 00:03:26 +01:00
}
2015-08-16 17:45:23 +02:00
static int cb_ioaslr ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ! = core - > io - > aslr ) {
core - > io - > aslr = node - > i_value ;
}
2015-09-14 12:35:38 +02:00
return true ;
2015-08-16 17:45:23 +02:00
}
2018-07-02 12:19:13 +02:00
static int cb_io_pava ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > pava = node - > i_value ;
if ( node - > i_value & & core - > io - > va ) {
eprintf ( " WARNING: You may probably want to disable io.va too \n " ) ;
}
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_iova ( void * user , void * data ) {
2010-03-04 01:46:25 +01:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2013-11-05 02:58:00 +01:00
if ( node - > i_value ! = core - > io - > va ) {
core - > io - > va = node - > i_value ;
2016-07-03 20:05:01 +02:00
/* ugly fix for r2 -d ... "r2 is going to die soon ..." */
2017-08-22 07:42:16 +00:00
if ( core - > io - > desc ) {
2016-08-15 13:56:23 -05:00
r_core_block_read ( core ) ;
2016-07-03 20:05:01 +02:00
}
2017-06-12 16:37:01 +02:00
#if 0
2016-07-03 20:05:01 +02:00
/* reload symbol information */
if ( r_list_length ( r_bin_get_sections ( core - > bin ) ) > 0 ) {
2013-11-05 02:58:00 +01:00
r_core_cmd0 ( core , " .ia* " ) ;
2016-07-03 20:05:01 +02:00
}
2017-06-12 16:37:01 +02:00
# endif
2013-11-05 02:58:00 +01:00
}
2015-09-14 12:35:38 +02:00
return true ;
2010-02-28 22:58:21 +01:00
}
2014-06-10 11:20:17 +02:00
static int cb_ioff ( void * user , void * data ) {
2011-02-03 09:31:50 +01:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2014-05-28 19:32:29 +02:00
core - > io - > ff = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2011-02-03 09:31:50 +01:00
}
2016-05-03 23:09:00 +02:00
static int cb_io_oxff ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > io - > Oxff = node - > i_value ;
return true ;
}
2017-05-29 03:01:39 +02:00
static int cb_filepath ( void * user , void * data ) {
2017-05-29 14:02:50 +02:00
RCore * core = ( RCore * ) user ;
2017-05-29 03:01:39 +02:00
RConfigNode * node = ( RConfigNode * ) data ;
char * pikaboo = strstr ( node - > value , " :// " ) ;
if ( pikaboo ) {
if ( pikaboo [ 3 ] = = ' / ' ) {
2017-08-11 16:44:24 +08:00
r_config_set ( core - > config , " file.lastpath " , node - > value ) ;
2017-06-01 12:59:39 +02:00
char * ovalue = node - > value ;
2017-05-29 03:01:39 +02:00
node - > value = strdup ( pikaboo + 3 ) ;
2017-06-01 13:19:49 +02:00
free ( ovalue ) ;
2017-05-29 03:01:39 +02:00
return true ;
}
return false ;
}
2017-08-11 16:44:24 +08:00
r_config_set ( core - > config , " file.lastpath " , node - > value ) ;
2017-05-29 03:01:39 +02:00
return true ;
}
2014-06-03 15:55:56 +02:00
static int cb_ioautofd ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > io - > autofd = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-06-03 15:55:56 +02:00
}
2018-01-19 19:50:29 +01:00
static int cb_scr_color_grep ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
/* Let cons know we have a new pager. */
core - > cons - > grep_color = node - > i_value ;
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_pager ( void * user , void * data ) {
2013-06-17 03:26:48 +02:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2013-11-05 02:58:00 +01:00
/* Let cons know we have a new pager. */
core - > cons - > pager = node - > value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-06-17 03:26:48 +02:00
}
2017-07-09 18:35:11 +08:00
static int cb_breaklines ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
r_cons_singleton ( ) - > break_lines = node - > i_value ;
return true ;
}
2014-02-24 16:10:12 +01:00
static int cb_fps ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
r_cons_singleton ( ) - > fps = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-02-24 16:10:12 +01:00
}
2016-12-18 00:55:10 +01:00
static int cb_scrbreakword ( void * user , void * data ) {
2016-12-17 10:42:15 +01:00
RConfigNode * node = ( RConfigNode * ) data ;
if ( * node - > value ) {
r_cons_breakword ( node - > value ) ;
} else {
r_cons_breakword ( NULL ) ;
}
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_scrcolumns ( void * user , void * data ) {
2010-03-04 01:46:25 +01:00
RConfigNode * node = ( RConfigNode * ) data ;
2015-10-03 13:33:08 +02:00
RCore * core = ( RCore * ) user ;
2013-11-05 02:58:00 +01:00
int n = atoi ( node - > value ) ;
2015-10-03 13:33:08 +02:00
core - > cons - > force_columns = n ;
2016-07-03 20:05:01 +02:00
core - > dbg - > regcols = n / 20 ;
2015-09-14 12:35:38 +02:00
return true ;
2009-03-17 22:06:50 +00:00
}
2013-11-05 02:58:00 +01:00
static int cb_scrfgets ( void * user , void * data ) {
2010-02-28 22:58:21 +01:00
RCore * core = ( RCore * ) user ;
2013-11-05 02:58:00 +01:00
RConfigNode * node = ( RConfigNode * ) data ;
2016-07-03 20:05:01 +02:00
core - > cons - > user_fgets = node - > i_value
? NULL : ( void * ) r_core_fgets ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
static int cb_scrhtml ( void * user , void * data ) {
2010-02-28 22:58:21 +01:00
RConfigNode * node = ( RConfigNode * ) data ;
2013-11-05 02:58:00 +01:00
r_cons_singleton ( ) - > is_html = node - > i_value ;
// TODO: control error and restore old value (return false?) show errormsg?
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
2012-08-19 03:28:17 +02:00
2014-09-27 03:48:54 +02:00
static int cb_scrhighlight ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
r_cons_highlight ( node - > value ) ;
2015-09-14 12:35:38 +02:00
return true ;
2014-09-27 03:48:54 +02:00
}
2015-11-01 05:10:49 +01:00
# if __WINDOWS__ && !__CYGWIN__
static int scr_ansicon ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
2018-04-21 20:37:20 +08:00
r_cons_singleton ( ) - > ansicon = node - > i_value ;
2015-11-01 05:10:49 +01:00
return true ;
}
# endif
2014-10-30 22:58:51 +01:00
static int cb_screcho ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
2018-04-21 20:37:20 +08:00
r_cons_singleton ( ) - > echo = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-10-30 22:58:51 +01:00
}
2016-10-26 23:04:55 +02:00
static int cb_scrlinesleep ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
2018-04-21 20:37:20 +08:00
r_cons_singleton ( ) - > linesleep = node - > i_value ;
2016-10-26 23:04:55 +02:00
return true ;
}
static int cb_scrpagesize ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
2018-04-21 20:37:20 +08:00
r_cons_singleton ( ) - > pagesize = node - > i_value ;
2016-10-26 23:04:55 +02:00
return true ;
}
2016-09-20 00:11:59 +02:00
static int cb_scrflush ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
2018-04-21 20:37:20 +08:00
r_cons_singleton ( ) - > flush = node - > i_value ;
2016-09-20 00:11:59 +02:00
return true ;
}
2018-02-24 19:01:21 +08:00
static int cb_scrstrconv ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > value [ 0 ] = = ' ? ' ) {
if ( strlen ( node - > value ) > 1 & & node - > value [ 1 ] = = ' ? ' ) {
r_cons_printf ( " Valid values for scr.strconv: \n "
" asciiesc convert to ascii with non-ascii chars escaped \n "
2018-03-12 23:05:12 +08:00
" asciidot convert to ascii with non-ascii chars turned into a dot (except control chars stated below) \n "
2018-02-24 19:01:21 +08:00
" \n "
2018-03-12 23:05:12 +08:00
" Ascii chars are in the range 0x20-0x7e. Always escaped control chars are alert ( \\ a), \n "
" backspace ( \\ b), formfeed ( \\ f), newline ( \\ n), carriage return ( \\ r), horizontal tab ( \\ t) \n "
" and vertical tab ( \\ v). Also, double quotes ( \\ \" ) are always escaped, but backslashes ( \\ \\ ) \n "
" are only escaped if str.escbslash = true. \n " ) ;
2018-02-24 19:01:21 +08:00
} else {
print_node_options ( node ) ;
}
return false ;
} else {
2018-03-15 19:20:23 +08:00
free ( ( char * ) core - > print - > strconv_mode ) ;
2018-02-24 19:01:21 +08:00
core - > print - > strconv_mode = strdup ( node - > value ) ;
}
return true ;
}
2018-02-27 23:46:47 +01:00
static int cb_graphformat ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
if ( ! strcmp ( node - > value , " ? " ) ) {
2018-05-17 08:39:39 +02:00
r_cons_printf ( " png \n jpg \n pdf \n ps \n svg \n json \n " ) ;
2018-02-27 23:46:47 +01:00
return false ;
}
return true ;
}
2015-09-23 12:46:22 +02:00
static int cb_exectrap ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
RCore * core = ( RCore * ) user ;
if ( core - > anal & & core - > anal - > esil ) {
core - > anal - > esil - > exectrap = node - > i_value ;
}
return true ;
}
2015-09-09 01:17:55 +02:00
static int cb_iotrap ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
RCore * core = ( RCore * ) user ;
if ( core - > anal & & core - > anal - > esil ) {
core - > anal - > esil - > iotrap = node - > i_value ;
}
2015-09-14 12:35:38 +02:00
return true ;
2015-09-09 01:17:55 +02:00
}
2013-11-05 02:58:00 +01:00
static int cb_scrint ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
2015-02-12 21:48:04 +01:00
if ( node - > i_value & & r_sandbox_enable ( 0 ) ) {
2015-09-14 12:35:38 +02:00
return false ;
2015-02-12 17:23:30 +01:00
}
2018-04-21 20:37:20 +08:00
r_cons_singleton ( ) - > is_interactive = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
static int cb_scrnkey ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
if ( ! strcmp ( node - > value , " help " ) | | * node - > value = = ' ? ' ) {
2017-04-30 19:35:14 +02:00
print_node_options ( node ) ;
2015-09-14 12:35:38 +02:00
return false ;
2011-11-15 23:26:45 +01:00
}
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
static int cb_scrprompt ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
r_line_singleton ( ) - > echo = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
static int cb_scrrows ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
int n = atoi ( node - > value ) ;
( ( RCore * ) user ) - > cons - > force_rows = n ;
2015-09-14 12:35:38 +02:00
return true ;
2009-04-11 21:22:20 +00:00
}
2014-05-31 13:44:52 +02:00
static int cb_contiguous ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > search - > contiguous = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-05-31 13:44:52 +02:00
}
2013-11-05 02:58:00 +01:00
static int cb_searchalign ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
2013-07-17 22:12:14 +02:00
RConfigNode * node = ( RConfigNode * ) data ;
2013-11-05 02:58:00 +01:00
core - > search - > align = node - > i_value ;
core - > print - > addrmod = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
static int cb_segoff ( void * user , void * data ) {
2013-07-17 22:12:14 +02:00
RCore * core = ( RCore * ) user ;
2013-11-05 02:58:00 +01:00
RConfigNode * node = ( RConfigNode * ) data ;
2016-11-01 23:30:36 +01:00
if ( node - > i_value ) {
2013-11-05 02:58:00 +01:00
core - > print - > flags | = R_PRINT_FLAGS_SEGOFF ;
2016-11-01 23:30:36 +01:00
} else {
core - > print - > flags & = ( ( ( ut32 ) - 1 ) & ( ~ R_PRINT_FLAGS_SEGOFF ) ) ;
}
2015-09-14 12:35:38 +02:00
return true ;
2013-07-17 22:12:14 +02:00
}
2018-03-12 12:37:35 +01:00
static int cb_seggrn ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > assembler - > seggrn = node - > i_value ;
core - > anal - > seggrn = node - > i_value ;
2018-03-19 16:42:07 +01:00
core - > print - > seggrn = node - > i_value ;
2018-03-12 12:37:35 +01:00
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_stopthreads ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
2013-07-17 19:34:27 +02:00
RConfigNode * node = ( RConfigNode * ) data ;
2013-11-05 02:58:00 +01:00
core - > dbg - > stop_all_threads = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-07-17 19:34:27 +02:00
}
2013-11-05 02:58:00 +01:00
static int cb_swstep ( void * user , void * data ) {
2010-02-28 22:58:21 +01:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2013-11-05 02:58:00 +01:00
core - > dbg - > swstep = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
2016-11-06 00:46:10 +01:00
static int cb_consbreak ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > dbg - > consbreak = node - > i_value ;
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_teefile ( void * user , void * data ) {
RConfigNode * node = ( RConfigNode * ) data ;
2018-04-21 20:37:20 +08:00
r_cons_singleton ( ) - > teefile = node - > value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
static int cb_trace ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > dbg - > trace - > enabled = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2009-03-12 01:42:35 +00:00
}
2013-11-05 02:58:00 +01:00
static int cb_tracetag ( void * user , void * data ) {
2012-02-05 02:39:04 +01:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2013-11-05 02:58:00 +01:00
core - > dbg - > trace - > tag = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
2012-02-05 02:39:04 +01:00
2013-11-05 02:58:00 +01:00
static int cb_utf8 ( void * user , void * data ) {
2013-07-19 00:20:23 +04:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2016-10-21 01:24:40 +02:00
core - > cons - > use_utf8 = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2013-07-19 00:20:23 +04:00
}
2017-10-08 16:39:27 +05:30
static int cb_utf8_curvy ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > cons - > use_utf8_curvy = node - > i_value ;
return true ;
}
2018-07-21 20:31:36 +02:00
static int cb_dotted ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > cons - > dotted_lines = node - > i_value ;
return true ;
}
2013-11-05 02:58:00 +01:00
static int cb_zoombyte ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
switch ( * node - > value ) {
2018-07-09 01:13:03 +02:00
case ' p ' : case ' f ' : case ' s ' : case ' 0 ' :
case ' F ' : case ' e ' : case ' h ' :
core - > print - > zoom - > mode = * node - > value ;
break ;
default :
eprintf ( " Invalid zoom.byte value. See pz? for help \n " ) ;
r_cons_printf ( " pzp \n pzf \n pzs \n pz0 \n pzF \n pze \n pzh \n " ) ;
return false ;
2013-11-05 02:58:00 +01:00
}
2015-09-14 12:35:38 +02:00
return true ;
2013-11-05 02:58:00 +01:00
}
2017-01-22 01:50:41 +01:00
static int cb_binverbose ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > bin - > verbose = node - > i_value ;
return true ;
}
2014-05-19 02:41:53 +02:00
static int cb_rawstr ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > bin - > rawstr = node - > i_value ;
2015-09-14 12:35:38 +02:00
return true ;
2014-05-19 02:41:53 +02:00
}
2016-11-18 13:28:50 +01:00
static int cb_debase64 ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > bin - > debase64 = node - > i_value ;
return true ;
}
2016-10-16 02:57:08 +02:00
static int cb_binstrings ( void * user , void * data ) {
const ut32 req = R_BIN_REQ_STRINGS ;
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > i_value ) {
core - > bin - > filter_rules | = req ;
} else {
core - > bin - > filter_rules & = ~ req ;
}
return true ;
}
2017-07-24 01:35:33 +02:00
static int cb_bindbginfo ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( ! core | | ! core - > bin ) {
return false ;
}
core - > bin - > want_dbginfo = node - > i_value ;
return true ;
}
2015-10-22 20:26:24 +02:00
static int cb_binprefix ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2016-10-29 13:06:11 +02:00
if ( ! core | | ! core - > bin ) {
2016-10-26 23:22:04 +02:00
return false ;
}
2015-10-22 20:26:24 +02:00
if ( node - > value & & * node - > value ) {
if ( ! strcmp ( node - > value , " auto " ) ) {
2016-10-29 13:06:11 +02:00
if ( ! core - > bin - > file ) {
2015-10-22 20:26:24 +02:00
return false ;
}
2016-10-29 13:06:11 +02:00
char * name = ( char * ) r_file_basename ( core - > bin - > file ) ;
if ( name ) {
r_name_filter ( name , strlen ( name ) ) ;
r_str_filter ( name , strlen ( name ) ) ;
core - > bin - > prefix = strdup ( name ) ;
free ( name ) ;
2016-10-20 15:02:25 +02:00
}
2015-10-22 20:26:24 +02:00
} else {
core - > bin - > prefix = node - > value ;
}
}
return true ;
}
2015-10-06 20:52:50 -04:00
static int cb_binmaxstrbuf ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( core - > bin ) {
int v = node - > i_value ;
ut64 old_v = core - > bin - > maxstrbuf ;
2017-07-10 01:02:21 +02:00
if ( v < 1 ) {
v = 4 ; // HACK
}
2015-10-06 20:52:50 -04:00
core - > bin - > maxstrbuf = v ;
2016-07-03 20:05:01 +02:00
if ( v > old_v ) {
2015-10-06 20:52:50 -04:00
r_core_bin_refresh_strings ( core ) ;
2016-07-03 20:05:01 +02:00
}
2015-10-06 20:52:50 -04:00
return true ;
}
return true ;
}
2014-10-21 04:39:37 +02:00
static int cb_binmaxstr ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( core - > bin ) {
int v = node - > i_value ;
if ( v < 1 ) v = 4 ; // HACK
core - > bin - > maxstrlen = v ;
// TODO: Do not refresh if nothing changed (minstrlen ?)
r_core_bin_refresh_strings ( core ) ;
2015-09-14 12:35:38 +02:00
return true ;
2014-10-21 04:39:37 +02:00
}
2015-09-14 12:35:38 +02:00
return true ;
2014-10-21 04:39:37 +02:00
}
2013-12-05 23:51:17 -06:00
static int cb_binminstr ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( core - > bin ) {
2013-12-29 03:42:18 +01:00
int v = node - > i_value ;
if ( v < 1 ) v = 4 ; // HACK
core - > bin - > minstrlen = v ;
// TODO: Do not refresh if nothing changed (minstrlen ?)
r_core_bin_refresh_strings ( core ) ;
2015-09-14 12:35:38 +02:00
return true ;
2013-12-05 23:51:17 -06:00
}
2015-09-14 12:35:38 +02:00
return true ;
2013-12-05 23:51:17 -06:00
}
2014-04-27 04:25:51 +02:00
static int cb_searchin ( void * user , void * data ) {
2017-08-27 12:59:33 +02:00
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > value [ 0 ] = = ' ? ' ) {
if ( strlen ( node - > value ) > 1 & & node - > value [ 1 ] = = ' ? ' ) {
r_cons_printf ( " Valid values for search.in (depends on .from/.to and io.va): \n "
2017-08-27 20:54:15 +02:00
" raw search in raw io (ignoring bounds) \n "
" block search in the current block \n "
2017-09-07 17:07:33 +02:00
" io.map search in current map \n "
" io.maps search in all maps \n "
2017-08-27 20:54:15 +02:00
" io.section search in current mapped section \n "
" io.sections search in all mapped sections \n "
" io.sections.write search in all writable marked sections \n "
2017-08-27 12:59:33 +02:00
" io.sections.exec search in all executable marked sections \n "
2017-08-27 20:54:15 +02:00
" dbg.stack search in the stack \n "
" dbg.heap search in the heap \n "
" dbg.map search in current memory map \n "
" dbg.maps search in all memory maps \n "
" dbg.maps.exec search in all executable marked memory maps \n "
" dbg.maps.write search in all writable marked memory maps \n "
" anal.fcn search in the current function \n "
" anal.bb search in the current basic-block \n " ) ;
2017-08-27 12:59:33 +02:00
} else {
print_node_options ( node ) ;
}
return false ;
2017-09-11 20:40:22 +02:00
}
2017-08-27 12:59:33 +02:00
return true ;
2014-04-27 04:25:51 +02:00
}
2014-10-26 01:26:41 +02:00
static int __dbg_swstep_getter ( void * user , RConfigNode * node ) {
RCore * core = ( RCore * ) user ;
node - > i_value = core - > dbg - > swstep ;
2016-07-03 20:05:01 +02:00
return true ;
2014-10-26 01:26:41 +02:00
}
2018-01-16 11:58:47 +01:00
static int cb_dirpfx ( RCore * core , RConfigNode * node ) {
r_sys_prefix ( node - > value ) ;
return true ;
}
2014-11-07 03:48:27 +01:00
static int cb_anal_gp ( RCore * core , RConfigNode * node ) {
core - > anal - > gp = node - > i_value ;
2016-07-03 20:05:01 +02:00
return true ;
2014-11-07 03:48:27 +01:00
}
2014-11-24 00:41:20 +01:00
2014-11-03 04:05:19 +01:00
static int cb_anal_from ( RCore * core , RConfigNode * node ) {
if ( r_config_get_i ( core - > config , " anal.limits " ) ) {
2015-04-11 18:54:35 +02:00
r_anal_set_limits ( core - > anal ,
2014-11-03 04:05:19 +01:00
r_config_get_i ( core - > config , " anal.from " ) ,
r_config_get_i ( core - > config , " anal.to " ) ) ;
}
2016-07-03 20:05:01 +02:00
return true ;
2014-11-03 04:05:19 +01:00
}
static int cb_anal_limits ( void * user , RConfigNode * node ) {
RCore * core = ( RCore * ) user ;
if ( node - > i_value ) {
2015-04-11 18:54:35 +02:00
r_anal_set_limits ( core - > anal ,
2014-11-03 04:05:19 +01:00
r_config_get_i ( core - > config , " anal.from " ) ,
r_config_get_i ( core - > config , " anal.to " ) ) ;
} else {
r_anal_unset_limits ( core - > anal ) ;
}
return 1 ;
}
2017-12-24 19:01:51 +01:00
static int cb_anal_rnr ( void * user , RConfigNode * node ) {
RCore * core = ( RCore * ) user ;
core - > anal - > recursive_noreturn = node - > i_value ;
return 1 ;
}
2015-11-20 11:33:48 +03:00
static int cb_anal_jmptbl ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . jmptbl = node - > i_value ;
return true ;
}
2015-09-30 13:10:49 +02:00
2015-11-23 18:00:11 +03:00
static int cb_anal_cjmpref ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . cjmpref = node - > i_value ;
return true ;
}
static int cb_anal_jmpref ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . jmpref = node - > i_value ;
return true ;
}
2015-11-24 15:01:26 +03:00
static int cb_anal_jmpabove ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . jmpabove = node - > i_value ;
return true ;
}
2015-11-24 16:49:44 +03:00
static int cb_anal_followdatarefs ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . followdatarefs = node - > i_value ;
return true ;
}
2015-11-25 14:14:40 +03:00
static int cb_anal_searchstringrefs ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . searchstringrefs = node - > i_value ;
return true ;
}
2016-04-14 14:27:44 +02:00
static int cb_anal_pushret ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . pushret = node - > i_value ;
return true ;
}
2016-11-23 13:13:06 +01:00
static int cb_anal_brokenrefs ( void * user , void * data ) {
2015-12-03 13:41:26 +03:00
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . followbrokenfcnsrefs = node - > i_value ;
return true ;
}
2015-12-10 17:46:10 +03:00
static int cb_anal_bbs_alignment ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . bbs_alignment = node - > i_value ;
return true ;
}
2015-12-10 18:22:24 +03:00
static int cb_anal_bb_max_size ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > anal - > opt . bb_max_size = node - > i_value ;
return true ;
}
2018-03-12 21:48:44 +01:00
static int cb_anal_cpp_abi ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( * node - > value = = ' ? ' ) {
print_node_options ( node ) ;
return false ;
}
if ( * node - > value ) {
if ( strcmp ( node - > value , " itanium " ) = = 0 ) {
core - > anal - > cpp_abi = R_ANAL_CPP_ABI_ITANIUM ;
return true ;
} else if ( strcmp ( node - > value , " msvc " ) = = 0 ) {
core - > anal - > cpp_abi = R_ANAL_CPP_ABI_MSVC ;
return true ;
}
eprintf ( " anal.cpp.abi: cannot find '%s' \n " , node - > value ) ;
}
return false ;
}
2015-12-21 22:27:05 +01:00
static int cb_linesto ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
ut64 from = ( ut64 ) r_config_get_i ( core - > config , " lines.from " ) ;
int io_sz = r_io_size ( core - > io ) ;
2015-12-22 02:30:34 +01:00
ut64 to = r_num_math ( core - > num , node - > value ) ;
if ( to = = 0 ) {
2015-12-22 20:51:06 +01:00
core - > print - > lines_cache_sz = - 1 ; //r_core_lines_initcache (core, from, to);
2015-12-22 02:30:34 +01:00
return false ;
}
2016-01-02 18:18:48 +01:00
if ( to > from + io_sz ) {
2015-12-22 02:30:34 +01:00
eprintf ( " ERROR: \" lines.to \" can't exceed addr 0x%08 " PFMT64x
" 0x%08 " PFMT64x " %d \n " , from , to , io_sz ) ;
2015-12-21 22:27:05 +01:00
return true ;
}
2015-12-22 02:30:34 +01:00
if ( to > from ) {
2015-12-22 20:51:06 +01:00
core - > print - > lines_cache_sz = r_core_lines_initcache ( core , from , to ) ;
//if (core->print->lines_cache_sz == -1) { eprintf ("ERROR: Can't allocate memory\n"); }
2015-12-22 02:30:34 +01:00
} else {
eprintf ( " Invalid range 0x%08 " PFMT64x " .. 0x%08 " PFMT64x " \n " , from , to ) ;
2015-12-21 22:27:05 +01:00
}
return true ;
}
2015-12-28 12:49:50 +01:00
static int cb_linesabs ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
core - > print - > lines_abs = node - > i_value ;
if ( core - > print - > lines_abs & & core - > print - > lines_cache_sz < = 0 ) {
ut64 from = ( ut64 ) r_config_get_i ( core - > config , " lines.from " ) ;
ut64 to = ( ut64 ) r_config_get_i ( core - > config , " lines.to " ) ;
core - > print - > lines_cache_sz = r_core_lines_initcache ( core , from , to ) ;
if ( core - > print - > lines_cache_sz = = - 1 ) {
eprintf ( " ERROR: \" lines.from \" and \" lines.to \" must be set \n " ) ;
} else {
eprintf ( " Found %d lines \n " , core - > print - > lines_cache_sz - 1 ) ;
}
}
return true ;
}
2017-08-01 16:54:25 -07:00
static int cb_malloc ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
2018-01-16 11:13:21 +01:00
if ( node - > value ) {
2017-08-01 16:54:25 -07:00
if ( ! strcmp ( " jemalloc " , node - > value ) | | ! strcmp ( " glibc " , node - > value ) ) {
2018-01-16 11:13:21 +01:00
if ( core - > dbg ) {
core - > dbg - > malloc = data ;
}
2017-08-01 16:54:25 -07:00
}
2017-08-12 00:06:03 +09:00
2017-08-01 16:54:25 -07:00
}
return true ;
}
2017-08-12 00:06:03 +09:00
static int cb_dbgsnap ( void * user , void * data ) {
RCore * core = ( RCore * ) user ;
RConfigNode * node = ( RConfigNode * ) data ;
if ( node - > value ) {
r_debug_session_path ( core - > dbg , node - > value ) ;
}
return true ;
}
2016-09-04 13:31:25 +02:00
static char * getViewerPath ( ) {
int i ;
const char * viewers [ ] = {
2018-07-28 10:42:23 +03:00
# if __WINDOWS__
" explorer " ,
# else
2016-09-04 13:31:25 +02:00
" open " ,
" geeqie " ,
" gqview " ,
" eog " ,
2016-10-26 14:37:56 +02:00
" xdg-open " ,
2018-07-28 10:42:23 +03:00
# endif
2016-10-26 14:37:56 +02:00
NULL
2016-09-04 13:31:25 +02:00
} ;
for ( i = 0 ; viewers [ i ] ; i + + ) {
2018-07-28 10:42:23 +03:00
char * viewerPath = r_file_path ( viewers [ i ] ) ;
if ( viewerPath & & strcmp ( viewerPath , viewers [ i ] ) ) {
return viewerPath ;
2016-09-04 13:31:25 +02:00
}
2018-07-28 10:42:23 +03:00
free ( viewerPath ) ;
2016-09-04 13:31:25 +02:00
}
return NULL ;
}
2018-05-17 08:39:39 +02:00
R_API char * r_core_graph_cmd ( RCore * core , char * r2_cmd ) {
2018-05-11 10:58:33 +02:00
char * cmd = NULL ;
char * xdotPath = r_file_path ( " xdot " ) ;
2018-05-17 08:39:39 +02:00
const char * ext = r_config_get ( core - > config , " graph.extension " ) ;
2018-05-11 10:58:33 +02:00
if ( r_file_exists ( xdotPath ) ) {
cmd = r_str_newf ( " %s > a.dot;!xdot a.dot " , r2_cmd ) ;
} else {
char * dotPath = r_file_path ( " dot " ) ;
if ( r_file_exists ( dotPath ) ) {
R_FREE ( dotPath ) ;
char * viewer = getViewerPath ( ) ;
if ( viewer ) {
2018-05-17 08:39:39 +02:00
cmd = r_str_newf ( " %s > a.dot;!dot -T%s -oa.%s a.dot;!%s a.%s " , r2_cmd , ext , ext , viewer , ext ) ;
2018-05-11 10:58:33 +02:00
free ( viewer ) ;
} else {
2018-07-28 10:42:23 +03:00
eprintf ( " Cannot find a valid picture viewer " ) ;
2018-05-11 10:58:33 +02:00
}
} else {
cmd = r_str_new ( " agf " ) ;
}
free ( dotPath ) ;
}
free ( xdotPath ) ;
return cmd ;
}
2011-07-13 17:41:26 +02:00
# define SLURP_LIMIT (10*1024*1024)
2010-03-04 01:46:25 +01:00
R_API int r_core_config_init ( RCore * core ) {
2012-08-19 03:28:17 +02:00
int i ;
2013-01-03 00:47:58 +01:00
char buf [ 128 ] , * p , * tmpdir ;
2017-02-22 23:39:09 +01:00
RConfigNode * n ;
2014-02-01 16:13:35 +00:00
RConfig * cfg = core - > config = r_config_new ( core ) ;
2016-07-03 20:05:01 +02:00
if ( ! cfg ) {
return 0 ;
}
2015-08-08 14:15:13 -04:00
cfg - > cb_printf = r_cons_printf ;
2012-08-13 04:33:01 +02:00
cfg - > num = core - > num ;
2018-01-16 11:13:21 +01:00
/* dir.prefix is used in other modules, set it first */
{
char * pfx = r_sys_getenv ( " R2_PREFIX " ) ;
2018-01-28 14:36:38 +03:00
# if __WINDOWS__
char invoke_dir [ MAX_PATH ] ;
if ( ! pfx & & r_sys_get_src_dir_w32 ( invoke_dir ) ) {
pfx = strdup ( invoke_dir ) ;
}
# endif
2018-01-16 11:13:21 +01:00
if ( ! pfx ) {
pfx = strdup ( R2_PREFIX ) ;
}
2018-01-16 11:58:47 +01:00
SETCB ( " dir.prefix " , pfx , ( RConfigCallback ) & cb_dirpfx , " Default prefix r2 was compiled for " ) ;
2018-01-16 11:13:21 +01:00
free ( pfx ) ;
}
2014-12-11 16:33:32 +02:00
/* pdb */
2017-04-30 19:35:14 +02:00
SETPREF ( " pdb.useragent " , " Microsoft-Symbol-Server/6.11.0001.402 " , " User agent for Microsoft symbol server " ) ;
SETPREF ( " pdb.server " , " https://msdl.microsoft.com/download/symbols " , " Base URL for Microsoft symbol server " ) ;
2018-02-09 02:34:09 -08:00
{
2018-04-28 11:02:55 +03:00
char * pdb_path = r_str_home ( R2_HOME_PDB ) ;
2018-02-09 02:34:09 -08:00
SETPREF ( " pdb.symstore " , pdb_path , " Path to downstream symbol store " ) ;
R_FREE ( pdb_path ) ;
}
2017-04-30 19:35:14 +02:00
SETI ( " pdb.extract " , 1 , " Avoid extract of the pdb file, just download " ) ;
2017-08-02 15:58:59 +02:00
SETI ( " pdb.autoload " , false , " Automatically load the required pdb files for loaded DLLs " ) ;
2014-12-11 16:33:32 +02:00
2010-02-28 22:58:21 +01:00
/* anal */
2017-04-30 19:35:14 +02:00
SETPREF ( " anal.fcnprefix " , " fcn " , " Prefix new function names with this " ) ;
SETPREF ( " anal.a2f " , " false " , " Use the new WIP analysis algorithm (core/p/a2f), anal.depth ignored atm " ) ;
SETICB ( " anal.gp " , 0 , ( RConfigCallback ) & cb_anal_gp , " Set the value of the GP register (MIPS) " ) ;
2018-04-16 15:06:56 +02:00
SETI ( " anal.gp2 " , 0 , " Set anal.gp before emulating each instruction (workaround) " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " anal.limits " , " false " , ( RConfigCallback ) & cb_anal_limits , " Restrict analysis to address range [anal.from:anal.to] " ) ;
2017-12-24 19:01:51 +01:00
SETCB ( " anal.rnr " , " false " , ( RConfigCallback ) & cb_anal_rnr , " Recursive no return checks (EXPERIMENTAL) " ) ;
SETCB ( " anal.limits " , " false " , ( RConfigCallback ) & cb_anal_limits , " Restrict analysis to address range [anal.from:anal.to] " ) ;
2017-04-30 19:35:14 +02:00
SETICB ( " anal.from " , - 1 , ( RConfigCallback ) & cb_anal_from , " Lower limit on the address range for analysis " ) ;
SETICB ( " anal.to " , - 1 , ( RConfigCallback ) & cb_anal_from , " Upper limit on the address range for analysis " ) ;
2017-12-13 16:55:37 +05:30
n = NODECB ( " anal.in " , " io.maps " , & cb_searchin ) ;
SETDESC ( n , " Specify search boundaries for analysis " ) ;
SETOPTIONS ( n , " raw " , " block " , " io.map " , " io.maps " ,
" io.sections " , " io.sections.write " , " io.sections.exec " , " io.sections.readonly " ,
" dbg.stack " , " dbg.heap " , " dbg.map " ,
" dbg.maps " , " dbg.maps.exec " , " dbg.maps.write " , " dbg.maps.readonly " ,
" anal.fcn " , " anal.bb " , NULL ) ;
2017-05-09 11:09:11 +02:00
SETI ( " anal.timeout " , 0 , " Stop analyzing after a couple of seconds " ) ;
2017-04-30 19:35:14 +02:00
2017-10-29 11:29:07 +01:00
SETCB ( " anal.armthumb " , " false " , & cb_analarmthumb , " aae computes arm/thumb changes (lot of false positives ahead) " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " anal.eobjmp " , " false " , & cb_analeobjmp , " jmp is end of block mode (option) " ) ;
SETCB ( " anal.afterjmp " , " true " , & cb_analafterjmp , " Continue analysis after jmp/ujmp " ) ;
2018-06-24 23:17:58 +02:00
SETCB ( " anal.endsize " , " true " , & cb_anal_endsize , " Adjust function size at the end of the analysis (known to be buggy) " ) ;
2018-02-10 00:25:24 +01:00
SETICB ( " anal.depth " , 64 , & cb_analdepth , " Max depth at code analysis " ) ; // XXX: warn if depth is > 50 .. can be problematic
2017-04-30 19:35:14 +02:00
SETICB ( " anal.sleep " , 0 , & cb_analsleep , " Sleep N usecs every so often during analysis. Avoid 100% CPU usage " ) ;
SETPREF ( " anal.calls " , " false " , " Make basic af analysis walk into calls " ) ;
SETPREF ( " anal.autoname " , " true " , " Automatically set a name for the functions, may result in some false positives " ) ;
SETPREF ( " anal.hasnext " , " false " , " Continue analysis after each function " ) ;
SETPREF ( " anal.esil " , " false " , " Use the new ESIL code analysis " ) ;
2017-05-22 02:27:33 +02:00
SETCB ( " anal.strings " , " false " , & cb_analstrings , " Identify and register strings during analysis (aar only) " ) ;
2018-07-22 20:47:56 +05:30
SETPREF ( " anal.spec " , " gcc " , " Set profile for specifying format chars used in type analysis " ) ;
2018-05-16 02:44:09 +05:30
SETCB ( " anal.vars " , " true " , & cb_analvars , " Analyze local variables and arguments " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " anal.vinfun " , " true " , " Search values in functions (aav) (false by default to only find on non-code) " ) ;
SETPREF ( " anal.vinfunrange " , " false " , " Search values outside function ranges (requires anal.vinfun=false) \n " ) ;
SETCB ( " anal.nopskip " , " true " , & cb_analnopskip , " Skip nops at the beginning of functions " ) ;
SETCB ( " anal.hpskip " , " false " , & cb_analhpskip , " Skip `mov reg, reg` and `lea reg, [reg] at the beginning of functions " ) ;
SETCB ( " anal.noncode " , " false " , & cb_analnoncode , " Analyze data as code " ) ;
n = NODECB ( " anal.arch " , R_SYS_ARCH , & cb_analarch ) ;
SETDESC ( n , " Select the architecture to use " ) ;
update_analarch_options ( core , n ) ;
SETCB ( " anal.cpu " , R_SYS_ARCH , & cb_analcpu , " Specify the anal.cpu to use " ) ;
SETPREF ( " anal.prelude " , " " , " Specify an hexpair to find preludes in code " ) ;
SETCB ( " anal.recont " , " false " , & cb_analrecont , " End block after splitting a basic block instead of error " ) ; // testing
2018-04-18 18:20:03 +08:00
SETCB ( " anal.ijmp " , " false " , & cb_analijmp , " Follow the indirect jumps in function analysis " ) ; // testing
2017-04-30 19:35:14 +02:00
SETI ( " anal.ptrdepth " , 3 , " Maximum number of nested pointers to follow in analysis " ) ;
SETICB ( " anal.maxreflines " , 0 , & cb_analmaxrefs , " Maximum number of reflines to be analyzed and displayed in asm.lines with pd " ) ;
2018-06-25 12:26:15 +02:00
SETCB ( " anal.jmptbl " , " true " , & cb_anal_jmptbl , " Analyze jump tables in switch statements " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " anal.cjmpref " , " false " , & cb_anal_cjmpref , " Create references for conditional jumps " ) ;
SETCB ( " anal.jmpref " , " true " , & cb_anal_jmpref , " Create references for unconditional jumps " ) ;
SETCB ( " anal.jmpabove " , " true " , & cb_anal_jmpabove , " Jump above function pointer " ) ;
SETCB ( " anal.datarefs " , " false " , & cb_anal_followdatarefs , " Follow data references for code coverage " ) ;
SETCB ( " anal.brokenrefs " , " false " , & cb_anal_brokenrefs , " Follow function references as well if function analysis was failed " ) ;
2017-11-14 03:47:21 +09:00
SETCB ( " anal.refstr " , " false " , & cb_anal_searchstringrefs , " Search string references in data references " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " anal.bb.align " , " 0x10 " , & cb_anal_bbs_alignment , " Possible space between basic blocks " ) ;
SETCB ( " anal.bb.maxsize " , " 1024 " , & cb_anal_bb_max_size , " Maximum basic block size " ) ;
SETCB ( " anal.pushret " , " false " , & cb_anal_pushret , " Analyze push+ret as jmp " ) ;
2018-03-12 21:48:44 +01:00
n = NODECB ( " anal.cpp.abi " , " itanium " , & cb_anal_cpp_abi ) ;
SETDESC ( n , " Select C++ ABI (Compiler) " ) ;
SETOPTIONS ( n , " itanium " , " msvc " , NULL ) ;
2017-08-03 13:56:45 +02:00
# if __linux__ && __GNU_LIBRARY__ && __GLIBC__ && __GLIBC_MINOR__
2017-08-01 16:54:25 -07:00
SETCB ( " dbg.malloc " , " glibc " , & cb_malloc , " Choose malloc structure parser " ) ;
2017-08-03 13:56:45 +02:00
# else
SETCB ( " dbg.malloc " , " jemalloc " , & cb_malloc , " Choose malloc structure parser " ) ;
# endif
2017-08-01 16:54:25 -07:00
2017-04-30 19:35:14 +02:00
SETPREF ( " esil.prestep " , " true " , " Step before esil evaluation in `de` commands " ) ;
SETPREF ( " esil.fillstack " , " " , " Initialize ESIL stack with (random, debrujn, sequence, zeros, ...) " ) ;
SETICB ( " esil.verbose " , 0 , & cb_esilverbose , " Show ESIL verbose level (0, 1, 2) " ) ;
SETICB ( " esil.gotolimit " , core - > anal - > esil_goto_limit , & cb_gotolimit , " Maximum number of gotos per ESIL expression " ) ;
SETICB ( " esil.stack.depth " , 32 , & cb_esilstackdepth , " Number of elements that can be pushed on the esilstack " ) ;
SETI ( " esil.stack.size " , 0xf0000 , " Number of elements that can be pushed on the esilstack " ) ;
SETI ( " esil.stack.addr " , 0x100000 , " Number of elements that can be pushed on the esilstack " ) ;
SETPREF ( " esil.stack.pattern " , " 0 " , " Specify fill pattern to initialize the stack (0, w, d, i) " ) ;
Fix #9595 (#9673)
* Added an address mask inside the RAnalEsil struct in order to be sure that the address accessed is relevant with the asm.bits of the file + Changed the calls to r_anal_esil_new
* Corrected the addrmask in r_anal_esil_new
* RTTI: Read MSVC Complete Object Locator
* RTTI: Read MSVC Class Hierarchy Descriptor
* VTable End on Reference
* RTTI: Read MSVC Type Descriptor
* RTTI: Read MSVC Base Class Array, Better Printing
* Add anal.cpp.abi
* Minor Code Style Changes in RTTI
* Fix rahash2 entropy to show non truncated double (#9629)
* Anal - whitespace fixes
* Honor CFLAGS on the static build test compilation (#9677)
* change coding style tab width to 4 (#9670)
* Meson: use more built-in options (#9678)
* Add support for extended regex in asm search (#9675)
* Fix #9665 - Backwardly handle scr.color={bool}
* Fix #9676 - Infinite loop in ecs with scr.color=2
* Adding help for redirection (#9679)
* Refactores function r_str_split_list to receive the character to split by (#9672)
* Fix #9666 - lines with comments do not use Unicode reflines
* Fix uninitialized optypes_list issue in cmd_debug
* update asan.sh to actually take the env for ASAN
* removed incorrect return (#9685)
* Fix UB in ESIL
* Initial import of the CoreUndo API and uc command
* Initial implementation of cmd.pdc to select pseudo-decompiler
* Handle recursive pdc calls
* Fix RPrint.strconv_mode memleak
* Fix leaks in RSyscall.srdb
* Use r_syscall_ref to avoid dblfree-or-leak issue
* Arm thumb/thumb selector for the armass (#9681)
* added function to translate number to imm12
* added function to get thumb shifts easily
* added selector, newfangled implementation of adc
* add bitmask for command suffixes
* added new routine for parsing suffixes to opcodes. Error check added in getnum. Bugfixes.
* Few improvements to 8051 memory mapping (#9686)
* update memory map when idata/sfr/xdata regs change
* set address space name on map
* fix regression, remove debug output
* fix regression, enable map name
* Some fixups for #9682 (#9688)
* Fix: coredump generation for huge programs (#9680)
* Refix #9666 - lines with comments do not use Unicode reflines
* Removed code unnecessary due to dcf3db025085c45124ec21890550a4ef19bd015c
* Fixed free const warning
* Fix another memleak in RSyscall
* Fix more memleaks
* Fix leak in RConsPal.rainbow
* Fix 18K leak in anal.x86.cs
* Fix some more memleaks in disasm and fix issue in str overlap
* Fix memleak in RCore.anal_refs and fix regression
* Revert "Fix some more memleaks in disasm and fix issue in str overlap"
This reverts commit a902df837b0d499e1723179ed5c957c078703b51.
* Fix memleak regressions
* Bring back another memleak fix
* Fix an undefined behaviour in RParse.filter
* Fix memleaks in disasm.c
* Add cundo.c to Meson (#9694)
* Bring back an ugly buffer pack access issue to make it work
* Cast to void * in R_FREE (#9692)
* Set anal.cpp.abi to msvc for pe
* Add better help for av
* Split avr into avr and avra
* Make av, avr and avra breakable
* Add RTTI struct specific print functions
* RTTI: Support MSVC x86_64
* PE: Fix too short section name.
* PDB: define a constant to store the max length of a section name and use id.
* PDB: dump the size of structure and union in JSON mode.
* Fix cast issue in eprintf for debug.core.linux
* Move the asm and anal plugins for x86.udis to extras
Available via r2pm -ci udis86
* Remove more udis86 references
* Fix warnings
* fix pcache ptr-fuckup
* Fix defragger theme
* Fix crash in asl and fix its behaviour
* Fix memory leak in blaze anal and silent a warning
* Implement ?q to be like ?v but in quiet mode
* Fix Meson build
* Add missing 8, 16, 32 bit registers (and flags) for the linux-arm64 debugger reg profile
* Fix 'Cannot find function at UT64_MAX message'
* Add some Pingu to fortunes.fun
* Loading Core (x86, x86_64, aarch64) (#9669)
* Ragg2-cc -> Ragg2 merge (#9658)
- change of 'access' function for 'r_file_exists' for windows portability
- several changes in the way ragg2.c is done, see PR #9658 pancake comments
- change function for the remove of 'file'.text
- open changed for r_file_dump
- some elt of cEnv_t are now const
- skip all the pointers verification in set_cEnv but do them in check_cEnv instead
- add 2 r_str_sanitize for file and CC in parseCFile
- rewrite the removal of .o, .tmp, .bin, .s files, with cleaner code
- changed the long command with sed and grep to 2 C functions.
- The function parseCompiled that basically does what the command was doing
- And r_str_stripLines that is equivalent to "grep -v" (maybe we should put this one in str.c ?)
- simplify a bit getCompiler function with a const char* array
- add ternary operator for armOrMips condition
- use r_file_path for finding path to compilers
- new file created in libr/egg which contains all the C file parser
- modifications of 2 files to match the change :
- libr/egg/r_egg.h
- libr/egg/Makefile
- the function r_str_stripLine is simplier (the mallocs wasn't needed)
- the function r_str_stripLine is moved to libr/util/str.c
- libr/include/r_util/r_str.h is changed accordingly
* Revert bd3465c9a3fbeddf83980dc07eaac588320f7d (warning remains fixed)
This reverts commit titled "Fixed free const warning".
* Added an address mask inside the RAnalEsil struct in order to be sure that the address accessed is relevant with the asm.bits of the file + Changed the calls to r_anal_esil_new
* Corrected the addrmask in r_anal_esil_new
* Cleanup expressions in esil.c (addr &=...)
* Corrected r_anal_esil_new definition in r_anal.h
* Added an address size max in the ESIL config (maximum address size reachable by the ESIL VM)
2018-03-16 10:45:17 +01:00
SETI ( " esil.addr.size " , 64 , " Maximum address size in accessed by the ESIL VM " ) ;
2018-07-27 10:36:43 +01:00
SETPREF ( " esil.breakoninvalid " , " false " , " Break esil execution when instruction is invalid " ) ;
2015-03-12 16:45:23 +01:00
2010-06-02 19:17:47 +02:00
/* asm */
2013-11-05 02:58:00 +01:00
//asm.os needs to be first, since other asm.* depend on it
2017-04-30 19:35:14 +02:00
n = NODECB ( " asm.os " , R_SYS_OS , & cb_asmos ) ;
SETDESC ( n , " Select operating system (kernel) " ) ;
SETOPTIONS ( n , " ios " , " dos " , " darwin " , " linux " , " freebsd " , " openbsd " , " netbsd " , " windows " , NULL ) ;
2018-06-03 01:14:22 +02:00
SETI ( " asm.xrefs.fold " , 5 , " Maximum number of xrefs to be displayed as list (use columns above) " ) ;
SETI ( " asm.xrefs.max " , 20 , " Maximum number of xrefs to be displayed without folding " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " asm.invhex " , " false " , & cb_asm_invhex , " Show invalid instructions as hexadecimal numbers " ) ;
2018-04-15 02:29:03 +02:00
SETPREF ( " asm.meta " , " true " , " Display the code/data/format conversions in disasm " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.bytes " , " true " , " Display the bytes of each instruction " ) ;
2017-05-11 12:47:48 +02:00
SETPREF ( " asm.midcursor " , " false " , " Cursor in visual disasm mode breaks the instruction " ) ;
2018-02-22 17:59:08 +01:00
SETPREF ( " asm.cmt.flgrefs " , " true " , " Show comment flags associated to branch reference " ) ;
SETPREF ( " asm.cmt.right " , " true " , " Show comments at right of disassembly if they fit in screen " ) ;
SETI ( " asm.cmt.col " , 71 , " Column to align comments " ) ;
2017-04-30 19:35:14 +02:00
SETICB ( " asm.pcalign " , 0 , & cb_asm_pcalign , " Only recognize as valid instructions aligned to this value " ) ;
2018-05-20 04:21:32 +02:00
// maybe rename to asm.cmt.calls
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.calls " , " true " , " Show callee function related info as comments in disasm " ) ;
SETPREF ( " asm.bbline " , " false " , " Show empty line after every basic block " ) ;
SETPREF ( " asm.comments " , " true " , " Show comments in disassembly view " ) ;
SETPREF ( " asm.jmphints " , " true " , " Show jump hints [numbers] in disasm " ) ;
2018-01-16 01:50:42 -08:00
SETPREF ( " asm.jmpsub " , " false " , " Always substitute jump, call and branch targets in disassembly " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.leahints " , " false " , " Show LEA hints [numbers] in disasm " ) ;
SETPREF ( " asm.slow " , " true " , " Perform slow analysis operations in disasm " ) ;
SETPREF ( " asm.decode " , " false " , " Use code analysis as a disassembler " ) ;
2018-05-20 04:21:32 +02:00
SETICB ( " asm.imm.arm " , false , & cb_asm_armimm , " Display # for immediates in ARM " ) ;
2018-06-28 21:03:59 +08:00
SETPREF ( " asm.imm.str " , " true " , " Show immediates values as strings " ) ;
2018-05-20 04:21:32 +02:00
SETPREF ( " asm.imm.trim " , " false " , " Remove all offsets and constants from disassembly " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.indent " , " false " , " Indent disassembly based on reflines depth " ) ;
SETI ( " asm.indentspace " , 2 , " How many spaces to indent the code " ) ;
SETPREF ( " asm.dwarf " , " false " , " Show dwarf comment at disassembly " ) ;
SETPREF ( " asm.dwarf.abspath " , " false " , " Show absolute path in asm.dwarf " ) ;
SETPREF ( " asm.dwarf.file " , " true " , " Show filename of asm.dwarf in pd " ) ;
SETPREF ( " asm.esil " , " false " , " Show ESIL instead of mnemonic " ) ;
SETPREF ( " asm.nodup " , " false " , " Do not show dupped instructions (collapse disasm) " ) ;
SETPREF ( " asm.emu " , " false " , " Run ESIL emulation analysis on disasm " ) ;
2018-04-14 12:54:19 +08:00
SETPREF ( " emu.pre " , " false " , " Run ESIL emulation starting at the closest flag in pd " ) ;
SETPREF ( " emu.stack " , " false " , " Create a temporary fake stack when emulating in disasm (asm.emu) " ) ;
SETCB ( " emu.str " , " false " , & cb_emustr , " Show only strings if any in the asm.emu output " ) ;
SETPREF ( " emu.stroff " , " false " , " Always show offset when printing asm.emu strings " ) ;
SETPREF ( " emu.strinv " , " true " , " Color-invert asm.emu strings " ) ;
SETPREF ( " emu.strflag " , " true " , " Also show flag (if any) for asm.emu string " ) ;
SETPREF ( " emu.write " , " false " , " Allow asm.emu to modify memory (WARNING) " ) ;
n = NODECB ( " emu.skip " , " ds " , & cb_emuskip ) ;
2017-04-30 19:35:14 +02:00
SETDESC ( n , " Skip metadata of given types in asm.emu " ) ;
SETOPTIONS ( n , " d " , " c " , " s " , " f " , " m " , " h " , " C " , " r " , NULL ) ;
SETPREF ( " asm.filter " , " true " , " Replace numeric values by flags (e.g. 0x4003e0 -> sym.imp.printf) " ) ;
2018-01-27 00:25:12 +01:00
SETPREF ( " asm.strip " , " " , " strip all instructions given comma separated types " ) ;
2018-05-21 02:01:47 +02:00
SETPREF ( " asm.lines.fcn " , " true " , " Show function boundary lines " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.flags " , " true " , " Show flags " ) ;
2018-05-20 04:21:32 +02:00
SETPREF ( " asm.flags.offset " , " false " , " Show offset in flags " ) ;
SETPREF ( " asm.flags.inbytes " , " false " , " Display flags inside the bytes space " ) ;
n = NODEICB ( " asm.flags.middle " , 2 , & cb_midflags ) ;
SETOPTIONS ( n , " 0 = do not show flag " , " 1 = show without realign " , " 2 = realign at middle flag " ,
" 3 = realign at middle flag if sym.* " , NULL ) ;
2018-07-02 20:06:09 +02:00
SETCB ( " asm.flags.real " , " false " , & cb_flag_realnames , " Show flags unfiltered realnames instead of names " ) ;
2018-05-20 04:21:32 +02:00
SETDESC ( n , " Realign disassembly if there is a flag in the middle of an instruction " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.lbytes " , " true " , " Align disasm bytes to left " ) ;
SETPREF ( " asm.lines " , " true " , " Show ASCII-art lines at disassembly " ) ;
2018-06-04 16:03:58 +02:00
SETPREF ( " asm.lines.bb " , " true " , " Show flow lines at jumps " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.lines.call " , " false " , " Enable call lines " ) ;
SETPREF ( " asm.lines.ret " , " false " , " Show separator lines after ret " ) ;
2018-05-18 10:29:00 +02:00
SETPREF ( " asm.lines.out " , " true " , " Show out of block lines " ) ;
SETPREF ( " asm.lines.right " , " false " , " Show lines before opcode instead of offset " ) ;
SETPREF ( " asm.lines.wide " , " false " , " Put a space between lines " ) ;
SETICB ( " asm.lines.width " , 7 , & cb_asmlineswidth , " Number of columns for program flow arrows " ) ;
2018-05-13 16:32:16 +08:00
SETICB ( " asm.var.submin " , 0x100 , & cb_asmvarsubmin , " Minimum value to substitute in instructions (asm.var.sub) " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.middle " , " false " , " Allow disassembling jumps in the middle of an instruction " ) ;
2017-05-26 08:56:47 +08:00
SETPREF ( " asm.noisy " , " true " , " Show comments considered noisy but possibly useful " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.offset " , " true " , " Show offsets at disassembly " ) ;
2017-08-31 01:30:37 +02:00
SETCB ( " scr.rainbow " , " false " , & cb_scrrainbow , " Shows rainbow colors depending of address " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.reloff " , " false " , " Show relative offsets instead of absolute address in disasm " ) ;
SETPREF ( " asm.reloff.flags " , " false " , " Show relative offsets to flags (not only functions) " ) ;
SETPREF ( " asm.section " , " false " , " Show section name before offset " ) ;
SETI ( " asm.section.col " , 20 , " Columns width to show asm.section " ) ;
SETCB ( " asm.section.sub " , " false " , & cb_asmsecsub , " Show offsets in disasm prefixed with section/map name " ) ;
SETPREF ( " asm.pseudo " , " false " , " Enable pseudo syntax " ) ;
SETPREF ( " asm.size " , " false " , " Show size of opcodes in disassembly (pd) " ) ;
SETPREF ( " asm.stackptr " , " false " , " Show stack pointer at disassembly " ) ;
SETPREF ( " asm.cyclespace " , " false " , " Indent instructions depending on CPU-cycles " ) ;
SETPREF ( " asm.cycles " , " false " , " Show CPU-cycles taken by instruction at disassembly " ) ;
SETI ( " asm.tabs " , 0 , " Use tabs in disassembly " ) ;
2018-05-20 04:21:32 +02:00
SETPREF ( " asm.tabs.once " , " false " , " Only tabulate the opcode, not the arguments " ) ;
SETI ( " asm.tabs.off " , 0 , " tabulate spaces after the offset " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.trace " , " false " , " Show execution traces for each opcode " ) ;
SETPREF ( " asm.tracespace " , " false " , " Indent disassembly with trace.count information " ) ;
SETPREF ( " asm.ucase " , " false " , " Use uppercase syntax at disassembly " ) ;
SETPREF ( " asm.capitalize " , " false " , " Use camelcase at disassembly " ) ;
2018-05-13 10:03:35 +08:00
SETPREF ( " asm.var " , " true " , " Show local function variables in disassembly " ) ;
2018-05-13 16:32:16 +08:00
SETPREF ( " asm.var.access " , " false " , " Show accesses of local variables " ) ;
2018-05-12 16:54:54 +08:00
SETPREF ( " asm.var.sub " , " true " , " Substitute variables in disassembly " ) ;
2018-05-13 10:03:35 +08:00
SETI ( " asm.var.summary " , 0 , " Show variables summary instead of full list in disasm (0, 1, 2) " ) ;
2018-05-12 16:54:54 +08:00
SETPREF ( " asm.var.subonly " , " true " , " Substitute the entire variable expression with the local variable name (e.g. [local10h] instead of [ebp+local10h]) " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.relsub " , " true " , " Substitute pc relative expressions in disasm " ) ;
2018-02-22 17:59:08 +01:00
SETPREF ( " asm.cmt.fold " , " false " , " Fold comments, toggle with Vz " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.family " , " false " , " Show family name in disasm " ) ;
SETPREF ( " asm.symbol " , " false " , " Show symbol+delta instead of absolute offset " ) ;
2017-11-28 10:52:04 +01:00
SETPREF ( " asm.anal " , " false " , " Analyze code and refs while disassembling (see anal.strings) " ) ;
2017-11-25 00:28:21 +01:00
SETI ( " asm.shortcut " , 1 , " Shortcut position (-1, 0, 1) " ) ;
2017-04-30 19:35:14 +02:00
SETI ( " asm.symbol.col " , 40 , " Columns width to show asm.section " ) ;
SETCB ( " asm.assembler " , " " , & cb_asmassembler , " Set the plugin name to use when assembling " ) ;
SETPREF ( " asm.minicols " , " false " , " Only show the instruction in the column disasm " ) ;
RConfigNode * asmcpu = NODECB ( " asm.cpu " , R_SYS_ARCH , & cb_asmcpu ) ;
SETDESC ( asmcpu , " Set the kind of asm.arch cpu " ) ;
RConfigNode * asmarch = NODECB ( " asm.arch " , R_SYS_ARCH , & cb_asmarch ) ;
SETDESC ( asmarch , " Set the arch to be used by asm " ) ;
/* we need to have both asm.arch and asm.cpu defined before updating options */
update_asmarch_options ( core , asmarch ) ;
update_asmcpu_options ( core , asmcpu ) ;
n = NODECB ( " asm.features " , " " , & cb_asmfeatures ) ;
SETDESC ( n , " Specify supported features by the target CPU " ) ;
update_asmfeatures_options ( core , n ) ;
SETCB ( " asm.parser " , " x86.pseudo " , & cb_asmparser , " Set the asm parser to use " ) ;
SETCB ( " asm.segoff " , " false " , & cb_segoff , " Show segmented address in prompt (x86-16) " ) ;
SETCB ( " asm.decoff " , " false " , & cb_decoff , " Show segmented address in prompt (x86-16) " ) ;
2018-03-12 12:37:35 +01:00
SETICB ( " asm.seggrn " , 4 , & cb_seggrn , " Segment granularity in bits (x86-16) " ) ;
2017-04-30 19:35:14 +02:00
n = NODECB ( " asm.syntax " , " intel " , & cb_asmsyntax ) ;
SETDESC ( n , " Select assembly syntax " ) ;
SETOPTIONS ( n , " att " , " intel " , " masm " , " jz " , " regnum " , NULL ) ;
SETI ( " asm.nbytes " , 6 , " Number of bytes for each opcode at disassembly " ) ;
SETPREF ( " asm.bytespace " , " false " , " Separate hexadecimal bytes with a whitespace " ) ;
2015-09-01 03:13:16 +02:00
# if R_SYS_BITS == R_SYS_BITS_64
2017-04-30 19:35:14 +02:00
SETICB ( " asm.bits " , 64 , & cb_asmbits , " Word size in bits at assembler " ) ;
2015-09-01 03:13:16 +02:00
# else
2017-04-30 19:35:14 +02:00
SETICB ( " asm.bits " , 32 , & cb_asmbits , " Word size in bits at assembler " ) ;
2015-09-01 03:13:16 +02:00
# endif
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.functions " , " true " , " Show functions in disassembly " ) ;
SETPREF ( " asm.xrefs " , " true " , " Show xrefs in disassembly " ) ;
SETPREF ( " asm.demangle " , " true " , " Show demangled symbols in disasm " ) ;
SETPREF ( " asm.describe " , " false " , " Show opcode description " ) ;
SETPREF ( " asm.hints " , " false " , " Show hints for magic numbers in disasm " ) ;
2018-04-24 11:32:51 +02:00
SETPREF ( " asm.highlight " , " " , " Highlight current line " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " asm.marks " , " true " , " Show marks before the disassembly " ) ;
2018-02-22 17:59:08 +01:00
SETPREF ( " asm.cmt.refs " , " false " , " Show flag and comments from refs in disasm " ) ;
SETPREF ( " asm.cmt.patch " , " false " , " Show patch comments in disasm " ) ;
SETPREF ( " asm.cmt.off " , " nodup " , " Show offset comment in disasm (true, false, nodup) " ) ;
2017-05-08 20:21:06 +02:00
SETPREF ( " asm.payloads " , " false " , " Show payload bytes in disasm " ) ;
2017-07-02 15:46:59 +08:00
n = NODECB ( " asm.strenc " , " guess " , & cb_asmstrenc ) ;
SETDESC ( n , " Assumed string encoding for disasm " ) ;
2017-07-24 07:39:58 +08:00
SETOPTIONS ( n , " latin1 " , " utf8 " , " utf16le " , " utf32le " , " guess " , NULL ) ;
2018-06-21 18:33:39 +08:00
/* bin */
2018-01-07 22:08:53 +01:00
SETCB ( " bin.usextr " , " true " , & cb_usextr , " Use extract plugins when loading files " ) ;
SETCB ( " bin.useldr " , " true " , & cb_useldr , " Use loader plugins when loading files " ) ;
2018-01-23 21:08:33 +08:00
SETCB ( " bin.strpurge " , " " , & cb_strpurge , " Purge strings (e bin.strpurge=? provides more detail) " ) ;
2017-10-21 12:01:46 +02:00
SETPREF ( " bin.b64str " , " false " , " Try to debase64 the strings " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " bin.libs " , " false " , " Try to load libraries after loading main binary " ) ;
n = NODECB ( " bin.strfilter " , " " , & cb_strfilter ) ;
SETDESC ( n , " Filter strings " ) ;
SETOPTIONS ( n , " a " , " 8 " , " p " , " e " , " u " , " i " , " U " , " f " , NULL ) ;
SETCB ( " bin.filter " , " true " , & cb_binfilter , " Filter symbol names to fix dupped names " ) ;
SETCB ( " bin.force " , " " , & cb_binforce , " Force that rbin plugin " ) ;
SETPREF ( " bin.lang " , " " , " Language for bin.demangle " ) ;
SETPREF ( " bin.demangle " , " true " , " Import demangled symbols from RBin " ) ;
SETCB ( " bin.demanglecmd " , " false " , & cb_bdc , " run xcrun swift-demangle and similar if available (SLOW) " ) ;
SETI ( " bin.baddr " , - 1 , " Base address of the binary " ) ;
SETI ( " bin.laddr " , 0 , " Base address for loading library ('*.so') " ) ;
2017-07-24 01:35:33 +02:00
SETCB ( " bin.dbginfo " , " true " , & cb_bindbginfo , " Load debug information at startup if available " ) ;
2017-05-17 22:01:27 +02:00
SETPREF ( " bin.relocs " , " true " , " Load relocs information at startup if available " ) ;
2017-04-30 19:35:14 +02:00
SETICB ( " bin.minstr " , 0 , & cb_binminstr , " Minimum string length for r_bin " ) ;
SETICB ( " bin.maxstr " , 0 , & cb_binmaxstr , " Maximum string length for r_bin " ) ;
SETICB ( " bin.maxstrbuf " , 1024 * 1024 * 10 , & cb_binmaxstrbuf , " Maximum size of range to load strings from " ) ;
SETCB ( " bin.prefix " , NULL , & cb_binprefix , " Prefix all symbols/sections/relocs with a specific string " ) ;
SETCB ( " bin.rawstr " , " false " , & cb_rawstr , " Load strings from raw binaries " ) ;
SETCB ( " bin.strings " , " true " , & cb_binstrings , " Load strings from rbin on startup " ) ;
SETCB ( " bin.debase64 " , " false " , & cb_debase64 , " Try to debase64 all strings " ) ;
SETPREF ( " bin.classes " , " true " , " Load classes from rbin on startup " ) ;
SETCB ( " bin.verbose " , " true " , & cb_binverbose , " Show RBin warnings when loading binaries " ) ;
2013-11-05 02:58:00 +01:00
2016-10-17 23:58:39 +02:00
/* prj */
2017-04-30 19:35:14 +02:00
SETPREF ( " prj.name " , " " , " Name of current project " ) ;
SETPREF ( " prj.files " , " false " , " Save the target binary inside the project directory " ) ;
SETPREF ( " prj.git " , " false " , " Every project is a git repo and saving is committing " ) ;
SETPREF ( " prj.zip " , " false " , " Use ZIP format for project files " ) ;
SETPREF ( " prj.gpg " , " false " , " TODO: Encrypt project with GnuPGv2 " ) ;
2018-01-24 19:54:21 +01:00
SETPREF ( " prj.simple " , " false " , " Use simple project saving style (functions, comments, options) " ) ;
2016-10-17 23:58:39 +02:00
2013-11-05 02:58:00 +01:00
/* cfg */
2017-04-30 19:35:14 +02:00
SETPREF ( " cfg.plugins " , " true " , " Load plugins at startup " ) ;
SETCB ( " time.fmt " , " %Y-%m-%d %H:%M:%S %z " , & cb_cfgdatefmt , " Date format (%Y-%m-%d %H:%M:%S %z) " ) ;
SETICB ( " time.zone " , 0 , & cb_timezone , " Time zone, in hours relative to GMT: +2, -1,.. " ) ;
2017-05-09 02:10:11 +02:00
SETCB ( " cfg.log " , " false " , & cb_cfglog , " Log changes using the T api needed for realtime syncing " ) ;
2017-07-25 22:03:52 -07:00
SETPREF ( " cfg.newtab " , " false " , " Show descriptions in command completion " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " cfg.debug " , " false " , & cb_cfgdebug , " Debugger mode " ) ;
2011-05-21 14:27:46 +02:00
p = r_sys_getenv ( " EDITOR " ) ;
2015-01-26 21:41:57 +03:00
# if __WINDOWS__ && !__CYGWIN__
2011-11-23 02:29:09 +01:00
r_config_set ( cfg , " cfg.editor " , p ? p : " notepad " ) ;
# else
2011-05-21 14:27:46 +02:00
r_config_set ( cfg , " cfg.editor " , p ? p : " vi " ) ;
2011-11-23 02:29:09 +01:00
# endif
2011-08-27 20:25:37 +02:00
free ( p ) ;
2013-11-05 02:58:00 +01:00
r_config_desc ( cfg , " cfg.editor " , " Select default editor program " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " cfg.user " , r_sys_whoami ( buf ) , " Set current username/pid " ) ;
2017-09-11 15:41:07 -07:00
SETCB ( " cfg.fortunes " , " true " , & cb_cfg_fortunes , " If enabled show tips at start " ) ;
SETCB ( " cfg.fortunes.type " , " tips,fun " , & cb_cfg_fortunes_type , " Type of fortunes to show (tips, fun, nsfw, creepy) " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " cfg.fortunes.clippy " , " false " , " Use ?E instead of ?e " ) ;
SETPREF ( " cfg.fortunes.tts " , " false " , " Speak out the fortune " ) ;
SETI ( " cfg.hashlimit " , SLURP_LIMIT , " If the file is bigger than hashlimit, do not compute hashes " ) ;
SETPREF ( " cfg.prefixdump " , " dump " , " Filename prefix for automated dumps " ) ;
SETCB ( " cfg.sandbox " , " false " , & cb_cfgsanbox , " Sandbox mode disables systems and open on upper directories " ) ;
SETPREF ( " cfg.wseek " , " false " , " Seek after write " ) ;
SETCB ( " cfg.bigendian " , " false " , & cb_bigendian , " Use little (false) or big (true) endianness " ) ;
2017-03-30 17:53:01 +00:00
// zign
2017-04-30 19:35:14 +02:00
SETPREF ( " zign.prefix " , " sign " , " Default prefix for zignatures matches " ) ;
SETI ( " zign.maxsz " , 500 , " Maximum zignature length " ) ;
SETI ( " zign.minsz " , 16 , " Minimum zignature length for matching " ) ;
SETI ( " zign.mincc " , 10 , " Minimum cyclomatic complexity for matching " ) ;
SETPREF ( " zign.graph " , " true " , " Use graph metrics for matching " ) ;
SETPREF ( " zign.bytes " , " true " , " Use bytes patterns for matching " ) ;
SETPREF ( " zign.offset " , " true " , " Use original offset for matching " ) ;
SETPREF ( " zign.refs " , " true " , " Use references for matching " ) ;
2018-05-02 16:58:14 +03:00
SETPREF ( " zign.autoload " , " false " , " Autoload all zignatures located in " R_JOIN_2_PATHS ( " ~ " , R2_HOME_ZIGNS ) ) ;
2013-11-05 02:58:00 +01:00
/* diff */
2017-04-30 19:35:14 +02:00
SETCB ( " diff.sort " , " addr " , & cb_diff_sort , " Specify function diff sorting column see (e diff.sort=?) " ) ;
SETI ( " diff.from " , 0 , " Set source diffing address for px (uses cc command) " ) ;
SETI ( " diff.to " , 0 , " Set destination diffing address for px (uses cc command) " ) ;
SETPREF ( " diff.bare " , " false " , " Never show function names in diff output " ) ;
SETPREF ( " diff.levenstein " , " false " , " Use faster (and buggy) levenstein algorithm for buffer distance diffing " ) ;
2013-11-05 02:58:00 +01:00
/* dir */
2018-07-21 20:31:36 +02:00
SETI ( " dir.depth " , 10 , " Maximum depth when searching recursively for files " ) ;
2017-08-12 00:06:03 +09:00
SETCB ( " dir.dbgsnap " , " . " , & cb_dbgsnap , " Path to session dump files " ) ;
2018-01-19 15:38:20 +01:00
{
2018-05-02 16:58:14 +03:00
char * path = r_str_newf ( R_JOIN_2_PATHS ( " %s " , R2_SDB_MAGIC ) , r_config_get ( core - > config , " dir.prefix " ) ) ;
2018-01-19 15:38:20 +01:00
SETPREF ( " dir.magic " , path , " Path to r_magic files " ) ;
free ( path ) ;
2018-05-02 16:58:14 +03:00
path = r_str_newf ( R_JOIN_2_PATHS ( " %s " , R2_PLUGINS ) , r_config_get ( core - > config , " dir.prefix " ) ) ;
SETPREF ( " dir.plugins " , path , " Path to plugin files to be loaded at startup " ) ;
free ( path ) ;
2018-01-19 15:38:20 +01:00
}
2017-04-30 19:35:14 +02:00
SETCB ( " dir.source " , " " , & cb_dirsrc , " Path to find source files " ) ;
SETPREF ( " dir.types " , " /usr/include " , " Default path to look for cparse type files " ) ;
2015-01-24 21:18:26 +01:00
# if __ANDROID__
2017-04-30 19:35:14 +02:00
SETPREF ( " dir.projects " , " /data/data/org.radare.radare2installer/radare2/projects " , " Default path for projects " ) ;
2015-01-24 21:18:26 +01:00
# else
2018-05-02 16:58:14 +03:00
SETPREF ( " dir.projects " , R_JOIN_2_PATHS ( " ~ " , R2_HOME_PROJECTS ) , " Default path for projects " ) ;
2015-01-24 21:18:26 +01:00
# endif
2018-05-02 16:58:14 +03:00
SETCB ( " dir.zigns " , R_JOIN_2_PATHS ( " ~ " , R2_HOME_ZIGNS ) , & cb_dirzigns , " Default path for zignatures (see zo command) " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " stack.bytes " , " true " , " Show bytes instead of words in stack " ) ;
SETPREF ( " stack.anotated " , " false " , " Show anotated hexdump in visual debug " ) ;
SETI ( " stack.size " , 64 , " Size in bytes of stack hexdump in visual debug " ) ;
SETI ( " stack.delta " , 0 , " Delta for the stack dump " ) ;
SETCB ( " dbg.libs " , " " , & cb_dbg_libs , " If set stop when loading matching libname " ) ;
SETI ( " dbg.hwbp " , 0 , " Set HW or SW breakpoints " ) ;
SETCB ( " dbg.unlibs " , " " , & cb_dbg_unlibs , " If set stop when unloading matching libname " ) ;
SETPREF ( " dbg.slow " , " false " , " Show stack and regs in visual mode in a slow but verbose mode " ) ;
2018-02-22 10:51:41 +05:30
SETPREF ( " dbg.funcarg " , " false " , " Display arguments to function call in visual mode " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " dbg.bpinmaps " , " true " , " Force breakpoints to be inside a valid map " ) ;
SETCB ( " dbg.forks " , " false " , & cb_dbg_forks , " Stop execution if fork() is done (see dbg.threads) " ) ;
n = NODECB ( " dbg.btalgo " , " fuzzy " , & cb_dbg_btalgo ) ;
SETDESC ( n , " Select backtrace algorithm " ) ;
2018-04-29 17:42:55 +08:00
SETOPTIONS ( n , " default " , " fuzzy " , " anal " , " trace " , NULL ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " dbg.threads " , " false " , & cb_stopthreads , " Stop all threads when debugger breaks (see dbg.forks) " ) ;
SETCB ( " dbg.clone " , " false " , & cb_dbg_clone , " Stop execution if new thread is created " ) ;
SETCB ( " dbg.aftersyscall " , " true " , & cb_dbg_aftersc , " Stop execution before the syscall is executed (see dcs) " ) ;
SETCB ( " dbg.execs " , " false " , & cb_dbg_execs , " Stop execution if new thread is created " ) ;
SETCB ( " dbg.profile " , " " , & cb_runprofile , " Path to RRunProfile file " ) ;
SETCB ( " dbg.args " , " " , & cb_dbg_args , " Set the args of the program to debug " ) ;
SETCB ( " dbg.follow.child " , " false " , & cb_dbg_follow_child , " Continue tracing the child process on fork. By default the parent process is traced " ) ;
2013-11-05 02:58:00 +01:00
/* debug */
2017-04-30 19:35:14 +02:00
SETCB ( " dbg.status " , " false " , & cb_dbgstatus , " Set cmd.prompt to '.dr*' or '.dr*;drd;sr PC;pi 1;s-' " ) ;
2017-01-31 22:27:39 +01:00
# if DEBUGGER
2017-04-30 19:35:14 +02:00
SETCB ( " dbg.backend " , " native " , & cb_dbgbackend , " Select the debugger backend " ) ;
2017-01-31 22:27:39 +01:00
# else
2017-04-30 19:35:14 +02:00
SETCB ( " dbg.backend " , " esil " , & cb_dbgbackend , " Select the debugger backend " ) ;
2017-01-31 22:27:39 +01:00
# endif
2017-04-30 19:35:14 +02:00
n = NODECB ( " dbg.bep " , " loader " , & cb_dbgbep ) ;
SETDESC ( n , " Break on entrypoint " ) ;
SETOPTIONS ( n , " loader " , " entry " , " constructor " , " main " , NULL ) ;
2016-07-03 20:05:01 +02:00
if ( core - > cons - > rows > 30 ) { // HACKY
2013-11-05 02:58:00 +01:00
r_config_set_i ( cfg , " dbg.follow " , 64 ) ;
2016-07-03 20:05:01 +02:00
} else {
r_config_set_i ( cfg , " dbg.follow " , 32 ) ;
}
2013-11-05 02:58:00 +01:00
r_config_desc ( cfg , " dbg.follow " , " Follow program counter when pc > core->offset + dbg.follow " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " dbg.swstep " , " false " , & cb_swstep , " Force use of software steps (code analysis+breakpoint) " ) ;
SETPREF ( " dbg.trace.inrange " , " false " , " While tracing, avoid following calls outside specified range " ) ;
2017-05-20 15:03:17 +02:00
SETPREF ( " dbg.trace.libs " , " true " , " Trace library code too " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " dbg.exitkills " , " true " , " Kill process on exit " ) ;
2017-07-25 22:09:09 +05:30
SETPREF ( " dbg.exe.path " , NULL , " Path to binary being debugged " ) ;
2017-09-20 13:33:45 +02:00
SETICB ( " dbg.gdb.page_size " , 4096 , & cb_dbg_gdb_page_size , " Page size on gdb target (useful for QEMU) " ) ;
2017-09-29 17:40:01 +05:30
SETICB ( " dbg.gdb.retries " , 10 , & cb_dbg_gdb_retries , " Number of retries before gdb packet read times out " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " dbg.consbreak " , " false " , & cb_consbreak , " SIGINT handle for attached processes " ) ;
2014-10-26 01:26:41 +02:00
r_config_set_getter ( cfg , " dbg.swstep " , ( RConfigCallback ) __dbg_swstep_getter ) ;
2014-09-26 13:57:03 +02:00
// TODO: This should be specified at first by the debug backend when attaching
# if __arm__ || __mips__
2017-04-30 19:35:14 +02:00
SETICB ( " dbg.bpsize " , 4 , & cb_dbgbpsize , " Size of software breakpoints " ) ;
2014-09-26 13:57:03 +02:00
# else
2017-04-30 19:35:14 +02:00
SETICB ( " dbg.bpsize " , 1 , & cb_dbgbpsize , " Size of software breakpoints " ) ;
2014-09-26 13:57:03 +02:00
# endif
2017-08-28 10:19:57 +02:00
SETPREF ( " dbg.bpsysign " , " false " , " Ignore system breakpoints " ) ;
2017-04-30 19:35:14 +02:00
SETICB ( " dbg.btdepth " , 128 , & cb_dbgbtdepth , " Depth of backtrace " ) ;
SETCB ( " dbg.trace " , " false " , & cb_trace , " Trace program execution (see asm.trace) " ) ;
SETICB ( " dbg.trace.tag " , 0 , & cb_tracetag , " Trace tag " ) ;
2013-11-05 02:58:00 +01:00
2018-05-11 10:58:33 +02:00
2018-05-17 08:39:39 +02:00
/* cmd */
2017-04-30 19:35:14 +02:00
SETPREF ( " cmd.xterm " , " xterm -bg black -fg gray -e " , " xterm command to spawn with V@ " ) ;
SETICB ( " cmd.depth " , 10 , & cb_cmddepth , " Maximum command depth " ) ;
SETPREF ( " cmd.bp " , " " , " Run when a breakpoint is hit " ) ;
SETICB ( " cmd.hitinfo " , 1 , & cb_debug_hitinfo , " Show info when a tracepoint/breakpoint is hit " ) ;
SETPREF ( " cmd.times " , " " , " Run when a command is repeated (number prefix) " ) ;
SETPREF ( " cmd.stack " , " " , " Command to display the stack in visual debug mode " ) ;
SETPREF ( " cmd.cprompt " , " " , " Column visual prompt commands " ) ;
SETPREF ( " cmd.gprompt " , " " , " Graph visual prompt commands " ) ;
SETPREF ( " cmd.hit " , " " , " Run when a search hit is found " ) ;
SETPREF ( " cmd.open " , " " , " Run when file is opened " ) ;
2018-03-14 12:25:37 +01:00
SETCB ( " cmd.pdc " , " " , & cb_cmdpdc , " Select pseudo-decompiler command to run after pdc " ) ;
2017-05-09 02:58:39 +02:00
SETCB ( " cmd.log " , " " , & cb_cmdlog , " Every time a new T log is added run this command " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " cmd.prompt " , " " , " Prompt commands " ) ;
SETCB ( " cmd.repeat " , " false " , & cb_cmdrepeat , " Empty command an alias for '..' (repeat last command) " ) ;
SETPREF ( " cmd.fcn.new " , " " , " Run when new function is analyzed " ) ;
SETPREF ( " cmd.fcn.delete " , " " , " Run when a function is deleted " ) ;
SETPREF ( " cmd.fcn.rename " , " " , " Run when a function is renamed " ) ;
SETPREF ( " cmd.visual " , " " , " Replace current print mode " ) ;
SETPREF ( " cmd.vprompt " , " " , " Visual prompt commands " ) ;
SETCB ( " cmd.esil.mdev " , " " , & cb_cmd_esil_mdev , " Command to run when memory device address is accessed " ) ;
SETCB ( " cmd.esil.intr " , " " , & cb_cmd_esil_intr , " Command to run when an esil interrupt happens " ) ;
SETCB ( " cmd.esil.trap " , " " , & cb_cmd_esil_trap , " Command to run when an esil trap happens " ) ;
2017-06-10 18:00:07 +02:00
SETCB ( " cmd.esil.todo " , " " , & cb_cmd_esil_todo , " Command to run when the esil instruction contains TODO " ) ;
2017-06-10 20:40:16 +02:00
SETCB ( " cmd.esil.ioer " , " " , & cb_cmd_esil_ioer , " Command to run when esil fails to IO (invalid read/write) " ) ;
2015-09-08 02:53:33 +02:00
2013-11-05 02:58:00 +01:00
/* filesystem */
2017-04-30 19:35:14 +02:00
n = NODECB ( " fs.view " , " normal " , & cb_fsview ) ;
SETDESC ( n , " Set visibility options for filesystems " ) ;
SETOPTIONS ( n , " all " , " deleted " , " special " , NULL ) ;
2013-11-05 02:58:00 +01:00
/* hexdump */
2017-04-30 19:35:14 +02:00
SETPREF ( " hex.header " , " true " , " Show header in hexdumps " ) ;
SETCB ( " hex.pairs " , " true " , & cb_hexpairs , " Show bytes paired in 'px' hexdump " ) ;
SETCB ( " hex.compact " , " false " , & cb_hexcompact , " Show smallest 16 byte col hexdump (60 columns) " ) ;
SETI ( " hex.flagsz " , 0 , " If non zero, overrides the flag size in pxa " ) ;
SETICB ( " hex.cols " , 16 , & cb_hexcols , " Number of columns in hexdump " ) ;
2017-05-29 04:36:34 +02:00
SETI ( " hex.pcols " , 40 , " Number of pixel columns for prc " ) ;
2017-04-30 19:35:14 +02:00
SETI ( " hex.depth " , 5 , " Maximal level of recurrence while telescoping memory " ) ;
SETPREF ( " hex.onechar " , " false " , " Number of columns in hexdump " ) ;
SETICB ( " hex.stride " , 0 , & cb_hexstride , " Line stride in hexdump (default is 0) " ) ;
SETCB ( " hex.comments " , " true " , & cb_hexcomments , " Show comments in 'px' hexdump " ) ;
2013-11-05 02:58:00 +01:00
/* http */
2017-04-30 19:35:14 +02:00
SETPREF ( " http.log " , " true " , " Show HTTP requests processed " ) ;
SETPREF ( " http.logfile " , " " , " Specify a log file instead of stderr for http requests " ) ;
SETPREF ( " http.cors " , " false " , " Enable CORS " ) ;
SETPREF ( " http.referer " , " " , " CSFR protection if set " ) ;
SETPREF ( " http.dirlist " , " false " , " Enable directory listing " ) ;
SETPREF ( " http.allow " , " " , " Only accept clients from the comma separated IP list " ) ;
2012-09-06 03:12:54 +02:00
# if __WINDOWS__
r_config_set ( cfg , " http.browser " , " start " ) ;
# else
2016-07-03 20:05:01 +02:00
if ( r_file_exists ( " /usr/bin/openURL " ) ) { // iOS ericautils
2014-01-20 03:03:45 +01:00
r_config_set ( cfg , " http.browser " , " /usr/bin/openURL " ) ;
2016-07-03 20:05:01 +02:00
} else if ( r_file_exists ( " /system/bin/toolbox " ) ) {
2012-09-06 03:12:54 +02:00
r_config_set ( cfg , " http.browser " ,
2013-11-05 02:58:00 +01:00
" LD_LIBRARY_PATH=/system/lib am start -a android.intent.action.VIEW -d " ) ;
2016-07-03 20:05:01 +02:00
} else if ( r_file_exists ( " /usr/bin/xdg-open " ) ) {
2012-09-06 03:12:54 +02:00
r_config_set ( cfg , " http.browser " , " xdg-open " ) ;
2016-07-03 20:05:01 +02:00
} else if ( r_file_exists ( " /usr/bin/open " ) ) {
2012-09-06 03:12:54 +02:00
r_config_set ( cfg , " http.browser " , " open " ) ;
2016-07-03 20:05:01 +02:00
} else {
r_config_set ( cfg , " http.browser " , " firefox " ) ;
}
2015-05-07 15:49:25 +02:00
r_config_desc ( cfg , " http.browser " , " Command to open HTTP URLs " ) ;
2013-11-05 02:58:00 +01:00
# endif
2017-04-30 19:35:14 +02:00
SETI ( " http.maxsize " , 0 , " Maximum file size for upload " ) ;
SETPREF ( " http.bind " , " localhost " , " Server address " ) ;
2018-05-02 16:58:14 +03:00
SETPREF ( " http.homeroot " , R_JOIN_2_PATHS ( " ~ " , R2_HOME_WWWROOT ) , " http home root directory " ) ;
2016-04-26 03:13:00 +02:00
# if __ANDROID__
2017-04-30 19:35:14 +02:00
SETPREF ( " http.root " , " /data/data/org.radare.radare2installer/www " , " http root directory " ) ;
2014-04-21 12:55:34 +02:00
# else
2017-04-30 19:35:14 +02:00
SETPREF ( " http.root " , R2_WWWROOT , " http root directory " ) ;
2014-04-21 12:55:34 +02:00
# endif
2017-04-30 19:35:14 +02:00
SETPREF ( " http.port " , " 9090 " , " HTTP server port " ) ;
SETPREF ( " http.maxport " , " 9999 " , " Last HTTP server port " ) ;
SETPREF ( " http.ui " , " m " , " Default webui (enyo, m, p, t) " ) ;
SETPREF ( " http.sandbox " , " true " , " Sandbox the HTTP server " ) ;
SETI ( " http.timeout " , 3 , " Disconnect clients after N seconds of inactivity " ) ;
SETI ( " http.dietime " , 0 , " Kill server after N seconds with no client " ) ;
SETPREF ( " http.verbose " , " true " , " Output server logs to stdout " ) ;
SETPREF ( " http.upget " , " false " , " /up/ answers GET requests, in addition to POST " ) ;
SETPREF ( " http.upload " , " false " , " Enable file uploads to /up/<filename> " ) ;
SETPREF ( " http.uri " , " " , " Address of HTTP proxy " ) ;
2013-01-03 00:47:58 +01:00
tmpdir = r_file_tmpdir ( ) ;
r_config_set ( cfg , " http.uproot " , tmpdir ) ;
free ( tmpdir ) ;
2016-07-03 20:05:01 +02:00
r_config_desc ( cfg , " http.uproot " , " Path where files are uploaded " ) ;
2013-11-05 02:58:00 +01:00
2018-02-27 15:11:26 +03:00
/* tcp */
SETPREF ( " tcp.islocal " , " false " , " Bind a loopback for tcp command server " ) ;
2013-11-05 02:58:00 +01:00
/* graph */
2017-04-30 19:35:14 +02:00
SETPREF ( " graph.comments " , " true " , " Show disasm comments in graph " ) ;
SETPREF ( " graph.cmtright " , " false " , " Show comments at right " ) ;
2018-05-17 08:39:39 +02:00
SETCB ( " graph.extension " , " gif " , & cb_graphformat , " Graph extension when using 'w' format (png, jpg, pdf, ps, svg, json) " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " graph.refs " , " false " , " Graph references in callgraphs (.agc*;aggi) " ) ;
2017-12-29 11:22:22 +01:00
SETI ( " graph.edges " , 2 , " 0=no edges, 1=simple edges, 2=avoid collisions " ) ;
2017-04-30 19:35:14 +02:00
SETI ( " graph.layout " , 0 , " Graph layout (0=vertical, 1=horizontal) " ) ;
SETI ( " graph.linemode " , 1 , " Graph edges (0=diagonal, 1=square) " ) ;
SETPREF ( " graph.font " , " Courier " , " Font for dot graphs " ) ;
SETPREF ( " graph.offset " , " false " , " Show offsets in graphs " ) ;
SETPREF ( " graph.web " , " false " , " Display graph in web browser (VV) " ) ;
2018-05-23 23:27:12 +02:00
SETI ( " graph.from " , UT64_MAX , " Lower bound address when drawing global graphs " ) ;
SETI ( " graph.to " , UT64_MAX , " Upper bound address when drawing global graphs " ) ;
2017-04-30 19:35:14 +02:00
SETI ( " graph.scroll " , 5 , " Scroll speed in ascii-art graph " ) ;
SETPREF ( " graph.invscroll " , " false " , " Invert scroll direction in ascii-art graph " ) ;
SETPREF ( " graph.title " , " " , " Title of the graph " ) ;
SETPREF ( " graph.gv.node " , " " , " Graphviz node style. (color=gray, style=filled shape=box) " ) ;
SETPREF ( " graph.gv.edge " , " " , " Graphviz edge style. (arrowhead= \" vee \" ) " ) ;
2017-06-22 22:55:12 -07:00
SETPREF ( " graph.gv.spline " , " " , " Graphviz spline style. (splines= \" ortho \" ) " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " graph.gv.graph " , " " , " Graphviz global style attributes. (bgcolor=white) " ) ;
SETPREF ( " graph.gv.current " , " false " , " Highlight the current node in graphviz graph. " ) ;
SETPREF ( " graph.nodejmps " , " true " , " Enables shortcuts for every node. " ) ;
2018-07-27 22:36:08 +02:00
SETPREF ( " graph.hints " , " true " , " Show true (t) and false (f) hints for conditional edges in graph " ) ;
2018-08-01 13:06:42 +02:00
SETCB ( " graph.dotted " , " false " , & cb_dotted , " Dotted lines for conditional jumps in graph " ) ;
2018-05-17 08:39:39 +02:00
2013-11-05 02:58:00 +01:00
/* hud */
2017-04-30 19:35:14 +02:00
SETPREF ( " hud.path " , " " , " Set a custom path for the HUD file " ) ;
2013-09-16 04:08:08 +02:00
2017-04-30 19:35:14 +02:00
SETCB ( " esil.exectrap " , " false " , & cb_exectrap , " trap when executing code in non-executable memory " ) ;
SETCB ( " esil.iotrap " , " true " , & cb_iotrap , " invalid read or writes produce a trap exception " ) ;
SETPREF ( " esil.romem " , " false " , " Set memory as read-only for ESIL " ) ;
SETPREF ( " esil.stats " , " false " , " Statistics from ESIL emulation stored in sdb " ) ;
SETPREF ( " esil.nonull " , " false " , " Prevent memory read, memory write at null pointer " ) ;
SETCB ( " esil.mdev.range " , " " , & cb_mdevrange , " Specify a range of memory to be handled by cmd.esil.mdev " ) ;
2014-09-11 04:18:23 +02:00
2013-11-05 02:58:00 +01:00
/* scr */
2013-09-16 04:08:08 +02:00
# if __EMSCRIPTEN__
2013-11-05 02:58:00 +01:00
r_config_set_cb ( cfg , " scr.fgets " , " true " , cb_scrfgets ) ;
2013-09-16 04:08:08 +02:00
# else
2013-11-05 02:58:00 +01:00
r_config_set_cb ( cfg , " scr.fgets " , " false " , cb_scrfgets ) ;
2013-09-16 04:08:08 +02:00
# endif
2015-05-07 15:49:25 +02:00
r_config_desc ( cfg , " scr.fgets " , " Use fgets() instead of dietline for prompt input " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " scr.echo " , " false " , & cb_screcho , " Show rcons output in realtime to stderr and buffer " ) ;
SETICB ( " scr.linesleep " , 0 , & cb_scrlinesleep , " Flush sleeping some ms in every line " ) ;
SETICB ( " scr.pagesize " , 1 , & cb_scrpagesize , " Flush in pages when scr.linesleep is != 0 " ) ;
SETCB ( " scr.flush " , " false " , & cb_scrflush , " Force flush to console in realtime (breaks scripting) " ) ;
2016-08-25 20:27:52 +02:00
/* TODO: rename to asm.color.ops ? */
2017-04-30 19:35:14 +02:00
SETPREF ( " scr.zoneflags " , " true " , " Show zoneflags in visual mode before the title (see fz?) " ) ;
2018-02-22 12:45:54 +01:00
SETPREF ( " scr.slow " , " true " , " Do slow stuff on visual mode like RFlag.get_at(true) " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " scr.color.ops " , " true " , " Colorize numbers and registers in opcodes " ) ;
2018-07-16 23:35:55 +02:00
SETPREF ( " scr.color.args " , " true " , " Colorize arguments and variables of functions " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " scr.color.bytes " , " true " , " Colorize bytes that represent the opcodes of the instruction " ) ;
2015-11-01 05:10:49 +01:00
# if __WINDOWS__ && !__CYGWIN__
2018-04-21 20:37:20 +08:00
SETCB ( " scr.ansicon " , r_str_bool ( r_cons_singleton ( ) - > ansicon ) ,
2015-11-01 05:10:49 +01:00
& scr_ansicon , " Use ANSICON mode or not on Windows " ) ;
# endif
2014-09-22 15:00:41 +02:00
# if __ANDROID__
2017-04-30 19:35:14 +02:00
SETPREF ( " scr.responsive " , " true " , " Auto-adjust Visual depending on screen (e.g. unset asm.bytes) " ) ;
2014-09-22 15:00:41 +02:00
# else
2017-04-30 19:35:14 +02:00
SETPREF ( " scr.responsive " , " false " , " Auto-adjust Visual depending on screen (e.g. unset asm.bytes) " ) ;
2014-09-22 15:00:41 +02:00
# endif
2018-02-22 17:59:08 +01:00
SETPREF ( " scr.wheel.nkey " , " false " , " Use sn/sp and scr.nkey on wheel instead of scroll " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " scr.wheel " , " true " , " Mouse wheel in Visual; temporaryly disable/reenable by right click/Enter) " ) ;
SETPREF ( " scr.atport " , " false " , " V@ starts a background http server and spawns an r2 -C " ) ;
2018-02-22 17:59:08 +01:00
SETI ( " scr.wheel.speed " , 4 , " Mouse wheel speed " ) ;
2017-04-30 19:35:14 +02:00
// DEPRECATED: USES hex.cols now SETI ("scr.colpos", 80, "Column position of cmd.cprompt in visual");
SETCB ( " scr.breakword " , " " , & cb_scrbreakword , " Emulate console break (^C) when a word is printed (useful for pD) " ) ;
2017-07-09 18:35:11 +08:00
SETCB ( " scr.breaklines " , " false " , & cb_breaklines , " Break lines in Visual instead of truncating them " ) ;
2017-04-30 19:35:14 +02:00
SETICB ( " scr.columns " , 0 , & cb_scrcolumns , " Force console column count (width) " ) ;
SETCB ( " scr.rows " , " 0 " , & cb_scrrows , " Force console row count (height) " ) ;
SETICB ( " scr.rows " , 0 , & cb_rows , " Force console row count (height) (duplicate?) " ) ;
SETCB ( " scr.fps " , " false " , & cb_fps , " Show FPS in Visual " ) ;
SETICB ( " scr.fix.rows " , 0 , & cb_fixrows , " Workaround for Linux TTY " ) ;
SETICB ( " scr.fix.columns " , 0 , & cb_fixcolumns , " Workaround for Prompt iOS SSH client " ) ;
SETCB ( " scr.highlight " , " " , & cb_scrhighlight , " Highlight that word at RCons level " ) ;
SETCB ( " scr.interactive " , " true " , & cb_scrint , " Start in interactive mode " ) ;
SETI ( " scr.feedback " , 1 , " Set visual feedback level (1=arrow on jump, 2=every key (useful for videos)) " ) ;
SETCB ( " scr.html " , " false " , & cb_scrhtml , " Disassembly uses HTML syntax " ) ;
n = NODECB ( " scr.nkey " , " flag " , & cb_scrnkey ) ;
SETDESC ( n , " Select visual seek mode (affects n/N visual commands) " ) ;
SETOPTIONS ( n , " fun " , " hit " , " flag " , NULL ) ;
SETCB ( " scr.pager " , " " , & cb_pager , " Select pager program (when output overflows the window) " ) ;
SETPREF ( " scr.randpal " , " false " , " Random color palete or just get the next one from 'eco' " ) ;
2018-01-19 19:50:29 +01:00
SETCB ( " scr.color.grep " , " false " , & cb_scr_color_grep , " Enable colors when using ~grep " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " scr.pipecolor " , " false " , " Enable colors when using pipes " ) ;
2018-02-22 17:59:08 +01:00
SETPREF ( " scr.prompt.file " , " false " , " Show user prompt file (used by r2 -q) " ) ;
SETPREF ( " scr.prompt.flag " , " false " , " Show flag name in the prompt " ) ;
SETPREF ( " scr.prompt.sect " , " false " , " Show section name in the prompt " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " scr.tts " , " false " , " Use tts if available by a command (see ic) " ) ;
SETCB ( " scr.prompt " , " true " , & cb_scrprompt , " Show user prompt (used by r2 -q) " ) ;
SETCB ( " scr.tee " , " " , & cb_teefile , " Pipe output to file of this name " ) ;
SETPREF ( " scr.seek " , " " , " Seek to the specified address on startup " ) ;
2018-02-24 12:04:43 +01:00
SETICB ( " scr.color " , ( core - > print - > flags & R_PRINT_FLAGS_COLOR ) ? COLOR_MODE_16 : COLOR_MODE_DISABLED , & cb_color , " Enable colors (0: none, 1: ansi, 2: 256 colors, 3: truecolor) " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " scr.null " , " false " , & cb_scrnull , " Show no output " ) ;
SETCB ( " scr.utf8 " , r_cons_is_utf8 ( ) ? " true " : " false " ,
2015-04-20 14:44:54 +02:00
& cb_utf8 , " Show UTF-8 characters instead of ANSI " ) ;
2017-10-08 16:39:27 +05:30
SETCB ( " scr.utf8.curvy " , " false " , & cb_utf8_curvy , " Show curved UTF-8 corners (requires scr.utf8) " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " scr.histsave " , " true " , " Always save history on exit " ) ;
2018-02-24 19:01:21 +08:00
n = NODECB ( " scr.strconv " , " asciiesc " , & cb_scrstrconv ) ;
SETDESC ( n , " Convert string before display " ) ;
SETOPTIONS ( n , " asciiesc " , " asciidot " , NULL ) ;
2017-11-22 21:35:09 +08:00
/* str */
2018-03-12 22:54:05 +08:00
SETCB ( " str.escbslash " , " false " , & cb_str_escbslash , " Escape the backslash " ) ;
2017-11-22 21:35:09 +08:00
2013-11-05 02:58:00 +01:00
/* search */
2017-04-30 19:35:14 +02:00
SETCB ( " search.contiguous " , " true " , & cb_contiguous , " Accept contiguous/adjacent search hits " ) ;
SETICB ( " search.align " , 0 , & cb_searchalign , " Only catch aligned search hits " ) ;
SETI ( " search.chunk " , 0 , " Chunk size for /+ (default size is asm.bits/8 " ) ;
SETI ( " search.esilcombo " , 8 , " Stop search after N consecutive hits " ) ;
SETI ( " search.distance " , 0 , " Search string distance " ) ;
SETPREF ( " search.flags " , " true " , " All search results are flagged, otherwise only printed " ) ;
SETPREF ( " search.overlap " , " false " , " Look for overlapped search hits " ) ;
SETI ( " search.maxhits " , 0 , " Maximum number of hits (0: no limit) " ) ;
SETI ( " search.from " , - 1 , " Search start address " ) ;
2017-09-07 17:07:33 +02:00
n = NODECB ( " search.in " , " io.maps " , & cb_searchin ) ;
2017-04-30 19:35:14 +02:00
SETDESC ( n , " Specify search boundaries " ) ;
2017-09-18 01:19:24 +02:00
SETOPTIONS ( n , " raw " , " block " , " io.map " , " io.maps " ,
" io.sections " , " io.sections.write " , " io.sections.exec " , " io.sections.readonly " ,
" dbg.stack " , " dbg.heap " , " dbg.map " ,
" dbg.maps " , " dbg.maps.exec " , " dbg.maps.write " , " dbg.maps.readonly " ,
" anal.fcn " , " anal.bb " , NULL ) ;
2017-04-30 19:35:14 +02:00
SETICB ( " search.kwidx " , 0 , & cb_search_kwidx , " Store last search index count " ) ;
SETPREF ( " search.prefix " , " hit " , " Prefix name in search hits label " ) ;
SETPREF ( " search.show " , " true " , " Show search results " ) ;
SETI ( " search.to " , - 1 , " Search end address " ) ;
2014-12-14 18:19:10 -05:00
/* rop */
2017-04-30 19:35:14 +02:00
SETI ( " rop.len " , 5 , " Maximum ROP gadget length " ) ;
2018-04-09 02:15:22 +02:00
SETPREF ( " rop.sdb " , " false " , " Cache results in sdb (experimental) " ) ;
SETPREF ( " rop.db " , " true " , " Categorize rop gadgets in sdb " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " rop.subchains " , " false " , " Display every length gadget from rop.len=X to 2 in /Rl " ) ;
SETPREF ( " rop.conditional " , " false " , " Include conditional jump, calls and returns in ropsearch " ) ;
SETPREF ( " rop.nx " , " false " , " Include NX/XN/XD sections in ropsearch " ) ;
SETPREF ( " rop.comments " , " false " , " Display comments in rop search output " ) ;
2013-11-05 02:58:00 +01:00
/* io */
2017-04-30 19:35:14 +02:00
SETCB ( " io.buffer " , " false " , & cb_iobuffer , " Load and use buffer cache if enabled " ) ;
SETI ( " io.buffer.from " , 0 , " Lower address of buffered cache " ) ;
SETI ( " io.buffer.to " , 0 , " Higher address of buffered cache " ) ;
2017-09-15 02:32:01 -07:00
SETCB ( " io.cache " , " false " , & cb_io_cache , " Change both of io.cache.{read,write} " ) ;
2017-12-18 01:44:22 +01:00
SETCB ( " io.cache.auto " , " false " , & cb_io_cache_mode , " Automatic cache all reads in the IO backend " ) ;
2017-09-15 02:32:01 -07:00
SETCB ( " io.cache.read " , " false " , & cb_io_cache_read , " Enable read cache for vaddr (or paddr when io.va=0) " ) ;
SETCB ( " io.cache.write " , " false " , & cb_io_cache_write , " Enable write cache for vaddr (or paddr when io.va=0) " ) ;
2017-08-14 00:55:47 +00:00
SETCB ( " io.pcache " , " false " , & cb_iopcache , " io.cache for p-level " ) ;
2017-08-23 12:46:07 +02:00
SETCB ( " io.pcache.write " , " false " , & cb_iopcachewrite , " Enable write-cache " ) ;
SETCB ( " io.pcache.read " , " false " , & cb_iopcacheread , " Enable read-cache " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " io.ff " , " true " , & cb_ioff , " Fill invalid buffers with 0xff instead of returning error " ) ;
2017-08-26 02:04:45 +02:00
SETPREF ( " io.exec " , " true " , " See !!r2 -h~-x " ) ;
2017-04-30 19:35:14 +02:00
SETICB ( " io.0xff " , 0xff , & cb_io_oxff , " Use this value instead of 0xff to fill unallocated areas " ) ;
SETCB ( " io.aslr " , " false " , & cb_ioaslr , " Disable ASLR for spawn and such " ) ;
SETCB ( " io.va " , " true " , & cb_iova , " Use virtual address layout " ) ;
2018-07-02 12:19:13 +02:00
SETCB ( " io.pava " , " false " , & cb_io_pava , " Use EXPERIMENTAL paddr -> vaddr address mode " ) ;
2017-04-30 19:35:14 +02:00
SETCB ( " io.autofd " , " true " , & cb_ioautofd , " Change fd when opening a new file " ) ;
2014-10-07 19:35:15 +02:00
2013-11-05 02:58:00 +01:00
/* file */
2017-04-30 19:35:14 +02:00
SETPREF ( " file.desc " , " " , " User defined file description (used by projects) " ) ;
SETPREF ( " file.md5 " , " " , " MD5 sum of current file " ) ;
SETPREF ( " file.info " , " true " , " RBin info loaded " ) ;
SETPREF ( " file.offset " , " " , " Offset where the file will be mapped at " ) ;
2017-05-29 03:01:39 +02:00
SETCB ( " file.path " , " " , & cb_filepath , " Path of current file " ) ;
2017-05-29 14:02:50 +02:00
SETPREF ( " file.lastpath " , " " , " Path of current file " ) ;
2017-04-30 19:35:14 +02:00
SETPREF ( " file.sha1 " , " " , " SHA1 hash of current file " ) ;
SETPREF ( " file.type " , " " , " Type of current file " ) ;
SETI ( " file.loadalign " , 1024 , " Alignment of load addresses " ) ;
SETI ( " file.openmany " , 1 , " Maximum number of files opened at once " ) ;
SETPREF ( " file.nowarn " , " true " , " Suppress file loading warning messages " ) ;
SETPREF ( " file.location " , " " , " Is the file 'local', 'remote', or 'memory' " ) ;
2013-11-05 02:58:00 +01:00
/* magic */
2017-04-30 19:35:14 +02:00
SETI ( " magic.depth " , 100 , " Recursivity depth in magic description strings " ) ;
2013-11-05 02:58:00 +01:00
/* rap */
2017-04-30 19:35:14 +02:00
SETPREF ( " rap.loop " , " true " , " Run rap as a forever-listening daemon " ) ;
2013-11-05 02:58:00 +01:00
2012-09-28 02:20:52 +02:00
/* nkeys */
2017-04-30 19:35:14 +02:00
SETPREF ( " key.s " , " " , " override step into action " ) ;
SETPREF ( " key.S " , " " , " override step over action " ) ;
2016-07-03 20:05:01 +02:00
for ( i = 1 ; i < 13 ; i + + ) {
2012-08-19 03:28:17 +02:00
snprintf ( buf , sizeof ( buf ) , " key.f%d " , i ) ;
2016-07-03 20:05:01 +02:00
snprintf ( buf + 10 , sizeof ( buf ) - 10 ,
2013-11-05 02:58:00 +01:00
" Run this when F%d key is pressed in visual mode " , i ) ;
2012-08-19 03:28:17 +02:00
switch ( i ) {
2013-11-05 02:58:00 +01:00
default : p = " " ; break ;
2012-08-19 03:28:17 +02:00
}
r_config_set ( cfg , buf , p ) ;
r_config_desc ( cfg , buf , buf + 10 ) ;
}
2013-11-05 02:58:00 +01:00
2011-02-17 00:58:54 +01:00
/* zoom */
2017-04-30 19:35:14 +02:00
SETCB ( " zoom.byte " , " h " , & cb_zoombyte , " Zoom callback to calculate each byte (See pz? for help) " ) ;
SETI ( " zoom.from " , 0 , " Zoom start address " ) ;
SETI ( " zoom.maxsz " , 512 , " Zoom max size of block " ) ;
SETI ( " zoom.to " , 0 , " Zoom end address " ) ;
2018-01-03 22:06:15 +05:30
n = NODECB ( " zoom.in " , " io.map " , & cb_searchin ) ;
2018-01-02 23:07:33 +05:30
SETDESC ( n , " Specify boundaries for zoom " ) ;
SETOPTIONS ( n , " raw " , " block " , " io.map " , " io.maps " ,
" io.sections " , " io.sections.write " , " io.sections.exec " , " io.sections.readonly " ,
" dbg.stack " , " dbg.heap " , " dbg.map " ,
" dbg.maps " , " dbg.maps.exec " , " dbg.maps.write " , " dbg.maps.readonly " ,
" anal.fcn " , " anal.bb " , NULL ) ;
2015-12-21 22:27:05 +01:00
/* lines */
2017-04-30 19:35:14 +02:00
SETI ( " lines.from " , 0 , " Start address for line seek " ) ;
SETCB ( " lines.to " , " $s " , & cb_linesto , " End address for line seek " ) ;
SETCB ( " lines.abs " , " false " , & cb_linesabs , " Enable absolute line numbers " ) ;
2015-12-21 22:27:05 +01:00
2015-09-14 12:35:38 +02:00
r_config_lock ( cfg , true ) ;
return true ;
2009-02-05 22:08:46 +01:00
}