mirror of
https://github.com/radareorg/radare2.git
synced 2024-12-14 16:59:08 +00:00
195 lines
4.8 KiB
C
195 lines
4.8 KiB
C
/* radare - LGPL - Copyright 2009-2016 - pancake */
|
|
|
|
#include "r_config.h"
|
|
#include "r_core.h"
|
|
#include "r_print.h"
|
|
|
|
static int cmd_project(void *data, const char *input) {
|
|
RCore *core = (RCore *)data;
|
|
const char *file, *arg = (input && *input)? input+1: NULL;
|
|
const char *fileproject = r_config_get (core->config, "file.project");
|
|
char *str = NULL;
|
|
|
|
if (!input)
|
|
return false;
|
|
|
|
str = strdup (fileproject);
|
|
if (arg && *arg==' ') arg++;
|
|
file = (input[0] && input[1])? arg: str;
|
|
switch (input[0]) {
|
|
case 'c':
|
|
if (input[1]==' ') {
|
|
r_core_project_cat (core, input+2);
|
|
} else eprintf ("Usage: Pc [prjname]\n");
|
|
break;
|
|
case 'o':
|
|
// if (r_file_is_regular (file))
|
|
if (input[1]) {
|
|
r_core_project_open (core, file);
|
|
} else {
|
|
if (file && *file)
|
|
r_cons_println (file);
|
|
}
|
|
break;
|
|
case 'l':
|
|
r_core_project_list (core, input[1]);
|
|
break;
|
|
case 'd':
|
|
r_core_project_delete (core, file);
|
|
break;
|
|
case 's':
|
|
if (r_core_project_save (core, file)) {
|
|
r_config_set (core->config, "file.project", file);
|
|
r_cons_println (file);
|
|
}
|
|
break;
|
|
case 'S':
|
|
if (input[1] == ' ') {
|
|
r_core_project_save_rdb (core, input+2, R_CORE_PRJ_ALL);
|
|
} else eprintf ("Usage: PS [file]\n");
|
|
break;
|
|
case 'n':
|
|
if (!fileproject || !*fileproject) {
|
|
eprintf ("No project\n");
|
|
} else
|
|
switch (input[1]) {
|
|
case '-':
|
|
/* remove lines containing specific words */
|
|
{
|
|
FILE *fd = r_sandbox_fopen (str, "w");
|
|
if (!fd) {
|
|
eprintf ("Cannot open %s\n", str);
|
|
} else {
|
|
char *str = r_core_project_notes_file (core, fileproject);
|
|
char *data = r_file_slurp (str, NULL);
|
|
int del = 0;
|
|
if (data) {
|
|
char *ptr, *nl;
|
|
for (ptr = data; ptr; ptr = nl) {
|
|
nl = strchr (ptr, '\n');
|
|
if (nl) {
|
|
*nl++ = 0;
|
|
if (strstr (ptr, input+2))
|
|
del++;
|
|
else
|
|
fprintf (fd, "%s\n", ptr);
|
|
}
|
|
}
|
|
free (data);
|
|
}
|
|
if (del>0) {
|
|
eprintf ("Deleted %d lines\n", del);
|
|
}
|
|
free (str);
|
|
fclose (fd);
|
|
}
|
|
}
|
|
break;
|
|
case ' ':
|
|
if (input[2]=='-') {
|
|
char *str = r_core_project_notes_file (core, fileproject);
|
|
// edit with cfg.editor
|
|
const char *editor = r_config_get (core->config, "cfg.editor");
|
|
if (str && *str && editor && *editor)
|
|
r_sys_cmdf ("%s %s", editor, str);
|
|
else eprintf ("No cfg.editor configured\n");
|
|
free (str);
|
|
} else {
|
|
//char *str = r_core_project_notes_file (core, fileproject);
|
|
// append line to project notes
|
|
char *str = r_core_project_notes_file (core, fileproject);
|
|
char *data = r_file_slurp (str, NULL);
|
|
FILE *fd = r_sandbox_fopen (str, "a");
|
|
if (fd) {
|
|
fprintf (fd, "%s\n", input+2);
|
|
fclose (fd);
|
|
}
|
|
free (str);
|
|
free (data);
|
|
}
|
|
break;
|
|
case 'j':
|
|
if (!input[2]) {
|
|
int len = 0;
|
|
/* get base64 string */
|
|
char *str = r_core_project_notes_file (core, fileproject);
|
|
if (str) {
|
|
char *data = r_file_slurp (str, &len);
|
|
char *res = r_base64_encode_dyn (data, len);
|
|
if (res) {
|
|
r_cons_println (res);
|
|
free (res);
|
|
}
|
|
free (data);
|
|
free (str);
|
|
}
|
|
} else if (input[2] == ' ') {
|
|
/* set base64 string */
|
|
ut8 *data = r_base64_decode_dyn (input+3, -1);
|
|
if (data) {
|
|
char *str = r_core_project_notes_file (core, fileproject);
|
|
if (str) {
|
|
r_file_dump (str, data, strlen ((const char*)data), 0);
|
|
free (str);
|
|
}
|
|
free (data);
|
|
}
|
|
} else {
|
|
eprintf ("Usage: `Pnj` or `Pnj ...`\n");
|
|
}
|
|
break;
|
|
case 0:
|
|
{
|
|
char *str = r_core_project_notes_file (core, fileproject);
|
|
char *data = r_file_slurp (str, NULL);
|
|
if (data) {
|
|
r_cons_println (data);
|
|
free (data);
|
|
}
|
|
free (str);
|
|
}
|
|
break;
|
|
case '?':
|
|
{
|
|
const char* help_msg[] = {
|
|
"Usage:", "Pn[j-?] [...]", "Project Notes",
|
|
"Pn", "", "show project notes",
|
|
"Pn", " -", "edit notes with cfg.editor",
|
|
"Pn-", "", "delete notes",
|
|
"Pn-", "str", "delete lines matching /str/ in notes",
|
|
"Pnj", "", "show notes in base64",
|
|
"Pnj", " [base64]", "set notes in base64",
|
|
NULL};
|
|
r_core_cmd_help (core, help_msg);
|
|
}
|
|
break;
|
|
}
|
|
break;
|
|
case 'i':
|
|
// if (r_file_is_regular (file))
|
|
free (r_core_project_info (core, file));
|
|
break;
|
|
default: {
|
|
const char* help_msg[] = {
|
|
"Usage:", "P[?osi] [file]", "Project management",
|
|
"Pc", " [file]", "show project script to console",
|
|
"Pd", " [file]", "delete project",
|
|
"Pi", " [file]", "show project information",
|
|
"Pl", "", "list all projects",
|
|
"Pn", "[j]", "show project notes (Pnj for json)",
|
|
"Pn", " [base64]", "set notes text",
|
|
"Pn", " -", "edit notes with cfg.editor",
|
|
"Po", " [file]", "open project",
|
|
"Ps", " [file]", "save project",
|
|
"PS", " [file]", "save script file",
|
|
"NOTE:", "", "See 'e file.project'",
|
|
"NOTE:", "", "project files are stored in ~/.config/radare2/projects",
|
|
NULL};
|
|
r_core_cmd_help (core, help_msg);
|
|
}
|
|
break;
|
|
}
|
|
free (str);
|
|
return true;
|
|
}
|