2013-03-06 13:48:28 -07:00
|
|
|
// 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;
|
2013-03-07 12:38:49 -07:00
|
|
|
Rune rr;
|
2013-03-06 13:48:28 -07:00
|
|
|
WinRune *r;
|
|
|
|
|
2013-03-07 12:38:49 -07:00
|
|
|
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';
|
2013-03-06 13:48:28 -07:00
|
|
|
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);
|
|
|
|
}
|