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  }