summaryrefslogtreecommitdiffstats
path: root/unix/tclUnixFile.c
diff options
context:
space:
mode:
authorjan.nijtmans <nijtmans@users.sourceforge.net>2012-04-04 14:50:05 (GMT)
committerjan.nijtmans <nijtmans@users.sourceforge.net>2012-04-04 14:50:05 (GMT)
commit1cbe41a90cc155259e98e2e4ed1cfdae770d19a6 (patch)
tree09a887b9d2dbdf1d0aadc016d311022eeea7008b /unix/tclUnixFile.c
parent5cc8272056a2950e552b579f4717b123a9578bdc (diff)
downloadtcl-1cbe41a90cc155259e98e2e4ed1cfdae770d19a6.zip
tcl-1cbe41a90cc155259e98e2e4ed1cfdae770d19a6.tar.gz
tcl-1cbe41a90cc155259e98e2e4ed1cfdae770d19a6.tar.bz2
implement TclpGetPid for Cygwin
Diffstat (limited to 'unix/tclUnixFile.c')
-rw-r--r--unix/tclUnixFile.c38
1 files changed, 33 insertions, 5 deletions
diff --git a/unix/tclUnixFile.c b/unix/tclUnixFile.c
index 5eac978..4ba2e47 100644
--- a/unix/tclUnixFile.c
+++ b/unix/tclUnixFile.c
@@ -22,7 +22,8 @@ static int NativeMatchType(CONST char* nativeName, Tcl_GlobTypeData *types);
* TclpFindExecutable --
*
* This procedure computes the absolute path name of the current
- * application, given its argv[0] value.
+ * application, given its argv[0] value. For Cygwin, argv[0] is
+ * ignored and the path is determined the same as under win32.
*
* Results:
* A dirty UTF string that is the path to the executable. At this
@@ -45,18 +46,44 @@ TclpFindExecutable(argv0)
CONST char *argv0; /* The value of the application's argv[0]
* (native). */
{
+ int length;
+#ifdef __CYGWIN__
+ char buf[PATH_MAX * TCL_UTF_MAX + 1];
+ char name[PATH_MAX * TCL_UTF_MAX + 1];
+#else
CONST char *name, *p;
Tcl_StatBuf statBuf;
- int length;
Tcl_DString buffer, nameString;
+#endif
- if (argv0 == NULL) {
- return NULL;
- }
if (tclNativeExecutableName != NULL) {
return tclNativeExecutableName;
}
+#ifdef __CYGWIN__
+
+ /* Make some symbols available without including <windows.h> */
+# define CP_UTF8 65001
+ extern int cygwin_conv_to_full_posix_path(const char *, char *);
+ extern __stdcall int GetModuleFileNameW(void *, const char *, int);
+ extern __stdcall int WideCharToMultiByte(int, int, const char *, int,
+ const char *, int, const char *, const char *);
+
+ GetModuleFileNameW(NULL, name, PATH_MAX);
+ WideCharToMultiByte(CP_UTF8, 0, name, -1, buf, PATH_MAX, NULL, NULL);
+ cygwin_conv_to_full_posix_path(buf, name);
+ length = strlen(name);
+ if ((length > 4) && !strcasecmp(name + length - 4, ".exe")) {
+ /* Strip '.exe' part. */
+ length -= 4;
+ }
+ tclNativeExecutableName = (char *) ckalloc(length + 1);
+ memcpy(tclNativeExecutableName, name, length);
+ buf[length] = '\0';
+#else
+ if (argv0 == NULL) {
+ return NULL;
+ }
Tcl_DStringInit(&buffer);
name = argv0;
@@ -174,6 +201,7 @@ gotName:
done:
Tcl_DStringFree(&buffer);
+#endif
return tclNativeExecutableName;
}