Index: dln.c
===================================================================
RCS file: /cvs/ruby/src/ruby/dln.c,v
retrieving revision 1.64
diff -U2 -p -r1.64 dln.c
--- dln.c	20 Apr 2005 14:22:57 -0000	1.64
+++ dln.c	6 May 2005 07:30:37 -0000
@@ -1766,5 +1766,9 @@ dln_find_1(fname, path, exe_flag)
 
 #ifndef __MACOS__
-	if (stat(fbuf, &st) == 0) {
+	if (
+#if defined(DOSISH)
+	    !exe_flag &&
+#endif
+	    stat(fbuf, &st) == 0) {
 	    if (exe_flag == 0) return fbuf;
 	    /* looking for executable */
@@ -1801,4 +1805,29 @@ dln_find_1(fname, path, exe_flag)
 	    int j;
 
+#if defined(_WIN32)
+	    j = GetEnvironmentVariable("PATHEXT", NULL, 0);
+	    if (j) {
+		char *pathext = ALLOCA_N(char, j), *nextext;
+		GetEnvironmentVariable("PATHEXT", pathext, j);
+		while (*pathext == ';') pathext++;
+		while (*pathext) {
+		    nextext = strchr(pathext, ';');
+		    j = nextext ? nextext - pathext : strlen(pathext);
+		    if (fspace < j) {
+			fprintf(stderr, "openpath: pathname too long (ignored)\n");
+			fprintf(stderr, "\tDirectory \"%.*s\"\n", (int) (bp - fbuf), fbuf);
+			fprintf(stderr, "\tFile \"%s%.*s\"\n", fname, j, pathext);
+			continue;
+		    }
+		    memcpy(bp + i, pathext, j);
+		    bp[i + j] = '\0';
+		    if (stat(fbuf, &st) == 0)
+			return fbuf;
+		    pathext += j;
+		    while (*pathext == ';') pathext++;
+		}
+	    }
+#endif
+
 	    for (j = 0; extension[j]; j++) {
 		if (fspace < strlen(extension[j])) {
