static int textlog_chat(RCore *core) { char prompt[64]; char buf[1024]; int lastmsg = 0; const char *me = r_config_get (core->config, "cfg.user"); char msg[1024]; eprintf ("Type '/help' for commands:\n"); snprintf (prompt, sizeof (prompt) - 1, "[%s]> ", me); r_line_set_prompt (prompt); for (;;) { r_core_log_list (core, lastmsg, 0, 0); lastmsg = core->log->last; if (r_cons_fgets (buf, sizeof (buf) - 1, 0, NULL) < 0) { return 1; } if (!*buf) { continue; } if (!strcmp (buf, "/help")) { eprintf ("/quit quit the chat (same as ^D)\n"); eprintf ("/name <nick> set cfg.user name\n"); eprintf ("/log show full log\n"); eprintf ("/clear clear text log messages\n"); } else if (!strncmp (buf, "/name ", 6)) { snprintf (msg, sizeof (msg) - 1, "* '%s' is now known as '%s'", me, buf + 6); r_core_log_add (core, msg); r_config_set (core->config, "cfg.user", buf + 6); me = r_config_get (core->config, "cfg.user"); snprintf (prompt, sizeof (prompt) - 1, "[%s]> ", me); r_line_set_prompt (prompt); return 0; } else if (!strcmp (buf, "/log")) { r_core_log_list (core, 0, 0, 0); return 0; } else if (!strcmp (buf, "/clear")) { // r_core_log_del (core, 0); r_core_cmd0 (core, "T-"); return 0; } else if (!strcmp (buf, "/quit")) { return 0; } else if (*buf == '/') { eprintf ("Unknown command: %s\n", buf); } else { snprintf (msg, sizeof (msg) - 1, "[%s] %s", me, buf); r_core_log_add (core, msg); } } return 1; }
static int cmd_log(void *data, const char *input) { RCore *core = (RCore *)data; const char *input2 = input + (*input? (*input==' '? 2: 1): 0); char *arg = strchr (input2, ' '); int n = atoi (input2); int n2 = arg? atoi (arg+1): 0; switch (*input) { case 'l': r_cons_printf ("%d\n", core->log->last-1); break; case '-': r_core_log_del (core, n); break; case '?': r_cons_printf ("Usage: l[-][ num|msg]\n" " l new comment 0x80480\n" " ll get last log message id\n" " l- delete all logs\n" " l-123 delete logs before 123\n" " l 123 list log from 123 \n" " l list all log messages\n" " l 10 3 list 3 log messages starting from 10\n" " ls list files in current directory (see pwd, cd)\n" " lj list in json format\n" " l* list in radare commands\n" ); break; case ' ': if (!n) { r_core_log_add (core, input+1); break; } case 's': { char *name; RListIter *iter; RList *files = r_sys_dir ("."); r_list_foreach (files, iter, name) { r_cons_printf ("%s%s\n", name, r_file_is_directory (name)? "/":""); } r_list_free (files); } break; case 'j': case '*': case '\0': r_core_log_list (core, n, n2, *input); break; }
static int cmd_log(void *data, const char *input) { RCore *core = (RCore *)data; const char *arg, *input2; int n, n2; if (!input) return 1; input2 = (input && *input) ? input+1 : ""; arg = strchr (input2, ' '); n = atoi (input2); n2 = arg ? atoi (arg+1) : 0; switch (*input) { case 'e': // shell: less { char *p = strchr (input, ' '); if (p) { char *b = r_file_slurp (p+1, NULL); if (b) { r_cons_less_str (b, NULL); free (b); } else eprintf ("File not found\n"); } else eprintf ("Usage: less [filename]\n"); } break; case 'l': r_cons_printf ("%d\n", core->log->last-1); break; case '-': r_core_log_del (core, n); break; case '?':{ const char* help_msg[] = { "Usage:", "T","[-][ num|msg]", "T", "", "List all Text log messages", "T", " new comment", "0x80480", "T", " 123", "List log from 123", "T", " 10 3", "List 3 log messages starting from 10", "T*", "", "List in radare commands", "T-", "", "Delete all logs", "T-", " 123", "Delete logs before 123", "Tl", "", "Get last log message id", "Tj", "", "List in json format", "Tm", " [idx]", "Display log messages without index", "Ts", "", "List files in current directory (see pwd, cd)", "Tp", "[-plug]", "Tist, load, unload plugins", "TT", "", "Enter into the text log chat console", NULL}; r_core_cmd_help (core, help_msg); } break; case 'T': if (r_config_get_i (core->config, "scr.interactive")) { textlog_chat (core); } else eprintf ("Only available when the screen is interactive\n"); break; case 'p': switch (input[1]) { case 0: r_lib_list (core->lib); break; case '-': r_lib_close (core->lib, input+2); break; case ' ': r_lib_open (core->lib, input+2); break; case '?': { const char* help_msg[] = { "Usage:", "Tp", "[-name][ file]", "Tp", "", "List all plugins loaded by RCore.lib", "Tp-", "duk", "Unload plugin matching in filename", "Tp", " blah."R_LIB_EXT, "Load plugin file", NULL}; r_core_cmd_help(core, help_msg); } break; } break; case ' ': if (n>0) { r_core_log_list (core, n, n2, *input); } else { r_core_log_add (core, input+1); } break; case 'm': if (n>0) { r_core_log_list (core, n, 1, 't'); } else { r_core_log_list (core, n, 0, 't'); } break; case 'j': case '*': case '\0': r_core_log_list (core, n, n2, *input); break; } return 0; }