/** * Execute side-effects command at some transformation point * @param str */ static int revm_case_execmd(char *str) { revmargv_t *curcmd; char actual[26]; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); world.curjob->curscope++; snprintf(actual, sizeof(actual), "job%u_rec%u_labels", world.curjob->id, world.curjob->curscope); hash_init(&world.curjob->recur[world.curjob->curscope].labels, strdup(actual), 11, ASPECT_TYPE_STR); snprintf(actual, sizeof(actual), "job%u_rec%u_exprs", world.curjob->id, world.curjob->curscope); hash_init(&world.curjob->recur[world.curjob->curscope].exprs, strdup(actual), 1, ASPECT_TYPE_EXPR); curcmd = world.curjob->curcmd; if (revm_exec_str(str) < 0) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Side-effects preparation failed", -1); world.curjob->curcmd = world.curjob->recur[world.curjob->curscope].script; if (revm_execmd() < 0) PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, "Side-effects execution failed", -1); world.curjob->curcmd = curcmd; world.curjob->recur[world.curjob->curscope].script = NULL; hash_destroy(&world.curjob->recur[world.curjob->curscope].labels); hash_destroy(&world.curjob->recur[world.curjob->curscope].exprs); world.curjob->curscope--; PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); }
/** * Default case of a match when nothing else has matched */ int cmd_default() { char *str; revmargv_t *cur; char actual[ERESI_MEANING]; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); cur = world.curjob->curcmd; /* Dont execute if we matched something */ if (world.curjob->recur[world.curjob->curscope].rwrt.matched) PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); /* Create new context */ world.curjob->curscope++; snprintf(actual, sizeof(actual), "job%u_rec%u_labels", world.curjob->id, world.curjob->curscope); hash_init(&world.curjob->recur[world.curjob->curscope].labels, strdup(actual), 3, ASPECT_TYPE_UNKNOW); snprintf(actual, sizeof(actual), "job%u_rec%u_exprs", world.curjob->id, world.curjob->curscope); hash_init(&world.curjob->recur[world.curjob->curscope].exprs, strdup(actual), 7, ASPECT_TYPE_UNKNOW); /* Execute parameter commands */ str = revm_string_get(world.curjob->curcmd->param); cur = world.curjob->curcmd; if (revm_exec_str(str) < 0) { puts("FAILED EXEC_STR"); //PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, // "Display execrequest failed", -1); } world.curjob->curcmd = world.curjob->recur[world.curjob->curscope].script; if (revm_execmd() < 0) { puts("FAILED EXEC_CMD"); //PROFILER_ERR(__FILE__, __FUNCTION__, __LINE__, // "Default command execution failed", -1); } /* Restore previous context */ world.curjob->curcmd = cur; world.curjob->recur[world.curjob->curscope].script = NULL; hash_destroy(&world.curjob->recur[world.curjob->curscope].labels); hash_destroy(&world.curjob->recur[world.curjob->curscope].exprs); world.curjob->curscope--; /* Jump to end of rewrite construct */ revm_move_pc(world.curjob->curcmd->endlabel); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); }
/** * The infinite main loop of the interactive command */ int revm_loop(int argc, char **argv) { int ret; PROFILER_IN(__FILE__, __FUNCTION__, __LINE__); ret = 0; do { /* Come back to the loop if a script turns into interactive mode */ reenter: /* Fill argv from stdin if we are in interactive mode */ if ((world.state.revm_mode != REVM_STATE_CMDLINE && world.state.revm_mode != REVM_STATE_TRACER) || world.state.revm_net == 1) { if (world.state.revm_mode != REVM_STATE_SCRIPT) { if (revm_select() < 0) { fprintf(stderr,"revm_select : failed \n"); revm_exit(-1); } /* If the FIFO does not exist anymore, the server has quit, so we quit too */ if (world.state.revm_mode == REVM_STATE_EMBEDDED && (access(REVM_FIFO_S2C, F_OK) < 0 || access(REVM_FIFO_C2S, F_OK) < 0)) PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, 0); } /* Take a line, execute old command if void line */ argv = revm_input(&argc, NULL); if (world.state.revm_mode == REVM_STATE_INTERACTIVE || world.state.revm_mode == REVM_STATE_EMBEDDED || world.state.revm_mode == REVM_STATE_SCRIPT || world.state.revm_net) { if (argv == ((char **) REVM_INPUT_VOID)) continue; else if (argv == ((char **) REVM_INPUT_TRANSFERED)) continue; } /* CTRL-D -> !argv */ if (!argv) { revm_output("\n"); /* when debugging -> back to main program */ if (world.state.revm_mode == REVM_STATE_EMBEDDED) { revm_callback_handler_remove(); revm_cleanup(); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, ret); } /* if net is enable but we are not in e2dbg -> ignore */ if (world.state.revm_net) continue; /* othewise exit */ break; } } /* Fetch the current scripting command */ if (revm_parseopt(argc, argv) < 0) { if (world.state.revm_mode != REVM_STATE_CMDLINE && world.state.revm_mode != REVM_STATE_TRACER) { XFREE(__FILE__, __FUNCTION__, __LINE__, argv); if (world.state.revm_mode != REVM_STATE_INTERACTIVE && world.state.revm_mode != REVM_STATE_EMBEDDED) goto end; } else if (!world.state.revm_net) revm_exit(-1); } /* Just execute one command if we are not in script mode */ if (world.state.revm_mode != REVM_STATE_SCRIPT) { world.curjob->curcmd = world.curjob->recur[0].script; switch (revm_execmd()) { case REVM_SCRIPT_CONTINUE: //printf(" [*] e2dbg continue from revm_execmd \n"); revm_callback_handler_remove(); revm_cleanup(); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, ret); case REVM_SCRIPT_ERROR: profiler_error(); default: break; } } /* Quit parsing if necessary */ if ((!world.curjob->curcmd && world.state.revm_mode == REVM_STATE_SCRIPT)) break; } while ((world.state.revm_mode != REVM_STATE_CMDLINE && world.state.revm_mode != REVM_STATE_TRACER) || world.state.revm_net); /* If we are in scripting, execute commands list now */ if (world.state.revm_mode == REVM_STATE_SCRIPT) { fprintf(stderr, "we are in script mode from revm_loop ! \n"); world.curjob->curcmd = world.curjob->recur[0].script; ret = revm_execscript(); if (ret == REVM_SCRIPT_STOP) { XCLOSE(world.curjob->ws.io.input_fd, -1); world.curjob->ws.io.input_fd = 0; goto reenter; } else if (ret < 0) profiler_error(); } end: revm_postexec(ret); revm_callback_handler_remove(); revm_cleanup(); PROFILER_ROUT(__FILE__, __FUNCTION__, __LINE__, (ret)); }