Пример #1
0
static HANDLE WinCreateProcess(PCHAR command, HANDLE in, HANDLE out, HANDLE err) 
{
	STARTUPINFO si;
	PROCESS_INFORMATION pi;
	BOOL bRes;

	ZeroMemory(&si, sizeof(si));
	si.cb = sizeof(si);
	ZeroMemory(&pi, sizeof(pi));

	RedirectHandle(&si, in, out, err);
	
	if (!strcmp(command, "exit") || !strcmp(command, "quit"))
		exit(EXIT_SUCCESS);

	bRes = CreateProcess(NULL, command, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);
	if (!bRes) {
		int written = 0;
		if (err != INVALID_HANDLE_VALUE) {
			WriteFile(err, command , strlen(command), &written, NULL);
			WriteFile(err, ERR_MSG, strlen(ERR_MSG), &written, NULL);
		}
		else
			fprintf(stderr, "Execution failed for '%s'\n", command);
		return INVALID_HANDLE_VALUE;
	}
	CloseHandle(pi.hThread);
	return pi.hProcess;
}
Пример #2
0
VOID redirrect_command(simple_command_t *s, STARTUPINFO *siStartupInfo, HANDLE *hInFile, HANDLE *hOutFile, HANDLE *hErrFile)
{
  InitStdHandles(siStartupInfo);
  if(s->in){
    *hInFile = FileOpen((LPCSTR)get_word(s->in), "r");
    RedirectHandle(siStartupInfo, *hInFile, STD_INPUT_HANDLE);
  }

  if(s->out && s->err){
    if(strcmp(get_word(s->out), get_word(s->err)) == 0){
      DeleteFile((LPCSTR)get_word(s->out));

      *hOutFile = FileOpen((LPCSTR)get_word(s->out), "a");
      RedirectHandle(siStartupInfo, *hOutFile, STD_OUTPUT_HANDLE);
      RedirectHandle(siStartupInfo, *hOutFile, STD_ERROR_HANDLE);
      return;
    }
  }

  if(s->out){
    if(s->io_flags & IO_OUT_APPEND){
      *hOutFile = FileOpen((LPCSTR)get_word(s->out), "a");
    }
    else{
      *hOutFile = FileOpen((LPCSTR)get_word(s->out), "w");
    }
    RedirectHandle(siStartupInfo, *hOutFile, STD_OUTPUT_HANDLE);
  }

  if(s->err){
    if(s->io_flags & IO_ERR_APPEND){
      *hErrFile = FileOpen((LPCSTR)get_word(s->err), "a");
    }
    else{
      *hErrFile = FileOpen((LPCSTR)get_word(s->err), "w");
    }
    RedirectHandle(siStartupInfo, *hErrFile, STD_ERROR_HANDLE);
  }
}
Пример #3
0
/**
* Run commands by creating an annonymous pipe (cmd1 | cmd2)
*/
static bool do_on_pipe(command_t *s, int level, command_t *father, simple_command_t *queue[100], unsigned int *queue_len)
{  
  SECURITY_ATTRIBUTES sa;
  STARTUPINFO siStartupInfo;
  PROCESS_INFORMATION piProcessInfo;
  HANDLE hOutFile = INVALID_HANDLE_VALUE;
  HANDLE hInFile = INVALID_HANDLE_VALUE;
  HANDLE hErrFile = INVALID_HANDLE_VALUE;
  BOOL changed = FALSE;
  unsigned int i;
  HANDLE fdes[30][2];
  if(!s)
    return true;
  if(s->scmd){
    queue[*queue_len] = s->scmd;
    (*queue_len)++;
    return true;
  }

  if(s->cmd1 != NULL){
    do_on_pipe(s->cmd1, level+1, s, queue, queue_len);
  }

  if(s->cmd2 != NULL){
    do_on_pipe(s->cmd2, level+1, s, queue, queue_len);
  }

  if(s->up == NULL || s->up->op != OP_PIPE){

    //initializare atribute securitate
    ZeroMemory(&sa, sizeof(SECURITY_ATTRIBUTES));
    sa.nLength = sizeof(SECURITY_ATTRIBUTES);
    sa.bInheritHandle = TRUE;

    ZeroMemory(&siStartupInfo, sizeof(siStartupInfo));
    ZeroMemory(&piProcessInfo, sizeof(piProcessInfo));
    siStartupInfo.cb = sizeof(siStartupInfo); 
    //creare n-1 pipe-uri
    for(i = 0; i < (*queue_len) - 1 ; i++){
      changed = CreatePipe(&fdes[i][0], &fdes[i][1], &sa, 11* 1024 *1024);
    }
    redirrect_command(queue[0], &siStartupInfo, &hInFile, &hOutFile, &hErrFile);
    RedirectHandle(&siStartupInfo, fdes[0][1], STD_OUTPUT_HANDLE);
    exec_simple_proc(queue[0], hErrFile, sa, siStartupInfo, piProcessInfo);
    close_handles(hInFile, hOutFile, hErrFile);
    CloseHandle(fdes[0][1]);

    for(i = 1; i < (*queue_len) - 1; ++i){
      redirrect_command(queue[0], &siStartupInfo, &hInFile, &hOutFile, &hErrFile);
      RedirectHandle(&siStartupInfo,  fdes[i][1], STD_OUTPUT_HANDLE);
      RedirectHandle(&siStartupInfo,  fdes[i-1][0], STD_INPUT_HANDLE);
      exec_simple_proc(queue[i], hErrFile, sa, siStartupInfo, piProcessInfo);
      close_handles(hInFile, hOutFile, hErrFile);
      CloseHandle(fdes[i][1]);
      CloseHandle(fdes[i-1][0]);
    }
    redirrect_command(queue[(*queue_len)-1], &siStartupInfo, &hInFile, &hOutFile, &hErrFile);
    RedirectHandle(&siStartupInfo, fdes[(*queue_len)-2][0], STD_INPUT_HANDLE);
    exec_simple_proc(queue[(*queue_len)-1], hErrFile, sa, siStartupInfo, piProcessInfo);
    close_handles(hInFile, hOutFile, hErrFile);
    CloseHandle(fdes[(*queue_len)-2][0]);

  }

  return true; /* TODO replace with actual exit status */
}