diff --git a/ProcessWin32.c b/ProcessWin32.c index a78c9c9fcd8aaa6244d7d1dedcc7e89eaac8196c..4df063efe2abe46fd5aa5f783c0b85b26a024150 100644 --- a/ProcessWin32.c +++ b/ProcessWin32.c @@ -187,6 +187,9 @@ struct kwsysProcess_s char* PipeFileSTDOUT; char* PipeFileSTDERR; + /* Handle to automatically delete the Win9x forwarding executable. */ + HANDLE Win9xHandle; + /* ------------- Data managed per call to Execute ------------- */ /* The exceptional behavior that terminated the process, if any. */ @@ -286,7 +289,8 @@ kwsysProcess* kwsysProcess_New() /* Construct the executable name from the process id and kwsysProcess instance. This should be unique. */ - sprintf(fwdName, "cmw9xfwd_%u_%p.exe", GetCurrentProcessId(), cp); + sprintf(fwdName, KWSYS_NAMESPACE_STRING "pew9xfwd_%u_%p.exe", + GetCurrentProcessId(), cp); /* If we have a temp directory, use it. */ if(length > 0 && length <= _MAX_PATH) @@ -315,6 +319,19 @@ kwsysProcess* kwsysProcess_New() kwsysProcess_Delete(cp); return 0; } + + /* Get a handle to the file that will delete it when closed. */ + cp->Win9xHandle = CreateFile(win9x, GENERIC_READ, FILE_SHARE_READ, 0, + OPEN_EXISTING, FILE_FLAG_DELETE_ON_CLOSE, 0); + if(cp->Win9xHandle == INVALID_HANDLE_VALUE) + { + /* We were not able to get a read handle for the forwarding + executable. It will not be deleted properly. Give up. */ + _unlink(win9x); + free(win9x); + kwsysProcess_Delete(cp); + return 0; + } } else { @@ -475,8 +492,9 @@ void kwsysProcess_Delete(kwsysProcess* cp) } if(cp->Win9x) { - _unlink(cp->Win9x); - free(cp->Win9x); + /* Close or handle to the forwarding executable file. This will + cause it to be deleted. */ + kwsysProcessCleanupHandle(&cp->Win9xHandle); } free(cp); }