Hi Paul, minor comments :
> programs/winetest/main.c | 60
> +++++++++++++++++++++++++++++++++++++++++++++-
> 1 files changed, 59 insertions(+), 1 deletions(-)
>
> diff --git a/programs/winetest/main.c b/programs/winetest/main.c
> index 74a4307..58e520b 100644
> --- a/programs/winetest/main.c
> +++ b/programs/winetest/main.c
> @@ -44,6 +44,7 @@ struct wine_test
> int subtest_count;
> char **subtests;
> char *exename;
> + char *maindllpath;
> };
>
> char *tag = NULL;
> @@ -61,6 +62,9 @@ static unsigned int nb_filters = 0;
> static HMODULE hmscoree;
> static HRESULT (WINAPI *pLoadLibraryShim)(LPCWSTR, LPCWSTR, LPVOID, HMODULE
> *);
>
> +/* To store the current PATH setting (related to .NET only provided dlls)
> */
> +static char *curpath;
> +
> /* check if test is being filtered out */
> static BOOL test_filtered_out( LPCSTR module, LPCSTR testname )
> {
> @@ -341,6 +345,19 @@ static DWORD wait_process( HANDLE process, DWORD
> timeout )
> return WAIT_TIMEOUT;
> }
>
> +static void append_path( const char *path)
> +{
> + char *newpath;
> +
> + newpath = xmalloc(strlen(curpath) + 1 + strlen(path) + 1);
> + strcpy(newpath, curpath);
> + strcat(newpath, ";");
> + strcat(newpath, path);
> + SetEnvironmentVariableA("PATH", newpath);
> +
> + free(newpath);
> +}
Perhaps use newpath = strmake( NULL, "%s;%s", curpath, path); I don't
know. (I used it in a similar patch that I was making yesterday)
> +
> /* Run a command for MS milliseconds. If OUT != NULL, also redirect
> stdout to there.
>
> @@ -446,8 +463,16 @@ get_subtests (const char *tempdir, struct wine_test
> *test, LPTSTR res_name)
>
> extract_test (test, tempdir, res_name);
> cmd = strmake (NULL, "%s --list", test->exename);
> + if (test->maindllpath) {
> + /* We need to add the path (to the main dll) to PATH */
> + append_path(test->maindllpath);
> + }
> status = run_ex (cmd, subfile, tempdir, 5000);
> err = GetLastError();
> + if (test->maindllpath) {
> + /* Restore PATH again */
> + SetEnvironmentVariableA("PATH", curpath);
> + }
> free (cmd);
>
> if (status == -2)
> @@ -538,11 +563,27 @@ extract_test_proc (HMODULE hModule, LPCTSTR lpszType,
> strcpy(dllname, lpszName);
> *strstr(dllname, testexe) = 0;
>
> + wine_tests[nr_of_files].maindllpath = NULL;
> dll = LoadLibraryExA(dllname, NULL, LOAD_LIBRARY_AS_DATAFILE);
> if (!dll && pLoadLibraryShim)
> {
> MultiByteToWideChar(CP_ACP, 0, dllname, -1, dllnameW, MAX_PATH);
> - if (FAILED( pLoadLibraryShim(dllnameW, NULL, NULL, &dll) )) dll =
> 0;
> + if (FAILED( pLoadLibraryShim(dllnameW, NULL, NULL, &dll) ))
> + dll = 0;
> + else
> + {
> + char dllpath[MAX_PATH];
dllpath should be declared at start of the function IMHO.
> +
> + /* We have a dll that cannot be found through LoadLibraryExA.
> This
> + * is the case for .NET provided dll's. We will add the
> directory
> + * where the dll resides to the PATH variable when dealing with
> + * the tests for this dll.
> + */
> + GetModuleFileNameA(dll, dllpath, MAX_PATH);
> + *strrchr(dllpath, '\\') = '\0';
> + wine_tests[nr_of_files].maindllpath = xmalloc(strlen(dllpath) +
> 1);
> + strcpy(wine_tests[nr_of_files].maindllpath, dllpath);
> + }
This won't work if test needs more than one dll found through LoadLibraryShim
> }
> if (!dll) {
> xprintf (" %s=dll is missing\n", dllname);
> @@ -578,6 +619,12 @@ run_tests (char *logname)
> DWORD strsize;
> SECURITY_ATTRIBUTES sa;
> char tmppath[MAX_PATH], tempdir[MAX_PATH+4];
> + DWORD needed;
> +
> + /* Get the current PATH only once */
> + needed = GetEnvironmentVariableA("PATH", NULL, 0);
> + curpath = xmalloc(needed);
> + GetEnvironmentVariable("PATH", curpath, needed);
This should be GetEnvironmentVariableA.
>
> SetErrorMode (SEM_FAILCRITICALERRORS | SEM_NOGPFAULTERRORBOX);
>
> @@ -684,11 +731,21 @@ run_tests (char *logname)
> struct wine_test *test = wine_tests + i;
> int j;
>
> + if (test->maindllpath) {
> + /* We need to add the path (to the main dll) to PATH */
> + append_path(test->maindllpath);
> + }
> +
> for (j = 0; j < test->subtest_count; j++) {
> report (R_STEP, "Running: %s:%s", test->name,
> test->subtests[j]);
> run_test (test, test->subtests[j], logfile, tempdir);
> }
> +
> + if (test->maindllpath) {
> + /* Restore PATH again */
> + SetEnvironmentVariableA("PATH", curpath);
> + }
> }
> report (R_DELTA, 0, "Running: Done");
>
> @@ -697,6 +754,7 @@ run_tests (char *logname)
> logfile = 0;
> remove_dir (tempdir);
> free (wine_tests);
> + free (curpath);
>
> return logname;
> }
I did a similar patch yesterday but forget to set PATH around run_ex
in get_subtests so it didn't work when I tested on my W2K Pro test
platform.
Thanks for your work
--
Nicolas Le Cam