github.com/roboticscm/goman@v0.0.0-20210203095141-87c07b4a0a55/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, *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 109 done: 110 free(r1); 111 RemoveDirectoryW(r); 112 free(r); 113 }