github.com/minio/minio@v0.0.0-20240328213742-3f72439b8a27/internal/mountinfo/mountinfo_windows.go (about) 1 //go:build windows 2 // +build windows 3 4 // Copyright (c) 2015-2021 MinIO, Inc. 5 // 6 // This file is part of MinIO Object Storage stack 7 // 8 // This program is free software: you can redistribute it and/or modify 9 // it under the terms of the GNU Affero General Public License as published by 10 // the Free Software Foundation, either version 3 of the License, or 11 // (at your option) any later version. 12 // 13 // This program is distributed in the hope that it will be useful 14 // but WITHOUT ANY WARRANTY; without even the implied warranty of 15 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16 // GNU Affero General Public License for more details. 17 // 18 // You should have received a copy of the GNU Affero General Public License 19 // along with this program. If not, see <http://www.gnu.org/licenses/>. 20 21 package mountinfo 22 23 import ( 24 "path/filepath" 25 "sync" 26 27 "golang.org/x/sys/windows" 28 ) 29 30 // CheckCrossDevice - check if any input path has multiple sub-mounts. 31 // this is a dummy function and returns nil for now. 32 func CheckCrossDevice(paths []string) error { 33 return nil 34 } 35 36 // mountPointCache contains results of IsLikelyMountPoint 37 var mountPointCache sync.Map 38 39 // IsLikelyMountPoint determines if a directory is a mountpoint. 40 func IsLikelyMountPoint(path string) bool { 41 path = filepath.Dir(path) 42 if v, ok := mountPointCache.Load(path); ok { 43 return v.(bool) 44 } 45 wpath, _ := windows.UTF16PtrFromString(path) 46 wvolume := make([]uint16, len(path)+1) 47 48 if err := windows.GetVolumePathName(wpath, &wvolume[0], uint32(len(wvolume))); err != nil { 49 mountPointCache.Store(path, false) 50 return false 51 } 52 53 switch windows.GetDriveType(&wvolume[0]) { 54 case windows.DRIVE_FIXED, windows.DRIVE_REMOVABLE, windows.DRIVE_REMOTE, windows.DRIVE_RAMDISK: 55 // Recognize "fixed", "removable", "remote" and "ramdisk" drives as proper drives 56 // which can be treated as an actual mount-point, rest can be ignored. 57 // https://docs.microsoft.com/en-us/windows/desktop/api/fileapi/nf-fileapi-getdrivetypew 58 mountPointCache.Store(path, true) 59 return true 60 } 61 mountPointCache.Store(path, false) 62 return false 63 }