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]

Patch for cygutils: let cygstart properly convert environment variables


Hi,

Attached is a patch that fixes a bug in cygstart, triggered by changes
in Cygwin 1.5.19, where certain path-based environment variables (like
TMP) were not converted from POSIX to Win32. (See
<http://cygwin.com/ml/cygwin/2006-02/msg00154.html>.)
It also contains the outstanding patch from Eric Blake to not let
cygstart parse any options listed after the to-be-started command. (See
<http://cygwin.com/ml/cygwin/2005-07/msg01082.html>.)

Chuck, can you please apply the patch, and release a new version, at
your convenience?
A suggested list of changes:
* cygstart - properly convert environment variables to Win32
* cygstart - don't parse options listed after the command

Thanks in advance,

– Michael

? .cygstart.c.swp
Index: cygstart.c
===================================================================
RCS file: /cvs/cygwin-apps/cygutils/src/cygstart/cygstart.c,v
retrieving revision 1.4
diff -u -r1.4 cygstart.c
--- cygstart.c	16 May 2005 20:18:52 -0000	1.4
+++ cygstart.c	9 Feb 2006 16:30:56 -0000
@@ -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.2";
+static const char versionID[] = "1.3";
 /* for future CVS */
 static const char revID[] =
 	"$Id: cygstart.c,v 1.4 2005/05/16 20:18:52 cwilson Exp $";
@@ -176,7 +176,7 @@
     }
 
     /* Parse options */
-    optCon = poptGetContext(NULL, argc, argv, opt, 0);
+    optCon = poptGetContext(NULL, argc, argv, opt, POPT_CONTEXT_POSIXMEHARDER);
     poptSetOtherOptionHelp(optCon, "[OPTION]... FILE [ARGUMENTS]");
     while ((rc = poptGetNextOpt(optCon)) > 0) {
         switch (rc) {
@@ -523,6 +523,8 @@
     char **envp = environ;
     char *var, *val;
     char curval[2];
+    char *winpathlist;
+    char winpath[MAX_PATH+1];
 
     while (envp && *envp) {
         var = strdup(*envp++);
@@ -531,7 +533,25 @@
         
         if (GetEnvironmentVariable(var, curval, 2) == 0
                     && GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
-            SetEnvironmentVariable(var, val);
+            /* Convert POSIX to Win32 where necessary */
+            if (!strcmp(var, "PATH") ||
+                        !strcmp(var, "LD_LIBRARY_PATH")) {
+                winpathlist = (char *)
+                      malloc(cygwin_posix_to_win32_path_list_buf_size(val)+1);
+                if (winpathlist) {
+                    cygwin_posix_to_win32_path_list(val, winpathlist);
+                    SetEnvironmentVariable(var, winpathlist);
+                    free(winpathlist);
+                }
+            } else if (!strcmp(var, "HOME") ||
+                        !strcmp(var, "TMPDIR") ||
+                        !strcmp(var, "TMP") ||
+                        !strcmp(var, "TEMP")) {
+                cygwin_conv_to_win32_path(val, winpath);
+                SetEnvironmentVariable(var, winpath);
+            } else {
+                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]