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; }
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); } }
/** * 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 */ }