github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/dos/wdwrapper.go (about) 1 package dos 2 3 import ( 4 "errors" 5 "io/fs" 6 "path/filepath" 7 ) 8 9 type wdWrapper struct { 10 base FileSystem 11 wd string 12 } 13 14 func WorkingDirWrapper(f FileSystem) FileSystem { 15 return &wdWrapper{base: f, wd: "/"} 16 } 17 18 func (w *wdWrapper) basePath(path string) string { 19 if filepath.IsAbs(path) { 20 return path 21 } 22 return filepath.Clean(filepath.Join(w.wd, path)) 23 } 24 25 func (w *wdWrapper) Abs(name string) (string, error) { 26 return w.basePath(name), nil 27 } 28 29 func (w *wdWrapper) Chdir(path string) error { 30 path = w.basePath(path) 31 if s, err := w.base.Stat(path); err != nil { 32 return err 33 } else if !s.IsDir() { 34 return errors.New("not a directory") 35 } 36 w.wd = path 37 return nil 38 } 39 40 func (w *wdWrapper) Create(name string) (File, error) { 41 return w.base.Create(w.basePath(name)) 42 } 43 44 func (w *wdWrapper) Getwd() (string, error) { 45 return w.wd, nil 46 } 47 48 func (w *wdWrapper) Mkdir(name string, perm fs.FileMode) error { 49 return w.base.Mkdir(w.basePath(name), perm) 50 } 51 52 func (w *wdWrapper) MkdirAll(name string, perm fs.FileMode) error { 53 return w.base.MkdirAll(w.basePath(name), perm) 54 } 55 56 func (w *wdWrapper) Open(name string) (File, error) { 57 return w.base.Open(w.basePath(name)) 58 } 59 60 func (w *wdWrapper) OpenFile(name string, flag int, perm fs.FileMode) (File, error) { 61 return w.base.OpenFile(w.basePath(name), flag, perm) 62 } 63 64 func (w *wdWrapper) ReadDir(name string) ([]fs.DirEntry, error) { 65 return w.base.ReadDir(w.basePath(name)) 66 } 67 68 func (w *wdWrapper) ReadFile(name string) ([]byte, error) { 69 return w.base.ReadFile(w.basePath(name)) 70 } 71 72 func (w *wdWrapper) RealPath(name string) (string, error) { 73 return w.base.RealPath(w.basePath(name)) 74 } 75 76 func (w *wdWrapper) Remove(name string) error { 77 return w.base.Remove(w.basePath(name)) 78 } 79 80 func (w *wdWrapper) RemoveAll(name string) error { 81 return w.base.RemoveAll(w.basePath(name)) 82 } 83 84 func (w *wdWrapper) Rename(oldName, newName string) error { 85 return w.base.Rename(w.basePath(oldName), w.basePath(newName)) 86 } 87 88 func (w *wdWrapper) Stat(name string) (fs.FileInfo, error) { 89 return w.base.Stat(w.basePath(name)) 90 } 91 92 func (w *wdWrapper) Symlink(oldName, newName string) error { 93 return w.base.Symlink(w.basePath(oldName), w.basePath(newName)) 94 } 95 96 func (w *wdWrapper) WriteFile(name string, data []byte, perm fs.FileMode) error { 97 return w.base.WriteFile(w.basePath(name), data, perm) 98 }