diff options
author | Michael Stapelberg <michael@stapelberg.de> | 2013-03-23 11:28:53 +0100 |
---|---|---|
committer | Michael Stapelberg <michael@stapelberg.de> | 2013-03-23 11:28:53 +0100 |
commit | b39e15dde5ec7b96c15da9faf4ab5892501c1aae (patch) | |
tree | 718cede1f6ca97d082c6c40b7dc3f4f6148253c0 /src/lib9/tempdir_windows.c | |
parent | 04b08da9af0c450d645ab7389d1467308cfc2db8 (diff) | |
download | golang-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.c | 110 |
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); +} |