MCPcopy Create free account
hub / github.com/chainreactors/EvilProxy / writeFileAtomic

Function writeFileAtomic

internal/pluginstore/install.go:519–574  ·  view source on GitHub ↗
(targetPath string, data []byte, mode os.FileMode)

Source from the content-addressed store, hash-verified

517}
518
519func writeFileAtomic(targetPath string, data []byte, mode os.FileMode) error {
520 targetDir := filepath.Dir(targetPath)
521 if errMkdir := os.MkdirAll(targetDir, 0o755); errMkdir != nil {
522 return fmt.Errorf("create plugin directory: %w", errMkdir)
523 }
524
525 temp, errTemp := os.CreateTemp(targetDir, "."+filepath.Base(targetPath)+".tmp-*")
526 if errTemp != nil {
527 return fmt.Errorf("create temp plugin file: %w", errTemp)
528 }
529 tempPath := temp.Name()
530 removeTemp := true
531 closed := false
532 defer func() {
533 if !closed {
534 if errClose := temp.Close(); errClose != nil {
535 log.WithError(errClose).Debug("failed to close temp plugin file")
536 }
537 }
538 if removeTemp {
539 if errRemove := os.Remove(tempPath); errRemove != nil && !errors.Is(errRemove, os.ErrNotExist) {
540 log.WithError(errRemove).Debug("failed to remove temp plugin file")
541 }
542 }
543 }()
544
545 if errChmod := temp.Chmod(mode); errChmod != nil {
546 return fmt.Errorf("chmod temp plugin file: %w", errChmod)
547 }
548 if _, errWrite := temp.Write(data); errWrite != nil {
549 return fmt.Errorf("write temp plugin file: %w", errWrite)
550 }
551 if errSync := temp.Sync(); errSync != nil {
552 return fmt.Errorf("sync temp plugin file: %w", errSync)
553 }
554 if errClose := temp.Close(); errClose != nil {
555 return fmt.Errorf("close temp plugin file: %w", errClose)
556 }
557 closed = true
558 if errRename := os.Rename(tempPath, targetPath); errRename != nil {
559 if runtime.GOOS == "windows" {
560 if errRemove := os.Remove(targetPath); errRemove != nil && !errors.Is(errRemove, os.ErrNotExist) {
561 return fmt.Errorf("remove old plugin file: %w", errRemove)
562 }
563 if errRenameRetry := os.Rename(tempPath, targetPath); errRenameRetry == nil {
564 removeTemp = false
565 return nil
566 } else {
567 return fmt.Errorf("install plugin file: %w", errRenameRetry)
568 }
569 }
570 return fmt.Errorf("install plugin file: %w", errRename)
571 }
572 removeTemp = false
573 return nil
574}
575
576func loadedPluginInstallBlocked(options InstallOptions) bool {

Callers 1

InstallArchiveFunction · 0.85

Calls 4

RemoveMethod · 0.80
NameMethod · 0.65
CloseMethod · 0.65
WriteMethod · 0.45

Tested by

no test coverage detected