github.com/telepresenceio/telepresence/v2@v2.20.0-pro.6.0.20240517030216-236ea954e789/pkg/dos/lockedfile.go (about) 1 package dos 2 3 import ( 4 "context" 5 "io/fs" 6 "os" 7 8 "github.com/rogpeppe/go-internal/lockedfile" 9 ) 10 11 type lockedFs struct { 12 osFs 13 } 14 15 func WithLockedFs(ctx context.Context) context.Context { 16 return WithFS(ctx, &lockedFs{osFs: newOS(ctx)}) 17 } 18 19 func (fs *lockedFs) Create(name string) (File, error) { 20 f, err := lockedfile.Create(name) 21 if err != nil { 22 // It's important to return a File nil here, not a File that represents an *os.File nil. 23 return nil, err 24 } 25 return fs.chownFile(f) 26 } 27 28 func (*lockedFs) Open(name string) (File, error) { 29 f, err := lockedfile.Open(name) 30 if err != nil { 31 // It's important to return a File nil here, not a File that represents an *os.File nil. 32 return nil, err 33 } 34 return f, nil 35 } 36 37 func (fs *lockedFs) OpenFile(name string, flag int, perm fs.FileMode) (File, error) { 38 if fs.mustChown() { 39 if (flag & os.O_CREATE) == os.O_CREATE { 40 if _, err := os.Stat(name); os.IsNotExist(err) { 41 f, err := lockedfile.OpenFile(name, flag, perm) 42 if err != nil { 43 return nil, err 44 } 45 return fs.chownFile(f) 46 } 47 } 48 } 49 f, err := lockedfile.OpenFile(name, flag, perm) 50 if err != nil { 51 // It's important to return a File nil here, not a File that represents an *os.File nil. 52 return nil, err 53 } 54 return f, nil 55 }