Пример #1
0
/* add a command to the history
 * ----------------------------------------------------------------------- */
void history_set(char *s) {
  history_resize();

  if(history_array[0])
    shell_free(history_array[0]);

  if(s == NULL || *s)
    history_array[0] = s;
  else if(s < history_buffer.x ||
          s >= history_buffer.x + history_buffer.n)
    shell_free(s);
}
Пример #2
0
/* free associated (fd) ressources and possibly the fd struct itself 
 * ----------------------------------------------------------------------- */
void fd_free(struct fd *fd) {
  /* unset the name, and if it was allocated: free it */
  if(fd->name) {
    if(fd->mode & FD_FREENAME)
      shell_free((char *)fd->name);
    
    fd->name = NULL;
  }
  
  /* if the (fd) struct itself was allocated we have to free it */
  if(fd->mode & FD_FREE)
    shell_free(fd);
}
Пример #3
0
/* reinitialize an (fd) struct
 * 
 * (except for the links which are initialized on fdtable_link()) 
 * ----------------------------------------------------------------------- */
struct fd *fd_reinit(struct fd *fd, int flags) {
  /* unset the name, and if it was allocated: free it */
  if(fd->name) {
    if(fd->mode & FD_FREENAME)
      shell_free((char *)fd->name);

    fd->name = NULL;
  }
     
  fd_close(fd);
  
  /* re-initialize things */
  fd->mode &= FD_FREE;
  fd->mode |= flags;

  fd->dup = NULL;
  fd->dev = 0;
  fd->e = -1;
  
  fd->r = &fd->rb;
  fd->w = &fd->wb;
  
  buffer_default(&fd->rb, read);
  buffer_default(&fd->wb, write);
  
  return fd;
}
Пример #4
0
int run_done(void)
{
  /* Free triggers */
  trig_undef(NULL, 0);

  /* Close WAIT synchronization output */
  if ( run_wait_output != NULL ) {
    fclose(run_wait_output);
    run_wait_output = NULL;
  }

  /* Free shell engine */
  if ( run_shell != NULL ) {
    shell_free(run_shell);
    run_shell = NULL;
  }

  /* Free BEGIN message buffer */
  nibble_free(run_exec_case_buf);
  run_exec_case_buf = NULL;

  /* Abort runtime log */
  result_done();

  return 0;
}
Пример #5
0
/* free a tree node
 * ----------------------------------------------------------------------- */
void tree_free(union node *node)
{
  union node *next;
        
  do
  {
    next = node->list.next;
        
    switch(node->id)
    {
      case N_SIMPLECMD:
        if(node->ncmd.rdir) tree_free(node->ncmd.rdir);
        if(node->ncmd.args) tree_free(node->ncmd.args);
        if(node->ncmd.vars) tree_free(node->ncmd.vars);
        break;
      case N_PIPELINE:
        if(node->npipe.cmds) tree_free(node->npipe.cmds);
        break;
      case N_AND:
      case N_OR:
      case N_NOT:
        if(node->nandor.cmd0) tree_free(node->nandor.cmd0);
        if(node->nandor.cmd1) tree_free(node->nandor.cmd1);
        break;
      case N_SUBSHELL:
      case N_CMDLIST:
        if(node->ngrp.cmds) tree_free(node->ngrp.cmds);
        break;
      case N_FOR:
        if(node->nfor.cmds) tree_free(node->nfor.cmds);
        if(node->nfor.args) tree_free(node->nfor.args);
        if(node->nfor.varn) shell_free(node->nfor.varn);
        break;
      case N_CASE:
        if(node->ncase.list) tree_free(node->ncase.list);
        if(node->ncase.word) tree_free(node->ncase.word);
        break;
      case N_CASENODE:
        if(node->ncasenode.pats) tree_free(node->ncasenode.pats);
        if(node->ncasenode.cmds) tree_free(node->ncasenode.cmds);
        break;
      case N_IF:
        if(node->nif.cmd0) tree_free(node->nif.cmd0);
        if(node->nif.cmd1) tree_free(node->nif.cmd1);
        if(node->nif.test) tree_free(node->nif.test);
        break;
      case N_WHILE:
      case N_UNTIL:
        if(node->nloop.cmds) tree_free(node->nloop.cmds);
        if(node->nloop.test) tree_free(node->nloop.test);
        break;


      case N_ARG:
        if(node->narg.list) tree_free(node->narg.list);
        if(node->narg.stra.s) shell_free(node->narg.stra.s);
        break;
      case N_REDIR:
        if(node->nredir.list) tree_free(node->nredir.list);
        break;
      case N_ASSIGN:
        if(node->nassign.list) tree_free(node->nassign.list);
        if(node->nassign.stra.s) shell_free(&node->nassign.stra.s);
        break;

      case N_ARGSTR:
        if(node->nargstr.stra.s) shell_free(node->nargstr.stra.s);
        break;
      case N_ARGPARAM:
        if(node->nargparam.name) shell_free(node->nargparam.name);
        if(node->nargparam.word) tree_free(node->nargparam.word);
        break;
      case N_ARGCMD:
        if(node->nargcmd.list) tree_free(node->nargcmd.list);
        break;
      case N_ARGARITH:
        if(node->nargarith.list) tree_free(node->nargarith.list);
        break;

      case N_FUNCTION:
        if(node->nfunc.name) shell_free(node->nfunc.name);
        if(node->nfunc.cmds) tree_free(node->nfunc.cmds);
        break;
    }
    
    shell_free(node);

  } while((node = next));
}