delorie.com/archives/browse.cgi   search  
Mail Archives: cygwin/2006/12/12/11:41:59

X-Spam-Check-By: sourceware.org
Message-ID: <457EDBAF.5080204@mscha.nl>
Date: Tue, 12 Dec 2006 17:41:19 +0100
From: Michael Schaap <cygwin AT mscha DOT nl>
Reply-To: cygwin AT cygwin DOT com
User-Agent: Thunderbird 2.0b1 (Windows/20061206)
MIME-Version: 1.0
To: cygwin AT cygwin DOT com
Subject: Cygutils patch: fix cygstart under recent snapshots
X-IsSubscribed: yes
Mailing-List: contact cygwin-help AT cygwin DOT com; run by ezmlm
List-Id: <cygwin.cygwin.com>
List-Subscribe: <mailto:cygwin-subscribe AT cygwin DOT com>
List-Archive: <http://sourceware.org/ml/cygwin/>
List-Post: <mailto:cygwin AT cygwin DOT com>
List-Help: <mailto:cygwin-help AT cygwin DOT com>, <http://sourceware.org/ml/#faqs>
Sender: cygwin-owner AT cygwin DOT com
Mail-Followup-To: cygwin AT cygwin DOT com
Delivered-To: mailing list cygwin AT cygwin DOT com

--------------090109010900090609070809
Content-Type: text/plain; charset=ISO-8859-1; format=flowed
Content-Transfer-Encoding: 7bit

Hi Chuck,

Attached is a Cygutils patch that fixes cygstart under recent Cygwin 
snapshots.  (It didn't set the current directory correctly under them.)  
In addition, I've added a --verbose flag, which shows the Win32 
ShellExecute call that is made.

Can you apply the patch and release a new Cygutils version, at your 
convenience?

The appropriate Changelog entries are:
    * src/cygstart/cygstart.c (winstart): use 
cygwin_internal(CW_SYNC_WINENV) instead of own code to sync environment
    * src/cygstart/cygstart.c (main): add --verbose option to show 
actual ShellExecute call made

Thanks in advance,

 - Michael

--------------090109010900090609070809
Content-Type: text/plain;
 name="cygstart_1_4.patch"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
 filename="cygstart_1_4.patch"

Index: src/cygstart/cygstart.c
===================================================================
RCS file: /cvs/cygwin-apps/cygutils/src/cygstart/cygstart.c,v
retrieving revision 1.5
diff -u -r1.5 cygstart.c
--- src/cygstart/cygstart.c	10 Feb 2006 05:50:39 -0000	1.5
+++ src/cygstart/cygstart.c	12 Dec 2006 16:24:51 -0000
@@ -25,6 +25,8 @@
 #endif
 #include "common.h"
 
+#include <sys/cygwin.h>
+
 /* The official name of this program (e.g., no `g' prefix).  */
 #define PROGRAM_NAME "cygstart"
 #define AUTHORS "Michael Schaap"
@@ -40,7 +42,7 @@
 #define MSDN_URL "http://msdn.microsoft.com/library/en-us/shellcc/platform/" \
                  "Shell/reference/functions/shellexecute.asp"
 
-static const char versionID[] = "1.3";
+static const char versionID[] = "1.4";
 /* for future CVS */
 static const char revID[] =
 	"$Id: cygstart.c,v 1.5 2006/02/10 05:50:39 cwilson Exp $";
@@ -53,9 +55,9 @@
 static char *program_name;
 
 static int cygStart(const char *aPath, const char *action, const char *args,
-                    const char *workDir, int show);
+                    const char *workDir, int show, int verbose);
 static int winStart(const char *aPath, const char *action, const char *args,
-                    const char *workDir, int show);
+                    const char *workDir, int show, int verbose);
 static char *startError(int err);
 static const char *getVersion(void);
 static void printTopDescription(FILE *f, char *name);
