* 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:
pancake 2010-09-23 12:59:54 +02:00
parent 49dceaaffd
commit 022e6c96f0
5 changed files with 51 additions and 11 deletions

View File

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

View File

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

View File

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

View File

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

View File

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