root/src/lib9/tempdir_windows.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. toutf
  2. torune
  3. mktempdir
  4. removeall

// 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, *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);
}

/* [<][>][^][v][top][bottom][index][help] */