Exemplo n.º 1
0
/** 
 * 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);
}
Exemplo n.º 2
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);
}
Exemplo n.º 3
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));
}