From 022e6c96f0e8ca172597df709933e4537c49eab3 Mon Sep 17 00:00:00 2001 From: pancake Date: Thu, 23 Sep 2010 12:59:54 +0200 Subject: [PATCH] * 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' --- libr/core/cmd.c | 32 +++++++++++++++++++++++++++++--- libr/core/config.c | 8 ++++++++ libr/include/r_print.h | 3 +++ libr/print/date.c | 17 ++++++++++------- libr/print/print.c | 2 +- 5 files changed, 51 insertions(+), 11 deletions(-) diff --git a/libr/core/cmd.c b/libr/core/cmd.c index 8f2ba81357..5b21f4de5e 100644 --- a/libr/core/cmd.c +++ b/libr/core/cmd.c @@ -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; lprint, core->block+l, sizeof(time_t)); + break; + case 'd': + for (l=0; lprint, core->block+l, 4); + break; + case 'n': + for (l=0; lprint, 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" diff --git a/libr/core/config.c b/libr/core/config.c index d137e00043..30ac8de54c 100644 --- a/libr/core/config.c +++ b/libr/core/config.c @@ -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); diff --git a/libr/include/r_print.h b/libr/include/r_print.h index 34d9ff0946..7cfa09747d 100644 --- a/libr/include/r_print.h +++ b/libr/include/r_print.h @@ -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 diff --git a/libr/print/date.c b/libr/print/date.c index dbc5536da9..1f6a911e12 100644 --- a/libr/print/date.c +++ b/libr/print/date.c @@ -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; diff --git a/libr/print/print.c b/libr/print/print.c index 6ea5e7f7b8..dffe1bfa38 100644 --- a/libr/print/print.c +++ b/libr/print/print.c @@ -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;