Home | History | Annotate | Download | only in deutil

Lines Matching full:process

21  * \brief Process abstraction.
66 printf("Process launch failed: %s\n", message);
138 deProcess* process = (deProcess*)deCalloc(sizeof(deProcess));
139 if (!process)
142 process->state = PROCESSSTATE_NOT_STARTED;
144 return process;
147 static void deProcess_cleanupHandles (deProcess* process)
149 if (process->standardIn)
150 deFile_destroy(process->standardIn);
152 if (process->standardOut)
153 deFile_destroy(process->standardOut);
155 if (process->standardErr)
156 deFile_destroy(process->standardErr);
158 process->pid = 0;
159 process->standardIn = DE_NULL;
160 process->standardOut = DE_NULL;
161 process->standardErr = DE_NULL;
164 void deProcess_destroy (deProcess* process)
167 if (deProcess_isRunning(process))
169 deProcess_kill(process);
170 deProcess_waitForFinish(process);
173 deProcess_cleanupHandles(process);
174 deFree(process->lastError);
175 deFree(process);
178 const char* deProcess_getLastError (const deProcess* process)
180 return process->lastError ? process->lastError : "No error";
183 int deProcess_getExitCode (const deProcess* process)
185 return process->exitCode;
188 static deBool deProcess_setError (deProcess* process, const char* error)
190 if (process->lastError)
192 deFree(process->lastError);
193 process->lastError = DE_NULL;
196 process->lastError = deStrdup(error);
197 return process->lastError != DE_NULL;
200 static deBool deProcess_setErrorFromErrno (deProcess* process, const char* message)
205 return deProcess_setError(process, message);
216 deBool deProcess_start (deProcess* process, const char* commandLine, const char* workingDirectory)
224 if (process->state == PROCESSSTATE_RUNNING)
226 deProcess_setError(process, "Process already running");
229 else if (process->state == PROCESSSTATE_FINISHED)
231 deProcess_cleanupHandles(process);
232 process->state = PROCESSSTATE_NOT_STARTED;
237 deProcess_setErrorFromErrno(process, "pipe() failed");
251 deProcess_setErrorFromErrno(process, "fork() failed");
263 /* Child process. */
298 /* Parent process. */
336 deProcess_setError(process, errBuf);
346 process->pid = pid;
347 process->state = PROCESSSTATE_RUNNING;
354 process->standardIn = deFile_createFromHandle((deUintptr)pipeIn[1]);
355 process->standardOut = deFile_createFromHandle((deUintptr)pipeOut[0]);
356 process->standardErr = deFile_createFromHandle((deUintptr)pipeErr[0]);
358 if (!process->standardIn)
361 if (!process->standardOut)
364 if (!process->standardErr)
371 deBool deProcess_isRunning (deProcess* process)
373 if (process->state == PROCESSSTATE_RUNNING)
377 if (waitpid(process->pid, &status, WNOHANG) == 0)
383 process->state = PROCESSSTATE_FINISHED;
393 deBool deProcess_waitForFinish (deProcess* process)
398 if (process->state != PROCESSSTATE_RUNNING)
400 deProcess_setError(process, "Process is not running");
405 while ((waitResult = waitpid(process->pid, &status, 0)) != process->pid)
408 if (waitResult != process->pid)
410 deProcess_setErrorFromErrno(process, "waitpid() failed");
416 deProcess_setErrorFromErrno(process, "waitpid() failed");
420 process->exitCode = WEXITSTATUS(status);
421 process->state = PROCESSSTATE_FINISHED;
425 static deBool deProcess_sendSignal (deProcess* process, int sigNum)
427 if (process->state != PROCESSSTATE_RUNNING)
429 deProcess_setError(process, "Process is not running");
433 if (kill(process->pid, sigNum) == 0)
437 deProcess_setErrorFromErrno(process, "kill() failed");
442 deBool deProcess_terminate (deProcess* process)
444 return deProcess_sendSignal(process, SIGTERM);
447 deBool deProcess_kill (deProcess* process)
449 return deProcess_sendSignal(process, SIGKILL);
452 deFile* deProcess_getStdIn (deProcess* process)
454 return process->standardIn;
457 deFile* deProcess_getStdOut (deProcess* process)
459 return process->standardOut;
462 deFile* deProcess_getStdErr (deProcess* process)
464 return process->standardErr;
467 deBool deProcess_closeStdIn (deProcess* process)
469 if (process->standardIn)
471 deFile_destroy(process->standardIn);
472 process->standardIn = DE_NULL;
479 deBool deProcess_closeStdOut (deProcess* process)
481 if (process->standardOut)
483 deFile_destroy(process->standardOut);
484 process->standardOut = DE_NULL;
491 deBool deProcess_closeStdErr (deProcess* process)
493 if (process->standardErr)
495 deFile_destroy(process->standardErr);
496 process->standardErr = DE_NULL;
531 static deBool deProcess_setError (deProcess* process, const char* error)
533 if (process->lastError)
535 deFree(process->lastError);
536 process->lastError = DE_NULL;
539 process->lastError = deStrdup(error);
540 return process->lastError != DE_NULL;
543 static deBool deProcess_setErrorFromWin32 (deProcess* process, const char* msg)
558 return deProcess_setError(process, errBuf);
564 return deProcess_setError(process, errBuf);
570 deProcess* process = (deProcess*)deCalloc(sizeof(deProcess));
571 if (!process)
574 process->state = PROCESSSTATE_NOT_STARTED;
576 return process;
579 void deProcess_cleanupHandles (deProcess* process)
581 DE_ASSERT(!deProcess_isRunning(process));
583 if (process->standardErr)
584 deFile_destroy(process->standardErr);
586 if (process->standardOut)
587 deFile_destroy(process->standardOut);
589 if (process->standardIn)
590 deFile_destroy(process->standardIn);
592 if (process->procInfo.hProcess)
593 CloseHandle(process->procInfo.hProcess);
595 if (process->procInfo.hThread)
596 CloseHandle(process->procInfo.hThread);
598 process->standardErr = DE_NULL;
599 process->standardOut = DE_NULL;
600 process->standardIn = DE_NULL;
601 process->procInfo.hProcess = DE_NULL;
602 process->procInfo.hThread = DE_NULL;
605 void deProcess_destroy (deProcess* process)
607 if (deProcess_isRunning(process))
609 deProcess_kill(process);
610 deProcess_waitForFinish(process);
613 deProcess_cleanupHandles(process);
614 deFree(process->lastError);
615 deFree(process);
618 const char* deProcess_getLastError (const deProcess* process)
620 return process->lastError ? process->lastError : "No error";
623 int deProcess_getExitCode (const deProcess* process)
625 return process->exitCode;
628 deBool deProcess_start (deProcess* process, const char* commandLine, const char* workingDirectory)
641 if (process->state == PROCESSSTATE_RUNNING)
643 deProcess_setError(process, "Process already running");
646 else if (process->state == PROCESSSTATE_FINISHED)
648 /* Process finished, clean up old cruft. */
649 deProcess_cleanupHandles(process);
650 process->state = PROCESSSTATE_NOT_STARTED;
665 deProcess_setErrorFromWin32(process, "CreatePipe() failed");
674 deProcess_setErrorFromWin32(process, "CreatePipe() failed");
685 deProcess_setErrorFromWin32(process, "CreatePipe() failed");
702 if (!CreateProcess(DE_NULL, (LPTSTR)commandLine, DE_NULL, DE_NULL, TRUE /* inherit handles */, 0, DE_NULL, workingDirectory, &startInfo, &process->procInfo))
705 deProcess_setErrorFromWin32(process, "CreateProcess() failed");
718 process->state = PROCESSSTATE_RUNNING;
726 process->standardIn = deFile_createFromHandle((deUintptr)stdInWrite);
727 process->standardOut = deFile_createFromHandle((deUintptr)stdOutRead);
728 process->standardErr = deFile_createFromHandle((deUintptr)stdErrRead);
733 deBool deProcess_isRunning (deProcess* process)
735 if (process->state == PROCESSSTATE_RUNNING)
738 BOOL result = GetExitCodeProcess(process->procInfo.hProcess, (LPDWORD)&exitCode);
742 deProcess_setErrorFromWin32(process, "GetExitCodeProcess() failed");
751 process->exitCode = exitCode;
752 process->state = PROCESSSTATE_FINISHED;
760 deBool deProcess_waitForFinish (deProcess* process)
762 if (process->state == PROCESSSTATE_RUNNING)
764 if (WaitForSingleObject(process->procInfo.hProcess, INFINITE) != WAIT_OBJECT_0)
766 deProcess_setErrorFromWin32(process, "WaitForSingleObject() failed");
769 return !deProcess_isRunning(process);
773 deProcess_setError(process, "Process is not running");
778 static deBool stopProcess (deProcess* process, deBool kill)
780 if (process->state == PROCESSSTATE_RUNNING)
782 if (!TerminateProcess(process->procInfo.hProcess, kill ? -1 : 0))
784 deProcess_setErrorFromWin32(process, "TerminateProcess() failed");
792 deProcess_setError(process, "Process is not running");
797 deBool deProcess_terminate (deProcess* process)
799 return stopProcess(process, DE_FALSE);
802 deBool deProcess_kill (deProcess* process)
804 return stopProcess(process, DE_TRUE);
807 deFile* deProcess_getStdIn (deProcess* process)
809 return process->standardIn;
812 deFile* deProcess_getStdOut (deProcess* process)
814 return process->standardOut;
817 deFile* deProcess_getStdErr (deProcess* process)
819 return process->standardErr;
822 deBool deProcess_closeStdIn (deProcess* process)
824 if (process->standardIn)
826 deFile_destroy(process->standardIn);
827 process->standardIn = DE_NULL;
834 deBool deProcess_closeStdOut (deProcess* process)
836 if (process->standardOut)
838 deFile_destroy(process->standardOut);
839 process->standardOut = DE_NULL;
846 deBool deProcess_closeStdErr (deProcess* process)
848 if (process->standardErr)
850 deFile_destroy(process->standardErr);
851 process->standardErr = DE_NULL;