fix incompatible file type checking on Windows
This commit is contained in:
parent
a5c3c8d16c
commit
9c7604fe10
@ -19,6 +19,7 @@ limitations under the License.
|
|||||||
package mount
|
package mount
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
"strings"
|
||||||
@ -337,3 +338,37 @@ func startsWithBackstep(rel string) bool {
|
|||||||
// normalize to / and check for ../
|
// normalize to / and check for ../
|
||||||
return rel == ".." || strings.HasPrefix(filepath.ToSlash(rel), "../")
|
return rel == ".." || strings.HasPrefix(filepath.ToSlash(rel), "../")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// getFileType checks for file/directory/socket and block/character devices
|
||||||
|
func getFileType(pathname string) (FileType, error) {
|
||||||
|
var pathType FileType
|
||||||
|
info, err := os.Stat(pathname)
|
||||||
|
if os.IsNotExist(err) {
|
||||||
|
return pathType, fmt.Errorf("path %q does not exist", pathname)
|
||||||
|
}
|
||||||
|
// err in call to os.Stat
|
||||||
|
if err != nil {
|
||||||
|
return pathType, err
|
||||||
|
}
|
||||||
|
|
||||||
|
// checks whether the mode is the target mode
|
||||||
|
isSpecificMode := func(mode, targetMode os.FileMode) bool {
|
||||||
|
return mode&targetMode == targetMode
|
||||||
|
}
|
||||||
|
|
||||||
|
mode := info.Mode()
|
||||||
|
if mode.IsDir() {
|
||||||
|
return FileTypeDirectory, nil
|
||||||
|
} else if mode.IsRegular() {
|
||||||
|
return FileTypeFile, nil
|
||||||
|
} else if isSpecificMode(mode, os.ModeSocket) {
|
||||||
|
return FileTypeSocket, nil
|
||||||
|
} else if isSpecificMode(mode, os.ModeDevice) {
|
||||||
|
if isSpecificMode(mode, os.ModeCharDevice) {
|
||||||
|
return FileTypeCharDev, nil
|
||||||
|
}
|
||||||
|
return FileTypeBlockDev, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
return pathType, fmt.Errorf("only recognise file, directory, socket, block device and character device")
|
||||||
|
}
|
||||||
|
@ -423,31 +423,7 @@ func (mounter *Mounter) MakeRShared(path string) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (mounter *Mounter) GetFileType(pathname string) (FileType, error) {
|
func (mounter *Mounter) GetFileType(pathname string) (FileType, error) {
|
||||||
var pathType FileType
|
return getFileType(pathname)
|
||||||
finfo, err := os.Stat(pathname)
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return pathType, fmt.Errorf("path %q does not exist", pathname)
|
|
||||||
}
|
|
||||||
// err in call to os.Stat
|
|
||||||
if err != nil {
|
|
||||||
return pathType, err
|
|
||||||
}
|
|
||||||
|
|
||||||
mode := finfo.Sys().(*syscall.Stat_t).Mode
|
|
||||||
switch mode & syscall.S_IFMT {
|
|
||||||
case syscall.S_IFSOCK:
|
|
||||||
return FileTypeSocket, nil
|
|
||||||
case syscall.S_IFBLK:
|
|
||||||
return FileTypeBlockDev, nil
|
|
||||||
case syscall.S_IFCHR:
|
|
||||||
return FileTypeCharDev, nil
|
|
||||||
case syscall.S_IFDIR:
|
|
||||||
return FileTypeDirectory, nil
|
|
||||||
case syscall.S_IFREG:
|
|
||||||
return FileTypeFile, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return pathType, fmt.Errorf("only recognise file, directory, socket, block device and character device")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (mounter *Mounter) MakeDir(pathname string) error {
|
func (mounter *Mounter) MakeDir(pathname string) error {
|
||||||
|
@ -201,31 +201,7 @@ func (mounter *Mounter) MakeRShared(path string) error {
|
|||||||
|
|
||||||
// GetFileType checks for sockets/block/character devices
|
// GetFileType checks for sockets/block/character devices
|
||||||
func (mounter *Mounter) GetFileType(pathname string) (FileType, error) {
|
func (mounter *Mounter) GetFileType(pathname string) (FileType, error) {
|
||||||
var pathType FileType
|
return getFileType(pathname)
|
||||||
info, err := os.Stat(pathname)
|
|
||||||
if os.IsNotExist(err) {
|
|
||||||
return pathType, fmt.Errorf("path %q does not exist", pathname)
|
|
||||||
}
|
|
||||||
// err in call to os.Stat
|
|
||||||
if err != nil {
|
|
||||||
return pathType, err
|
|
||||||
}
|
|
||||||
|
|
||||||
mode := info.Sys().(*syscall.Win32FileAttributeData).FileAttributes
|
|
||||||
switch mode & syscall.S_IFMT {
|
|
||||||
case syscall.S_IFSOCK:
|
|
||||||
return FileTypeSocket, nil
|
|
||||||
case syscall.S_IFBLK:
|
|
||||||
return FileTypeBlockDev, nil
|
|
||||||
case syscall.S_IFCHR:
|
|
||||||
return FileTypeCharDev, nil
|
|
||||||
case syscall.S_IFDIR:
|
|
||||||
return FileTypeDirectory, nil
|
|
||||||
case syscall.S_IFREG:
|
|
||||||
return FileTypeFile, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
return pathType, fmt.Errorf("only recognise file, directory, socket, block device and character device")
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// MakeFile creates a new directory
|
// MakeFile creates a new directory
|
||||||
|
Loading…
Reference in New Issue
Block a user