From e4982afabaf046edec46db1b9a3e505f6466ec7f Mon Sep 17 00:00:00 2001 From: astralia Date: Wed, 12 Jun 2024 02:30:23 +0200 Subject: [PATCH 1/3] Consistent json output with no file #shell --- libr/core/cmd_info.inc.c | 24 +++++++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/libr/core/cmd_info.inc.c b/libr/core/cmd_info.inc.c index 041cbe3e07118..5a2128c2ff503 100644 --- a/libr/core/cmd_info.inc.c +++ b/libr/core/cmd_info.inc.c @@ -1136,6 +1136,12 @@ static void cmd_ic(RCore *core, const char *input, PJ *pj, bool is_array, bool v } static void cmd_iz(RCore *core, PJ *pj, int mode, int is_array, bool va, const char *input) { + RBinInfo *info = r_bin_get_info (core->bin); + if (!info && pj) { + r_cons_print ("{}"); + r_core_return_value (core, 1); + return; + } bool rdump = false; if (input[1] == '-') { // "iz-" char *strpurge = core->bin->strpurge; @@ -1235,6 +1241,12 @@ static void cmd_iz(RCore *core, PJ *pj, int mode, int is_array, bool va, const c static void cmd_iS(RCore *core, const char *input, PJ **_pj, int mode, const bool va, const bool is_array) { PJ *pj = *_pj; + RBinInfo *info = r_bin_get_info (core->bin); + if (!info && pj) { + r_cons_print ("{}"); + r_core_return_value (core, 1); + return; + } if (!input[1]) { RBININFO ("sections", R_CORE_BIN_ACC_SECTIONS, NULL, 0); } else if (input[1] == ',' || input[1] == ' ') { @@ -1314,7 +1326,11 @@ static void cmd_it(RCore *core, PJ *pj) { ut64 limit = r_config_get_i (core->config, "bin.hashlimit"); RBinInfo *info = r_bin_get_info (core->bin); if (!info) { - R_LOG_ERROR ("Cannot get bin info"); + if (!is_json) { + R_LOG_ERROR ("Cannot get bin info"); + } else { + r_cons_print ("{}"); + } r_core_return_value (core, 1); return; } @@ -1851,7 +1867,7 @@ static int cmd_info(void *data, const char *input) { r_cons_println ("}"); } } else { - r_cons_println ("{}"); + r_cons_printf ("{}"); } break; case 'A': // "iA" @@ -1937,7 +1953,9 @@ static int cmd_info(void *data, const char *input) { } else if (!bin_header (core, mode)) { /// XXX header vs fields wtf if (!r_core_bin_info (core, R_CORE_BIN_ACC_HEADER, pj, mode, va, NULL, NULL)) { - R_LOG_ERROR ("No header fields found"); + if (!pj) { + R_LOG_ERROR ("No header fields found"); + } r_core_return_value (core, 1); } } From d962a4d8c8058192c2c70bff159a1310e59f2d02 Mon Sep 17 00:00:00 2001 From: astralia Date: Thu, 13 Jun 2024 01:30:20 +0200 Subject: [PATCH 2/3] Reorder help commands --- libr/core/cmd_info.inc.c | 38 ++++++++++++++++++++++++++++++-------- test/db/json/cmd_i | 22 +++++++++++----------- test/db/json/json2 | 6 +++--- 3 files changed, 44 insertions(+), 22 deletions(-) diff --git a/libr/core/cmd_info.inc.c b/libr/core/cmd_info.inc.c index 5a2128c2ff503..19bafc405e2e8 100644 --- a/libr/core/cmd_info.inc.c +++ b/libr/core/cmd_info.inc.c @@ -80,8 +80,8 @@ static RCoreHelpMessage help_msg_iS = { static RCoreHelpMessage help_msg_i = { "Usage: i", "", "Get info from opened file (see rabin2's manpage)", "i", "[*jq]", "show info of current file (in JSON)", - "iA", "", "list archs found in current binary", "ia", "", "show all info (imports, exports, sections..)", + "iA", "", "list archs found in current binary", "ib", "", "reload the current buffer for setting of the bin (use once only)", "ic", "[?]", "List classes, methods and fields (icj for json)", "iC", "[j]", "show signature info (entitlements, ...)", @@ -1138,7 +1138,7 @@ static void cmd_ic(RCore *core, const char *input, PJ *pj, bool is_array, bool v static void cmd_iz(RCore *core, PJ *pj, int mode, int is_array, bool va, const char *input) { RBinInfo *info = r_bin_get_info (core->bin); if (!info && pj) { - r_cons_print ("{}"); + r_cons_print ("[]"); r_core_return_value (core, 1); return; } @@ -1243,7 +1243,7 @@ static void cmd_iS(RCore *core, const char *input, PJ **_pj, int mode, const boo PJ *pj = *_pj; RBinInfo *info = r_bin_get_info (core->bin); if (!info && pj) { - r_cons_print ("{}"); + r_cons_print ("[]"); r_core_return_value (core, 1); return; } @@ -1326,10 +1326,10 @@ static void cmd_it(RCore *core, PJ *pj) { ut64 limit = r_config_get_i (core->config, "bin.hashlimit"); RBinInfo *info = r_bin_get_info (core->bin); if (!info) { - if (!is_json) { - R_LOG_ERROR ("Cannot get bin info"); - } else { + if (is_json) { r_cons_print ("{}"); + } else { + R_LOG_ERROR ("Cannot get bin info"); } r_core_return_value (core, 1); return; @@ -1743,6 +1743,9 @@ static int cmd_info(void *data, const char *input) { RListIter *iter; RBinFile *bf; RBinFile *cur = core->bin->cur; + if (!cur && pj) { + r_cons_printf ("{}"); + } r_list_foreach (objs, iter, bf) { core->bin->cur = bf; RBININFO ("info", R_CORE_BIN_ACC_INFO, NULL, 0); @@ -1757,6 +1760,9 @@ static int cmd_info(void *data, const char *input) { RListIter *iter; RBinFile *bf; RBinFile *cur = core->bin->cur; + if (!cur && pj) { + r_cons_printf ("{}"); + } r_list_foreach (objs, iter, bf) { core->bin->cur = bf; RBININFO ("main", R_CORE_BIN_ACC_MAIN, NULL, 0); @@ -1771,6 +1777,9 @@ static int cmd_info(void *data, const char *input) { RListIter *iter; RBinFile *bf; RBinFile *cur = core->bin->cur; + if (!cur && pj) { + r_cons_printf ("[]"); + } r_list_foreach (objs, iter, bf) { core->bin->cur = bf; RBININFO ("memory", R_CORE_BIN_ACC_MEM, input + 1, 0); @@ -1800,6 +1809,9 @@ static int cmd_info(void *data, const char *input) { RListIter *iter; RBinFile *bf; RBinFile *cur = core->bin->cur; + if (!cur && pj) { + r_cons_printf ("[]"); + } r_list_foreach (bfiles, iter, bf) { core->bin->cur = bf; RBININFO ("versioninfo", R_CORE_BIN_ACC_VERSIONINFO, NULL, 0); @@ -1864,7 +1876,7 @@ static int cmd_info(void *data, const char *input) { subcmds++; } if (mode == R_MODE_JSON) { - r_cons_println ("}"); + r_cons_printf ("}"); } } else { r_cons_printf ("{}"); @@ -2022,6 +2034,10 @@ static int cmd_info(void *data, const char *input) { RListIter *iter; RBinFile *bf; RBinFile *cur = core->bin->cur; + if (!cur && pj) { + r_cons_printf ("{}"); + break; + } RList *bfiles = r_core_bin_files (core); r_list_foreach (bfiles, iter, bf) { core->bin->cur = bf; @@ -2039,6 +2055,9 @@ static int cmd_info(void *data, const char *input) { RListIter *iter; RBinFile *bf; RBinFile *cur = core->bin->cur; + if (!cur && pj) { + r_cons_printf ("[]"); + } r_list_foreach (objs, iter, bf) { RBinObject *obj = bf->bo; core->bin->cur = bf; @@ -2049,12 +2068,15 @@ static int cmd_info(void *data, const char *input) { r_list_free (objs); } break; - case 'r': // "ir" + case 'r': // "ir" { RList *objs = r_core_bin_files (core); RListIter *iter; RBinFile *bf; RBinFile *cur = core->bin->cur; + if (!cur && pj) { + r_cons_printf ("[]"); + } r_list_foreach (objs, iter, bf) { core->bin->cur = bf; RBININFO ("relocs", R_CORE_BIN_ACC_RELOCS, NULL, 0); diff --git a/test/db/json/cmd_i b/test/db/json/cmd_i index ab3df3af99b2f..29a73f3a06321 100644 --- a/test/db/json/cmd_i +++ b/test/db/json/cmd_i @@ -1,26 +1,26 @@ -# iSj +iSj icj idj iEj iej ihj -# iIj +iIj iij ij -# ilj +ilj iLj -# iMj -# imj +iMj +imj iRj -# irj -# iSj +irj +iSj is.j @ 0xffffffffffffffff isj iSj entropy iSj sha1 -# iSSj -# itj -# iVj -# izj +iSSj +itj +iVj +izj izzj iZj diff --git a/test/db/json/json2 b/test/db/json/json2 index 981039f0eb913..6f53b887a71bf 100644 --- a/test/db/json/json2 +++ b/test/db/json/json2 @@ -29,8 +29,8 @@ fj fdj fd.j fsj -# iaj -# iAj -# iCj +iaj +iAj +iCj tj ttj From 08f581f043158a1d621f9df698eddf5357805435 Mon Sep 17 00:00:00 2001 From: astralia Date: Thu, 13 Jun 2024 16:05:32 +0200 Subject: [PATCH 3/3] apply suggestions and add more tests --- libr/core/cmd_info.inc.c | 32 +++++++++++++------------------- test/db/json/cmd_i | 26 +++++++++++++++----------- test/db/json/json2 | 3 --- 3 files changed, 28 insertions(+), 33 deletions(-) diff --git a/libr/core/cmd_info.inc.c b/libr/core/cmd_info.inc.c index 19bafc405e2e8..2087b4f9bde61 100644 --- a/libr/core/cmd_info.inc.c +++ b/libr/core/cmd_info.inc.c @@ -504,7 +504,7 @@ static void cmd_info_bin(RCore *core, int va, PJ *pj, int mode) { } } else { if (mode & R_MODE_JSON) { - r_cons_printf ("{}"); + r_cons_print ("{}"); } R_LOG_ERROR ("No file selected"); } @@ -1001,7 +1001,7 @@ static void cmd_ic(RCore *core, const char *input, PJ *pj, bool is_array, bool v } bool first = true; if (r_list_empty (objs) && mode == 'j') { - r_cons_printf ("[]"); + r_cons_print ("[]"); return; } r_list_foreach (objs, objs_iter, bf) { @@ -1136,12 +1136,6 @@ static void cmd_ic(RCore *core, const char *input, PJ *pj, bool is_array, bool v } static void cmd_iz(RCore *core, PJ *pj, int mode, int is_array, bool va, const char *input) { - RBinInfo *info = r_bin_get_info (core->bin); - if (!info && pj) { - r_cons_print ("[]"); - r_core_return_value (core, 1); - return; - } bool rdump = false; if (input[1] == '-') { // "iz-" char *strpurge = core->bin->strpurge; @@ -1731,7 +1725,7 @@ static int cmd_info(void *data, const char *input) { RBININFO ("imports", R_CORE_BIN_ACC_IMPORTS, NULL, amount); } } else if (mode & R_MODE_JSON) { - r_cons_printf ("[]"); + r_cons_print ("[]"); } core->bin->cur = cur; r_list_free (objs); @@ -1744,7 +1738,7 @@ static int cmd_info(void *data, const char *input) { RBinFile *bf; RBinFile *cur = core->bin->cur; if (!cur && pj) { - r_cons_printf ("{}"); + r_cons_print ("{}"); } r_list_foreach (objs, iter, bf) { core->bin->cur = bf; @@ -1761,7 +1755,7 @@ static int cmd_info(void *data, const char *input) { RBinFile *bf; RBinFile *cur = core->bin->cur; if (!cur && pj) { - r_cons_printf ("{}"); + r_cons_print ("{}"); } r_list_foreach (objs, iter, bf) { core->bin->cur = bf; @@ -1778,7 +1772,7 @@ static int cmd_info(void *data, const char *input) { RBinFile *bf; RBinFile *cur = core->bin->cur; if (!cur && pj) { - r_cons_printf ("[]"); + r_cons_print ("[]"); } r_list_foreach (objs, iter, bf) { core->bin->cur = bf; @@ -1810,7 +1804,7 @@ static int cmd_info(void *data, const char *input) { RBinFile *bf; RBinFile *cur = core->bin->cur; if (!cur && pj) { - r_cons_printf ("[]"); + r_cons_print ("[]"); } r_list_foreach (bfiles, iter, bf) { core->bin->cur = bf; @@ -1876,10 +1870,10 @@ static int cmd_info(void *data, const char *input) { subcmds++; } if (mode == R_MODE_JSON) { - r_cons_printf ("}"); + r_cons_print ("}"); } } else { - r_cons_printf ("{}"); + r_cons_print ("{}"); } break; case 'A': // "iA" @@ -1922,7 +1916,7 @@ static int cmd_info(void *data, const char *input) { } if (r_list_empty (objs)) { if (mode & R_MODE_JSON) { - r_cons_printf ("[]"); + r_cons_print ("[]"); } } else { r_list_foreach (objs, iter, bf) { @@ -2035,7 +2029,7 @@ static int cmd_info(void *data, const char *input) { RBinFile *bf; RBinFile *cur = core->bin->cur; if (!cur && pj) { - r_cons_printf ("{}"); + r_cons_print ("{}"); break; } RList *bfiles = r_core_bin_files (core); @@ -2056,7 +2050,7 @@ static int cmd_info(void *data, const char *input) { RBinFile *bf; RBinFile *cur = core->bin->cur; if (!cur && pj) { - r_cons_printf ("[]"); + r_cons_print ("[]"); } r_list_foreach (objs, iter, bf) { RBinObject *obj = bf->bo; @@ -2075,7 +2069,7 @@ static int cmd_info(void *data, const char *input) { RBinFile *bf; RBinFile *cur = core->bin->cur; if (!cur && pj) { - r_cons_printf ("[]"); + r_cons_print ("[]"); } r_list_foreach (objs, iter, bf) { core->bin->cur = bf; diff --git a/test/db/json/cmd_i b/test/db/json/cmd_i index 29a73f3a06321..3a09821d2be07 100644 --- a/test/db/json/cmd_i +++ b/test/db/json/cmd_i @@ -1,26 +1,30 @@ -iSj +iaj +iAj icj +iCj idj -iEj iej -ihj -iIj +iEj +# ihj iij +iIj ij ilj iLj -iMj +iLj io imj -iRj +iMj irj -iSj -is.j @ 0xffffffffffffffff +# iRj isj +is.j @ 0xffffffffffffffff +iSj iSj entropy iSj sha1 iSSj itj +iTj iVj -izj -izzj -iZj +# izj +# izzj +# iZj diff --git a/test/db/json/json2 b/test/db/json/json2 index 6f53b887a71bf..acc7c3a0bb4d4 100644 --- a/test/db/json/json2 +++ b/test/db/json/json2 @@ -29,8 +29,5 @@ fj fdj fd.j fsj -iaj -iAj -iCj tj ttj