github.com/MangoDowner/go-gm@v0.0.0-20180818020936-8baa2bd4408c/src/internal/testenv/testenv_windows.go (about)

     1  // Copyright 2016 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  package testenv
     6  
     7  import (
     8  	"io/ioutil"
     9  	"os"
    10  	"path/filepath"
    11  	"sync"
    12  	"syscall"
    13  )
    14  
    15  var symlinkOnce sync.Once
    16  var winSymlinkErr error
    17  
    18  func initWinHasSymlink() {
    19  	tmpdir, err := ioutil.TempDir("", "symtest")
    20  	if err != nil {
    21  		panic("failed to create temp directory: " + err.Error())
    22  	}
    23  	defer os.RemoveAll(tmpdir)
    24  
    25  	err = os.Symlink("target", filepath.Join(tmpdir, "symlink"))
    26  	if err != nil {
    27  		err = err.(*os.LinkError).Err
    28  		switch err {
    29  		case syscall.EWINDOWS, syscall.ERROR_PRIVILEGE_NOT_HELD:
    30  			winSymlinkErr = err
    31  		}
    32  	}
    33  }
    34  
    35  func hasSymlink() (ok bool, reason string) {
    36  	symlinkOnce.Do(initWinHasSymlink)
    37  
    38  	switch winSymlinkErr {
    39  	case nil:
    40  		return true, ""
    41  	case syscall.EWINDOWS:
    42  		return false, ": symlinks are not supported on your version of Windows"
    43  	case syscall.ERROR_PRIVILEGE_NOT_HELD:
    44  		return false, ": you don't have enough privileges to create symlinks"
    45  	}
    46  
    47  	return false, ""
    48  }