1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133
|
package smb2
import (
"errors"
"os"
"regexp"
"strings"
)
var NORMALIZE_PATH = true // normalize path arguments automatically
const PathSeparator = '\\'
func IsPathSeparator(c uint8) bool {
return c == '\\'
}
func base(path string) string {
j := len(path)
for j > 0 && IsPathSeparator(path[j-1]) {
j--
}
if j == 0 {
return ""
}
i := j - 1
for i > 0 && !IsPathSeparator(path[i-1]) {
i--
}
return path[i:j]
}
func dir(path string) string {
if path == "" {
return ""
}
i := len(path)
for i > 0 && IsPathSeparator(path[i-1]) {
i--
}
if i == 0 {
return "\\"
}
i--
for i > 0 && !IsPathSeparator(path[i-1]) {
i--
}
if i == 0 {
return ""
}
i--
for i > 0 && IsPathSeparator(path[i-1]) {
i--
}
if i == 0 {
return "\\"
}
return path[:i]
}
func validatePath(op string, path string, allowAbs bool) error {
if len(path) == 0 {
return nil
}
if !NORMALIZE_PATH {
if strings.ContainsRune(path, '/') {
return &os.PathError{Op: op, Path: path, Err: errors.New("can't use '/' as a path separator; use '\\' instead")}
}
}
if !allowAbs && path[0] == '\\' {
return &os.PathError{Op: op, Path: path, Err: errors.New("leading '\\' is not allowed in this operation")}
}
return nil
}
var mountPathPattern = regexp.MustCompile(`^\\\\[^\\/]+\\[^\\/]+$`)
func validateMountPath(path string) error {
if !mountPathPattern.MatchString(path) {
return &os.PathError{Op: "mount", Path: path, Err: errors.New(`mount path must be a valid share name (\\<server>\<share>)`)}
}
return nil
}
func normPath(path string) string {
if !NORMALIZE_PATH {
return path
}
path = strings.Replace(path, `/`, `\`, -1)
for strings.HasPrefix(path, `.\`) {
path = path[2:]
}
if path == "." {
return ""
}
return path
}
func normPattern(pattern string) string {
if !NORMALIZE_PATH {
return pattern
}
pattern = strings.Replace(pattern, `/`, `\`, -1)
for strings.HasPrefix(pattern, `.\`) {
pattern = pattern[2:]
}
return pattern
}
func join(elem ...string) string {
return normPath(strings.Join(elem, string(PathSeparator)))
}
func split(path string) (dir, file string) {
i := len(path) - 1
for i >= 0 && !IsPathSeparator(path[i]) {
i--
}
return path[:i+1], path[i+1:]
}
|