Skip to content

Commit 8dcbf48

Browse files
committed
windows root: add stat for '/'
1 parent d819242 commit 8dcbf48

File tree

3 files changed

+42
-2
lines changed

3 files changed

+42
-2
lines changed

server.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ func handlePacket(s *Server, p orderedRequest) error {
217217
}
218218
case *sshFxpLstatPacket:
219219
// stat the requested file
220-
info, err := os.Lstat(s.toLocalPath(p.Path))
220+
info, err := s.lstat(s.toLocalPath(p.Path))
221221
rpkt = &sshFxpStatResponse{
222222
ID: p.ID,
223223
info: info,
@@ -291,7 +291,7 @@ func handlePacket(s *Server, p orderedRequest) error {
291291
case *sshFxpOpendirPacket:
292292
lp := s.toLocalPath(p.Path)
293293

294-
if stat, err := os.Stat(lp); err != nil {
294+
if stat, err := s.stat(lp); err != nil {
295295
rpkt = statusFromError(p.ID, err)
296296
} else if !stat.IsDir() {
297297
rpkt = statusFromError(p.ID, &os.PathError{

server_posix.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,11 @@ import (
1111
func (s *Server) openfile(path string, flag int, mode fs.FileMode) (file, error) {
1212
return os.OpenFile(path, flag, mode)
1313
}
14+
15+
func (s *Server) lstat(name string) (os.FileInfo, error) {
16+
return os.Lstat(name)
17+
}
18+
19+
func (s *Server) stat(name string) (os.FileInfo, error) {
20+
return os.Stat(name)
21+
}

server_windows.go

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import (
77
"os"
88
"path"
99
"path/filepath"
10+
"time"
1011

1112
"golang.org/x/sys/windows"
1213
)
@@ -157,3 +158,34 @@ func (s *Server) openfile(path string, flag int, mode fs.FileMode) (file, error)
157158
}
158159
return os.OpenFile(path, flag, mode)
159160
}
161+
162+
type winRootFileInfo struct {
163+
fs.FileInfo
164+
name string
165+
}
166+
167+
func (w winRootFileInfo) Name() string { return w.name }
168+
func (w winRootFileInfo) Size() int64 { return 0 }
169+
func (w winRootFileInfo) Mode() fs.FileMode { return fs.ModeDir | 0555 } // read+execute for all
170+
func (w winRootFileInfo) ModTime() time.Time { return time.Time{} }
171+
func (w winRootFileInfo) IsDir() bool { return true }
172+
func (w winRootFileInfo) Sys() interface{} { return nil }
173+
174+
// Create a new root FileInfo
175+
var rootFileInfo = winRootFileInfo{
176+
name: "/",
177+
}
178+
179+
func (s *Server) lstat(name string) (os.FileInfo, error) {
180+
if name == `\\.\` && s.winRoot {
181+
return rootFileInfo, nil
182+
}
183+
return os.Lstat(name)
184+
}
185+
186+
func (s *Server) stat(name string) (os.FileInfo, error) {
187+
if name == `\\.\` && s.winRoot {
188+
return rootFileInfo, nil
189+
}
190+
return os.Stat(name)
191+
}

0 commit comments

Comments
 (0)