sys: synchronize mkdirall() with latest os.MkDirAll()
Signed-off-by: Sebastiaan van Stijn <github@gone.nl>
This commit is contained in:
		| @@ -67,11 +67,7 @@ func mkdirall(path string, perm *windows.SecurityAttributes) error { | |||||||
| 		if dir.IsDir() { | 		if dir.IsDir() { | ||||||
| 			return nil | 			return nil | ||||||
| 		} | 		} | ||||||
| 		return &os.PathError{ | 		return &os.PathError{Op: "mkdir", Path: path, Err: syscall.ENOTDIR} | ||||||
| 			Op:   "mkdir", |  | ||||||
| 			Path: path, |  | ||||||
| 			Err:  syscall.ENOTDIR, |  | ||||||
| 		} |  | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Slow path: make sure parent exists and then call Mkdir for path. | 	// Slow path: make sure parent exists and then call Mkdir for path. | ||||||
| @@ -86,14 +82,14 @@ func mkdirall(path string, perm *windows.SecurityAttributes) error { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	if j > 1 { | 	if j > 1 { | ||||||
| 		// Create parent | 		// Create parent. | ||||||
| 		err = mkdirall(path[0:j-1], perm) | 		err = mkdirall(fixRootDirectory(path[:j-1]), perm) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return err | 			return err | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// Parent now exists; invoke os.Mkdir or mkdirWithACL and use its result. | 	// Parent now exists; invoke Mkdir and use its result. | ||||||
| 	err = mkdirWithACL(path, perm) | 	err = mkdirWithACL(path, perm) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		// Handle arguments like "foo/." by | 		// Handle arguments like "foo/." by | ||||||
| @@ -131,6 +127,17 @@ func mkdirWithACL(name string, sa *windows.SecurityAttributes) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // fixRootDirectory fixes a reference to a drive's root directory to | ||||||
|  | // have the required trailing slash. | ||||||
|  | func fixRootDirectory(p string) string { | ||||||
|  | 	if len(p) == len(`\\?\c:`) { | ||||||
|  | 		if os.IsPathSeparator(p[0]) && os.IsPathSeparator(p[1]) && p[2] == '?' && os.IsPathSeparator(p[3]) && p[5] == ':' { | ||||||
|  | 			return p + `\` | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return p | ||||||
|  | } | ||||||
|  |  | ||||||
| func makeSecurityAttributes(sddl string) (*windows.SecurityAttributes, error) { | func makeSecurityAttributes(sddl string) (*windows.SecurityAttributes, error) { | ||||||
| 	var sa windows.SecurityAttributes | 	var sa windows.SecurityAttributes | ||||||
| 	sa.Length = uint32(unsafe.Sizeof(sa)) | 	sa.Length = uint32(unsafe.Sizeof(sa)) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Sebastiaan van Stijn
					Sebastiaan van Stijn