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  }