Environment passing

Alexandre Julliard julliard at winehq.com
Tue Oct 8 11:24:28 CDT 2002


Chris Morgan <cmorgan at alum.wpi.edu> writes:

> I've been looking into exactly what is broken with environment passing in 
> CreateProcess() and the functions it uses.  What appears to be breaking 
> things at this point is just what Eric mentioned, that we mess with the PATH 
> environment variable inside of fork_and_exec() and then we call out to 
> execve() with this modified environment.  It appears that we really do need 
> to mess with the PATH environment variable to ensure that execve() finds 
> things in the correct unix path locations.  I was thinking that before we 
> execve() that we could copy the current PATH into a variable called __PATH.  
> We would then restore PATH in PROCESS_InitWine() from this __PATH.

Yes, I wrote a patch some time ago to do this, here it is. I think it
should still work but I haven't tested it. Let me know if it works for
you and I'll put it in.

Index: files/directory.c
===================================================================
RCS file: /opt/cvs-commit/wine/files/directory.c,v
retrieving revision 1.54
diff -u -r1.54 directory.c
--- files/directory.c	13 Sep 2002 18:52:01 -0000	1.54
+++ files/directory.c	8 Oct 2002 15:09:58 -0000
@@ -160,17 +160,21 @@
         DRIVE_Chdir( drive, DIR_Windows.short_name + 2 );
     }
 
-    PROFILE_GetWineIniString(wineW, pathW, path_dirW, longpath, MAX_PATHNAME_LEN);
-    if (strchrW(longpath, '/'))
+    /* Set the environment variables */
+
+    /* set PATH only if not set already */
+    if (!GetEnvironmentVariableW( path_capsW, longpath, MAX_PATHNAME_LEN ))
     {
-	MESSAGE("Fix your wine config to use DOS drive syntax in [wine] 'Path=' statement! (no '/' allowed)\n");
-	PROFILE_UsageWineIni();
-	ExitProcess(1);
+        PROFILE_GetWineIniString(wineW, pathW, path_dirW, longpath, MAX_PATHNAME_LEN);
+        if (strchrW(longpath, '/'))
+        {
+            MESSAGE("Fix your wine config to use DOS drive syntax in [wine] 'Path=' statement! (no '/' allowed)\n");
+            PROFILE_UsageWineIni();
+            ExitProcess(1);
+        }
+        SetEnvironmentVariableW( path_capsW, longpath );
     }
 
-    /* Set the environment variables */
-
-    SetEnvironmentVariableW( path_capsW, longpath );
     SetEnvironmentVariableW( temp_capsW, tmp_dir.short_name );
     SetEnvironmentVariableW( tmp_capsW, tmp_dir.short_name );
     SetEnvironmentVariableW( windirW, DIR_Windows.short_name );
Index: memory/environ.c
===================================================================
RCS file: /opt/cvs-commit/wine/memory/environ.c,v
retrieving revision 1.37
diff -u -r1.37 environ.c
--- memory/environ.c	24 Sep 2002 18:29:40 -0000	1.37
+++ memory/environ.c	8 Oct 2002 15:10:07 -0000
@@ -152,7 +152,11 @@
     /* Compute the total size of the Unix environment */
 
     size = sizeof(BYTE) + sizeof(WORD) + sizeof(ENV_program_name);
-    for (e = environ; *e; e++) size += strlen(*e) + 1;
+    for (e = environ; *e; e++)
+    {
+        if (!memcmp( *e, "PATH=", 5 )) continue;
+        size += strlen(*e) + 1;
+    }
 
     /* Now allocate the environment */
 
@@ -164,7 +168,10 @@
 
     for (e = environ; *e; e++)
     {
-        strcpy( p, *e );
+        /* skip Unix PATH and store WINEPATH as PATH */
+        if (!memcmp( *e, "PATH=", 5 )) continue;
+        if (!memcmp( *e, "WINEPATH=", 9 )) strcpy( p, *e + 4 );
+        else strcpy( p, *e );
         p += strlen(p) + 1;
     }
 
Index: scheduler/process.c
===================================================================
RCS file: /opt/cvs-commit/wine/scheduler/process.c,v
retrieving revision 1.200
diff -u -r1.200 process.c
--- scheduler/process.c	3 Oct 2002 19:54:57 -0000	1.200
+++ scheduler/process.c	8 Oct 2002 15:10:10 -0000
@@ -820,9 +820,16 @@
         /* now put the Windows environment strings */
         for (p = env; *p; p += strlen(p) + 1)
         {
-            if (memcmp( p, "PATH=", 5 ) &&
-                memcmp( p, "HOME=", 5 ) &&
-                memcmp( p, "WINEPREFIX=", 11 )) *envptr++ = (char *)p;
+            if (!memcmp( p, "PATH=", 5 ))  /* store PATH as WINEPATH */
+            {
+                char *winepath = malloc( strlen(p) + 5 );
+                strcpy( winepath, "WINE" );
+                strcpy( winepath + 4, p );
+                *envptr++ = winepath;
+            }
+            else if (memcmp( p, "HOME=", 5 ) &&
+                     memcmp( p, "WINEPATH=", 9 ) &&
+                     memcmp( p, "WINEPREFIX=", 11 )) *envptr++ = (char *)p;
         }
         *envptr = 0;
     }

-- 
Alexandre Julliard
julliard at winehq.com



More information about the wine-devel mailing list