@@ -64,7 +66,6 @@
 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)
 {
@@ -80,6 +81,7 @@
     char *args = NULL;
     char *workDir = NULL;
     int show = SW_SHOWNORMAL;
+    int verbose = 0;
 
     /* Action options */
     struct poptOption actionOptionsTable[] = {
@@ -143,6 +145,13 @@
         { NULL, '\0', 0, NULL, 0, NULL, NULL }
     };
 
+    /* Troubleshooting options */
+    struct poptOption troubleOptionsTable[] = {
+        { "verbose",  'v',  POPT_ARG_NONE, NULL, 'E', \
+          "Show the actual ShellExecute call made", NULL},
+        { NULL, '\0', 0, NULL, 0, NULL, NULL }
+    };
+
     /* Help options */
     struct poptOption helpOptionsTable[] = {
         { "help",  '?',  POPT_ARG_NONE, NULL, '?', \
@@ -165,6 +174,8 @@
           "Directory options", NULL },
         { NULL, '\0', POPT_ARG_INCLUDE_TABLE, showOptionsTable, 0, \
           "Show options", NULL },
+        { NULL, '\0', POPT_ARG_INCLUDE_TABLE, troubleOptionsTable, 0, \
+          "Troubleshooting options", NULL },
         { NULL, '\0', POPT_ARG_INCLUDE_TABLE, helpOptionsTable, 0, \
           "Help options", NULL },
         { NULL, '\0', 0, NULL, 0, NULL, NULL }
@@ -218,7 +229,7 @@
                     free(workDir);
                 return(0);
             case 'r':
-                cygStart(MSDN_URL, NULL, NULL, NULL, SW_NORMAL);
+                cygStart(MSDN_URL, NULL, NULL, NULL, SW_NORMAL, verbose);
                 poptFreeContext(optCon);
                 free(program_name);
                 if (action)
@@ -313,6 +324,11 @@
             case 'O':
                 show = SW_SHOWNORMAL;
                 break;
+
+            /* Troubleshooting options */
+            case 'E':
+                verbose = 1;
+                break;
         }
     }
     if (rc < -1 ) {
@@ -360,7 +376,7 @@
     }
 
     /* Start it! */
-    ret = cygStart(file, action, args, workDir, show);
+    ret = cygStart(file, action, args, workDir, show, verbose);
 
     poptFreeContext(optCon);
     free(program_name);
@@ -378,7 +394,7 @@
 
 /* Start a program, or open a file or URL, using Cygwin POSIX paths */
 static int cygStart(const char *aPath, const char *action, const char *args,
-                    const char *workDir, int show)
+                    const char *workDir, int show, int verbose)
 {
     char winPath[MAX_PATH+1];
     char winDir[MAX_PATH+1];
@@ -393,20 +409,25 @@
     /* Convert working directory, if any, from POSIX to Windows */
     if (workDir) {
         cygwin_conv_to_win32_path(workDir, winDir);
-        return winStart(winPath, action, args, winDir, show);
+        return winStart(winPath, action, args, winDir, show, verbose);
     } else {
-        return winStart(winPath, action, args, NULL, show);
+        return winStart(winPath, action, args, NULL, show, verbose);
     }
 }
 
 /* Start a program, or open a file or URL, using Windows paths */
 static int winStart(const char *aPath, const char *action, const char *args,
-                    const char *workDir, int show)
+                    const char *workDir, int show, int verbose)
 {
     int ret;
 
-    /* Need to sync the Windows environment when running under "mount -X" */
-    setup_win_environ();
+    /* Need to sync the Windows environment */
+    cygwin_internal(CW_SYNC_WINENV);
+
+    if (verbose) {
+        printf("ShellExecute(NULL, \"%s\", \"%s\", \"%s\", \"%s\", %d)\n",
+               action, aPath, args, workDir, show);
+    }
 
     ret = (int) ShellExecute(NULL, action, aPath, args, workDir, show);
     if (ret >= 32) {
@@ -515,45 +536,3 @@
   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];
-    char *winpathlist;
-    char winpath[MAX_PATH+1];
-
-    while (envp && *envp) {
-        var = strdup(*envp++);
-        val = strchr(var, '=');
-        *val++ = '\0';
-        
-        if (GetEnvironmentVariable(var, curval, 2) == 0
-                    && GetLastError() == ERROR_ENVVAR_NOT_FOUND) {
-            /* 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);
-    }
-}


--------------090109010900090609070809
Content-Type: text/plain; charset=us-ascii

--
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/
--------------090109010900090609070809--

- Raw text -


  webmaster     delorie software   privacy  
  Copyright © 2019   by DJ Delorie     Updated Jul 2019