This is the mail archive of the cygwin mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Fixing strace and cygcheck so that they work with mount -X


On 11-May-2005 20:58, David Rothenberger wrote:

> On 5/11/2005 9:53 AM, Christopher Faylor wrote:
>
>> On Wed, May 11, 2005 at 11:40:36AM -0400, Christopher Faylor wrote:
>>
>>> It sounds like you need to read MSDN on CreateProcess and see what
>>> it says
>>> about "lpEnvironment":
>>>
>>> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/createprocess.asp
>>>
>>
>
> cygstart uses ShellExecute, not CreateProcess.
>
>> Btw, from the description, it sounds like cygstart is broken right now
>> and could be fixed right now.  You don't need any of the functionality
>> from the snapshot.  You just need to construct a windows lpEnvironment
>> block from the UNIX-like global variable, provided by cygwin: "extern
>> char **environ".
>
>
> The attached patch fixes cygstart for me. It copies all missing Cygwin
> environment variables to the Windows environment before invoking
> ShellExecute.
>
Indeed, that's the help I needed!  :-)

The patch as-is doesn't compile for me, though, I presume because
    char **envp = (char **) cygwin_internal (CW_ENVP);
uses a not-yet-released Cygwin enhancement.  But when I change it to the
simpler and more standard
    char **envp = environ;
it compiles and works fine, both under mount -X and normally.

(At first I was a bit suspicious of the logic - it only sets those
Windows variables that are not currently set, so what about variables
that were changed or deleted within Cygwin? - but it looks like the
Windows environment isn't the standard pre-Cygwin user environment, but
a minimal one with only PATH and SYSTEMROOT set, so it actually does
behave optimally this way - it sets all other variables when running
under mount -X, and sets nothing otherwise.)

Revised patch attached.  Can you try this out and see if it still works
for you?  If you confirm this, I'll resend the patch in a new, more
obviously titled thread, to attract Chuck's attention.  ;-)

Thanks for your and Chris' assistance,

 - Michael
--- ORIG/cygstart.c	2005-03-08 06:22:51.000000000 +0100
+++ cygstart.c	2005-05-12 00:37:06.047250000 +0200
@@ -40,7 +40,7 @@
 #define MSDN_URL "http://msdn.microsoft.com/library/en-us/shellcc/platform/"; \
                  "Shell/reference/functions/shellexecute.asp"
 
-static const char versionID[] = "1.0";
+static const char versionID[] = "1.2";
 /* for future CVS */
 static const char revID[] =
 	"$Id: cygstart.c,v 1.3 2005/03/08 05:22:51 cwilson Exp $";
@@ -64,6 +64,7 @@
 static void help(poptContext optCon, FILE *f, char *name);
 static void version(poptContext optCon, FILE *f, char *name);
 static void license(poptContext optCon, FILE *f, char *name);
+static void setup_win_environ(void);
 
 int main(int argc, const char **argv)
 {
@@ -404,6 +405,9 @@
 {
     int ret;
 
+    /* Need to sync the Windows environment when running under "mount -X" */
+    setup_win_environ();
+
     ret = (int) ShellExecute(NULL, action, aPath, args, workDir, show);
     if (ret >= 32) {
         return TRUE;
@@ -511,3 +515,25 @@
   printTopDescription(f, name);
   printLicense(f, name);
 }  
+
+/* Copy cygwin environment variables to the Windows environment if they're not
+ * already there. */
+static void setup_win_environ(void)
+{
+    char **envp = environ;
+    char *var, *val;
+    char curval[2];
+
+    while (envp && *envp) {
+        var = strdup(*envp++);
+        val = strchr(var, '=');
+        *val++ = '\0';
+        
+        if (GetEnvironmentVariable(var, curval, 2) == 0
+                    && GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
+            SetEnvironmentVariable(var, val);
+        }
+
+        free(var);
+    }
+}

--
Unsubscribe info:      http://cygwin.com/ml/#unsubscribe-simple
Problem reports:       http://cygwin.com/problems.html
Documentation:         http://cygwin.com/docs.html
FAQ:                   http://cygwin.com/faq/

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]