github.com/ader1990/go@v0.0.0-20140630135419-8c24447fa791/src/lib9/tempdir_windows.c (about) 1 // 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 10 char* 11 toutf(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 29 WinRune* 30 torune(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 46 char* 47 mktempdir(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 68 void 69 removeall(char *p) 70 { 71 WinRune *r, *r1; 72 DWORD attr; 73 char *q, *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 if(strcmp(elem, ".") == 0 || strcmp(elem, "..") == 0) { 97 free(q); 98 continue; 99 } 100 } 101 removeall(q); 102 free(q); 103 }while(FindNextFileW(h, &data)); 104 FindClose(h); 105 106 done: 107 free(r1); 108 RemoveDirectoryW(r); 109 free(r); 110 }