From 5a40b568d023922e735ddc21f3b4a30d52197b7a Mon Sep 17 00:00:00 2001
From: Ian Lance Taylor <iant@golang.org>
Date: Thu, 18 Sep 2014 17:27:26 -0700
Subject: [PATCH] lib9, cmd/ld: fixes for cross-linking on a Windows host

This fixes a couple of problems that occur when the linker
removes its temporary directory on Windows.  The linker only
creates and removes a temporary directory when doing external
linking.  Windows does not yet support external linking.
Therefore, these problems are only seen when using a
cross-compiler hosted on Windows.

In lib9, FindFirstFileW returns just the file name, not the
full path name.  Don't assume that we will find a slash.
Changed the code to work either way just in case.

In ld, Windows requires that files be closed before they are
removed, so close the output file before we might try to
remove it.

Fixes #8723.

LGTM=alex.brainman
R=golang-codereviews, alex.brainman
CC=golang-codereviews
https://golang.org/cl/141690043
---
 src/cmd/ld/lib.c           |  4 ++++
 src/lib9/tempdir_windows.c | 19 +++++++++++--------
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/src/cmd/ld/lib.c b/src/cmd/ld/lib.c
index 651705a2e6..36f0f99de2 100644
--- a/src/cmd/ld/lib.c
+++ b/src/cmd/ld/lib.c
@@ -144,6 +144,10 @@ libinit(void)
 void
 errorexit(void)
 {
+	if(cout >= 0) {
+		// For rmtemp run at atexit time on Windows.
+		close(cout);
+	}
 	if(nerrors) {
 		if(cout >= 0)
 			mayberemoveoutfile();
diff --git a/src/lib9/tempdir_windows.c b/src/lib9/tempdir_windows.c
index 1a530059ae..4c3df7cf11 100644
--- a/src/lib9/tempdir_windows.c
+++ b/src/lib9/tempdir_windows.c
@@ -70,7 +70,7 @@ removeall(char *p)
 {
 	WinRune *r, *r1;
 	DWORD attr;
-	char *q, *elem;
+	char *q, *qt, *elem;
 	HANDLE h;
 	WIN32_FIND_DATAW data;
 	
@@ -91,15 +91,18 @@ removeall(char *p)
 	do{
 		q = toutf(data.cFileName);
 		elem = strrchr(q, '\\');
-		if(elem != nil) {
+		if(elem != nil)
 			elem++;
-			if(strcmp(elem, ".") == 0 || strcmp(elem, "..") == 0) {
-				free(q);
-				continue;
-			}
+		else
+			elem = q;
+		if(strcmp(elem, ".") == 0 || strcmp(elem, "..") == 0) {
+			free(q);
+			continue;
 		}
-		removeall(q);
-		free(q);		
+		qt = smprint("%s\\%s", p, q);
+		free(q);
+		removeall(qt);
+		free(qt);
 	}while(FindNextFileW(h, &data));
 	FindClose(h);
 
-- 
2.30.9