blob: 4c3df7cf11ac5d76d263771edab00a510eab39b7 [file] [log] [blame]
Colin Cross7bb052a2015-02-03 12:59:37 -08001// Copyright 2013 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5#include <u.h>
6#include <windows.h>
7#include <libc.h>
8#include "win.h"
9
10char*
11toutf(WinRune *r)
12{
13 Rune *r1;
14 int i, n;
15 char *p;
16
17 n = 0;
18 while(r[n] != '\0')
19 n++;
20 n++;
21 r1 = malloc(n*sizeof r1[0]);
22 for(i=0; i<n; i++)
23 r1[i] = r[i];
24 p = smprint("%S", r1);
25 free(r1);
26 return p;
27}
28
29WinRune*
30torune(char *p)
31{
32 int i, n;
33 Rune rr;
34 WinRune *r;
35
36 n = utflen(p);
37 r = malloc((n+1)*sizeof r[0]);
38 for(i=0; i<n; i++) {
39 p += chartorune(&rr, p);
40 r[i] = rr;
41 }
42 r[n] = '\0';
43 return r;
44}
45
46char*
47mktempdir(void)
48{
49 WinRune buf[1024];
50 WinRune tmp[MAX_PATH];
51 WinRune golink[] = {'g', 'o', 'l', 'i', 'n', 'k', '\0'};
52 int n;
53
54 n = GetTempPathW(nelem(buf), buf);
55 if(n <= 0)
56 return nil;
57 buf[n] = '\0';
58
59 if(GetTempFileNameW(buf, golink, 0, tmp) == 0)
60 return nil;
61 DeleteFileW(tmp);
62 if(!CreateDirectoryW(tmp, nil))
63 return nil;
64
65 return toutf(tmp);
66}
67
68void
69removeall(char *p)
70{
71 WinRune *r, *r1;
72 DWORD attr;
73 char *q, *qt, *elem;
74 HANDLE h;
75 WIN32_FIND_DATAW data;
76
77 r = torune(p);
78 attr = GetFileAttributesW(r);
79 if(attr == INVALID_FILE_ATTRIBUTES || !(attr & FILE_ATTRIBUTE_DIRECTORY)) {
80 DeleteFileW(r);
81 free(r);
82 return;
83 }
84
85 q = smprint("%s\\*", p);
86 r1 = torune(q);
87 free(q);
88 h = FindFirstFileW(r1, &data);
89 if(h == INVALID_HANDLE_VALUE)
90 goto done;
91 do{
92 q = toutf(data.cFileName);
93 elem = strrchr(q, '\\');
94 if(elem != nil)
95 elem++;
96 else
97 elem = q;
98 if(strcmp(elem, ".") == 0 || strcmp(elem, "..") == 0) {
99 free(q);
100 continue;
101 }
102 qt = smprint("%s\\%s", p, q);
103 free(q);
104 removeall(qt);
105 free(qt);
106 }while(FindNextFileW(h, &data));
107 FindClose(h);
108
109done:
110 free(r1);
111 RemoveDirectoryW(r);
112 free(r);
113}