mirror of
https://github.com/radareorg/radare2.git
synced 2024-10-07 18:43:45 +00:00
* Add pt command for print times (Thanks @earada for the patch)
- pt prints times in unix format - ptd prints times in dos format - ptn prints times in ntfs format * Add cfg.datefmt in global config to define the format output of 'pt'
This commit is contained in:
parent
49dceaaffd
commit
022e6c96f0
@ -1418,7 +1418,7 @@ static int cmd_print(void *data, const char *input) {
|
||||
l = len;
|
||||
}
|
||||
} else l = len;
|
||||
|
||||
|
||||
switch (input[0]) {
|
||||
case 'D':
|
||||
case 'd':
|
||||
@ -1453,10 +1453,10 @@ static int cmd_print(void *data, const char *input) {
|
||||
r_print_raw (core->print, core->block, len);
|
||||
break;
|
||||
case 'o':
|
||||
r_print_hexdump (core->print, core->offset, core->block, len, 8, 1); //, 78, !(input[1]=='-'));
|
||||
r_print_hexdump (core->print, core->offset, core->block, len, 8, 1); //, 78, !(input[1]=='-'));
|
||||
break;
|
||||
case 'x':
|
||||
r_print_hexdump (core->print, core->offset, core->block, len, 16, 1); //, 78, !(input[1]=='-'));
|
||||
r_print_hexdump (core->print, core->offset, core->block, len, 16, 1); //, 78, !(input[1]=='-'));
|
||||
break;
|
||||
case '8':
|
||||
r_print_bytes (core->print, core->block, len, "%02x");
|
||||
@ -1480,6 +1480,31 @@ static int cmd_print(void *data, const char *input) {
|
||||
}
|
||||
printf ("\n");
|
||||
break;
|
||||
case 't':
|
||||
switch (input[1]) {
|
||||
case ' ':
|
||||
case '\0':
|
||||
for (l=0; l<len; l+=sizeof(time_t))
|
||||
r_print_date_unix (core->print, core->block+l, sizeof(time_t));
|
||||
break;
|
||||
case 'd':
|
||||
for (l=0; l<len; l+=4)
|
||||
r_print_date_dos (core->print, core->block+l, 4);
|
||||
break;
|
||||
case 'n':
|
||||
for (l=0; l<len; l+=sizeof(ut64))
|
||||
r_print_date_w32 (core->print, core->block+l, sizeof(ut64));
|
||||
break;
|
||||
case '?':
|
||||
r_cons_printf (
|
||||
"Usage: pt[dn?]\n"
|
||||
" pt print unix time\n"
|
||||
" ptd print dos time\n"
|
||||
" ptn print ntfs time\n"
|
||||
" pt? show help message\n");
|
||||
break;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
r_cons_printf (
|
||||
"Usage: p[fmt] [len]\n"
|
||||
@ -1490,6 +1515,7 @@ static int cmd_print(void *data, const char *input) {
|
||||
" ps [len] print string\n"
|
||||
" pm [fmt] print formatted memory\n" // TODO: rename to pf??
|
||||
" pS [len] print wide string\n"
|
||||
" pt [len] print diferent timestamps\n"
|
||||
" pd [len] disassemble N opcodes\n"
|
||||
" pD [len] disassemble N bytes\n"
|
||||
" pr [len] print N raw bytes\n"
|
||||
|
@ -56,6 +56,13 @@ static int config_cfgdebug_callback(void *user, void *data) {
|
||||
return R_TRUE;
|
||||
}
|
||||
|
||||
static int config_cfgdatefmt_callback(void *user, void *data) {
|
||||
RCore *core = (RCore*) user;
|
||||
RConfigNode *node = (RConfigNode*) data;
|
||||
strncpy (core->print->datefmt, node->value, 32);
|
||||
return R_TRUE;
|
||||
}
|
||||
|
||||
static int config_asmos_callback(void *user, void *data) {
|
||||
RCore *core = (RCore*) user;
|
||||
RConfigNode *node = (RConfigNode*) data;
|
||||
@ -294,6 +301,7 @@ R_API int r_core_config_init(RCore *core) {
|
||||
r_config_set_cb (cfg, "cfg.bigendian", "true", &config_bigendian_callback);
|
||||
#endif
|
||||
r_config_set_cb (cfg, "cfg.debug", "false", &config_cfgdebug_callback);
|
||||
r_config_set_cb (cfg, "cfg.datefmt", "%d:%m:%Y %H:%M:%S %z", &config_cfgdatefmt_callback);
|
||||
r_config_set (cfg, "cfg.fortunes", "true");
|
||||
r_config_set (cfg, "dbg.backend", "native");
|
||||
r_config_set_cb (cfg, "dbg.stopthreads", "true", &config_stopthreads_callback);
|
||||
|
@ -46,6 +46,9 @@ R_API void r_print_code(RPrint *p, ut64 addr, ut8 *buf, int len);
|
||||
R_API void r_print_format(RPrint *p, ut64 seek, const ut8* buf, int len, const char *fmt);
|
||||
// XXX . change wide, zeroend, urlencode for option flags
|
||||
R_API int r_print_string(RPrint *p, ut64 seek, const ut8 *str, int len, int wide, int zeroend, int urlencode);
|
||||
R_API int r_print_date_dos(struct r_print_t *p, ut8 *buf, int len);
|
||||
R_API int r_print_date_w32(struct r_print_t *p, const ut8 *buf, int len);
|
||||
R_API int r_print_date_unix(struct r_print_t *p, const ut8 *buf, int len);
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
@ -23,7 +23,7 @@ R_API int r_print_date_dos(struct r_print_t *p, ut8 *buf, int len) {
|
||||
ut32 seconds = (t&0x001f)<<1;
|
||||
|
||||
/* la data de modificacio del fitxer, no de creacio del zip */
|
||||
p->printf("%d-%02d-%02d %d:%d:%d",
|
||||
p->printf("%d-%02d-%02d %d:%d:%d\n",
|
||||
year, month, day, hour, minutes, seconds);
|
||||
return 4;
|
||||
}
|
||||
@ -32,17 +32,20 @@ R_API int r_print_date_unix(struct r_print_t *p, const ut8 *buf, int len) {
|
||||
int ret = 0;
|
||||
time_t t;
|
||||
char datestr[256];
|
||||
const struct tm* time;
|
||||
|
||||
if (p != NULL && len >= sizeof(t)) {
|
||||
r_mem_copyendian ((ut8*)&t, buf, sizeof(time_t), p->bigendian);
|
||||
// "%d:%m:%Y %H:%M:%S %z",
|
||||
if (p->datefmt && p->datefmt[0]) {
|
||||
ret = strftime(datestr, 256, p->datefmt,
|
||||
(const struct tm*)gmtime((const time_t*)&t));
|
||||
if (ret) {
|
||||
p->printf("%s", datestr);
|
||||
ret = sizeof(time_t);
|
||||
}
|
||||
time = (const struct tm*)gmtime((const time_t*)&t);
|
||||
if (time) {
|
||||
ret = strftime (datestr, 256, p->datefmt, time);
|
||||
if (ret) {
|
||||
p->printf("%s\n", datestr);
|
||||
ret = sizeof(time_t);
|
||||
}
|
||||
} else r_cons_printf("Invalid time\n");
|
||||
}
|
||||
}
|
||||
return ret;
|
||||
|
@ -7,7 +7,7 @@
|
||||
R_API RPrint *r_print_new() {
|
||||
RPrint *p = R_NEW (RPrint);
|
||||
if (p) {
|
||||
strcpy (p->datefmt, "%Y:%m:%d %H:%M:%S %z");
|
||||
strcpy (p->datefmt, "%d:%m:%Y %H:%M:%S %z");
|
||||
p->user = NULL;
|
||||
p->read_at = NULL;
|
||||
p->printf = printf;
|
||||
|
Loading…
Reference in New Issue
Block a user