// 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, *qt, *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++; | |
else | |
elem = q; | |
if(strcmp(elem, ".") == 0 || strcmp(elem, "..") == 0) { | |
free(q); | |
continue; | |
} | |
qt = smprint("%s\\%s", p, q); | |
free(q); | |
removeall(qt); | |
free(qt); | |
}while(FindNextFileW(h, &data)); | |
FindClose(h); | |
done: | |
free(r1); | |
RemoveDirectoryW(r); | |
free(r); | |
} |