mirror of
https://github.com/radareorg/radare2.git
synced 2024-12-25 14:47:57 +00:00
87724384d1
Besides an UAF has been fixed afecting only ELF
156 lines
3.5 KiB
C
156 lines
3.5 KiB
C
/* radare - LGPL - Copyright 2014-2016 - pancake */
|
|
|
|
#include <r_core.h>
|
|
|
|
R_API void r_core_task_list (RCore *core, int mode) {
|
|
RListIter *iter;
|
|
RCoreTask *task;
|
|
if (mode == 'j') {
|
|
r_cons_printf ("[");
|
|
}
|
|
r_list_foreach (core->tasks, iter, task) {
|
|
switch (mode) {
|
|
case 'j':
|
|
r_cons_printf ("{\"id\":%d,\"status\":\"%c\",\"text\":\"%s\"}%s",
|
|
task->id, task->state, task->msg->text, iter->n?",":"");
|
|
break;
|
|
default:
|
|
r_cons_printf ("Task %d Status %c Command %s\n",
|
|
task->id, task->state, task->msg->text);
|
|
if (mode == 1) {
|
|
if (task->msg->res) {
|
|
r_cons_println (task->msg->res);
|
|
} else {
|
|
r_cons_newline ();
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
if (mode == 'j') {
|
|
r_cons_printf ("]\n");
|
|
}
|
|
}
|
|
|
|
R_API void r_core_task_join (RCore *core, RCoreTask *task) {
|
|
RListIter *iter;
|
|
if( task) {
|
|
r_cons_break_push (NULL, NULL);
|
|
r_th_wait (task->msg->th);
|
|
r_cons_break_pop ();
|
|
} else {
|
|
r_list_foreach_prev (core->tasks, iter, task) {
|
|
r_th_wait (task->msg->th);
|
|
}
|
|
}
|
|
}
|
|
|
|
static int r_core_task_thread(RCore *core, RCoreTask *task) {
|
|
// TODO
|
|
return 0;
|
|
}
|
|
|
|
R_API RCoreTask *r_core_task_new (RCore *core, const char *cmd, RCoreTaskCallback cb, void *user) {
|
|
RCoreTask *task = R_NEW0 (RCoreTask);
|
|
if (task) {
|
|
task->msg = r_th_msg_new (cmd, r_core_task_thread);
|
|
task->id = r_list_length (core->tasks)+1;
|
|
task->state = 's'; // stopped
|
|
task->core = core;
|
|
task->user = user;
|
|
task->cb = cb;
|
|
}
|
|
return task;
|
|
}
|
|
|
|
R_API void r_core_task_run(RCore *core, RCoreTask *_task) {
|
|
RCoreTask *task;
|
|
RListIter *iter;
|
|
char *str;
|
|
r_list_foreach_prev (core->tasks, iter, task) {
|
|
if (_task && task != _task) {
|
|
continue;
|
|
}
|
|
if (task->state != 's') {
|
|
continue;
|
|
}
|
|
task->state = 'r'; // running
|
|
str = r_core_cmd_str (core, task->msg->text);
|
|
eprintf ("Task %d finished width %d bytes: %s\n%s\n",
|
|
task->id, (int)strlen (str), task->msg->text, str);
|
|
task->state = 'd'; // done
|
|
task->msg->done = 1; // done DUP!!
|
|
task->msg->res = str;
|
|
if (task->cb) {
|
|
task->cb (task->user, str);
|
|
}
|
|
}
|
|
}
|
|
|
|
R_API void r_core_task_run_bg(RCore *core, RCoreTask *_task) {
|
|
RCoreTask *task;
|
|
RListIter *iter;
|
|
char *str;
|
|
r_list_foreach_prev (core->tasks, iter, task) {
|
|
if (_task && task != _task) {
|
|
continue;
|
|
}
|
|
task->state = 'r'; // running
|
|
str = r_core_cmd_str (core, task->msg->text);
|
|
eprintf ("Task %d finished width %d bytes: %s\n%s\n",
|
|
task->id, (int)strlen (str), task->msg->text, str);
|
|
task->state = 'd'; // done
|
|
task->msg->done = 1; // done DUP!!
|
|
task->msg->res = str;
|
|
}
|
|
}
|
|
|
|
R_API RCoreTask *r_core_task_add (RCore *core, RCoreTask *task) {
|
|
//r_th_pipe_push (core->pipe, task->cb, task);
|
|
if (core->tasks) {
|
|
r_list_append (core->tasks, task);
|
|
return task;
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
R_API void r_core_task_add_bg (RCore *core, RCoreTask *task) {
|
|
//r_th_pipe_push (core->pipe, task->cb, task);
|
|
r_list_append (core->tasks, task);
|
|
}
|
|
|
|
R_API int r_core_task_cat (RCore *core, int id) {
|
|
RCoreTask *task = r_core_task_get (core, id);
|
|
r_cons_println (task->msg->res);
|
|
r_core_task_del (core, id);
|
|
return true;
|
|
}
|
|
|
|
R_API int r_core_task_del (RCore *core, int id) {
|
|
RCoreTask *task;
|
|
RListIter *iter;
|
|
if (id == -1) {
|
|
r_list_free (core->tasks);
|
|
core->tasks = r_list_new ();
|
|
return true;
|
|
}
|
|
r_list_foreach (core->tasks, iter, task) {
|
|
if (task->id == id) {
|
|
r_list_delete (core->tasks, iter);
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
R_API RCoreTask *r_core_task_get (RCore *core, int id) {
|
|
RCoreTask *task;
|
|
RListIter *iter;
|
|
r_list_foreach (core->tasks, iter, task) {
|
|
if (task->id == id) {
|
|
return task;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|