summaryrefslogtreecommitdiff
path: root/src/lib9/tempdir_windows.c
diff options
context:
space:
mode:
authorMichael Stapelberg <michael@stapelberg.de>2013-03-23 11:28:53 +0100
committerMichael Stapelberg <michael@stapelberg.de>2013-03-23 11:28:53 +0100
commitb39e15dde5ec7b96c15da9faf4ab5892501c1aae (patch)
tree718cede1f6ca97d082c6c40b7dc3f4f6148253c0 /src/lib9/tempdir_windows.c
parent04b08da9af0c450d645ab7389d1467308cfc2db8 (diff)
downloadgolang-upstream/1.1_hg20130323.tar.gz
Imported Upstream version 1.1~hg20130323upstream/1.1_hg20130323
Diffstat (limited to 'src/lib9/tempdir_windows.c')
-rw-r--r--src/lib9/tempdir_windows.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/src/lib9/tempdir_windows.c b/src/lib9/tempdir_windows.c
new file mode 100644
index 000000000..1a530059a
--- /dev/null
+++ b/src/lib9/tempdir_windows.c
@@ -0,0 +1,110 @@
+// Copyright 2013 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+#include <u.h>
+#include <windows.h>
+#include <libc.h>
+#include "win.h"
+
+char*
+toutf(WinRune *r)
+{
+ Rune *r1;
+ int i, n;
+ char *p;
+
+ n = 0;
+ while(r[n] != '\0')
+ n++;
+ n++;
+ r1 = malloc(n*sizeof r1[0]);
+ for(i=0; i<n; i++)
+ r1[i] = r[i];
+ p = smprint("%S", r1);
+ free(r1);
+ return p;
+}
+
+WinRune*
+torune(char *p)
+{
+ int i, n;
+ Rune rr;
+ WinRune *r;
+
+ n = utflen(p);
+ r = malloc((n+1)*sizeof r[0]);
+ for(i=0; i<n; i++) {
+ p += chartorune(&rr, p);
+ r[i] = rr;
+ }
+ r[n] = '\0';
+ return r;
+}
+
+char*
+mktempdir(void)
+{
+ WinRune buf[1024];
+ WinRune tmp[MAX_PATH];
+ WinRune golink[] = {'g', 'o', 'l', 'i', 'n', 'k', '\0'};
+ int n;
+
+ n = GetTempPathW(nelem(buf), buf);
+ if(n <= 0)
+ return nil;
+ buf[n] = '\0';
+
+ if(GetTempFileNameW(buf, golink, 0, tmp) == 0)
+ return nil;
+ DeleteFileW(tmp);
+ if(!CreateDirectoryW(tmp, nil))
+ return nil;
+
+ return toutf(tmp);
+}
+
+void
+removeall(char *p)
+{
+ WinRune *r, *r1;
+ DWORD attr;
+ char *q, *elem;
+ HANDLE h;
+ WIN32_FIND_DATAW data;
+
+ r = torune(p);
+ attr = GetFileAttributesW(r);
+ if(attr == INVALID_FILE_ATTRIBUTES || !(attr & FILE_ATTRIBUTE_DIRECTORY)) {
+ DeleteFileW(r);
+ free(r);
+ return;
+ }
+
+ q = smprint("%s\\*", p);
+ r1 = torune(q);
+ free(q);
+ h = FindFirstFileW(r1, &data);
+ if(h == INVALID_HANDLE_VALUE)
+ goto done;
+ do{
+ q = toutf(data.cFileName);
+ elem = strrchr(q, '\\');
+ if(elem != nil) {
+ elem++;
+ if(strcmp(elem, ".") == 0 || strcmp(elem, "..") == 0) {
+ free(q);
+ continue;
+ }
+ }
+ removeall(q);
+ free(q);
+ }while(FindNextFileW(h, &data));
+ FindClose(h);
+
+done:
+ free(r1);
+ RemoveDirectoryW(r);
+ free(r);
+}