diff options
Diffstat (limited to 'internal/ctlsocksrv')
| -rw-r--r-- | internal/ctlsocksrv/ctlsock_listen.go | 35 | 
1 files changed, 35 insertions, 0 deletions
| diff --git a/internal/ctlsocksrv/ctlsock_listen.go b/internal/ctlsocksrv/ctlsock_listen.go index 1db9cbc..94ffca4 100644 --- a/internal/ctlsocksrv/ctlsock_listen.go +++ b/internal/ctlsocksrv/ctlsock_listen.go @@ -1,9 +1,44 @@  package ctlsocksrv  import ( +	"errors" +	"io/fs"  	"net" +	"os" +	"syscall" +	"time" + +	"github.com/rfjakob/gocryptfs/v2/internal/tlog"  ) +// cleanupOrphanedSocket deletes an orphaned socket file at `path`. +// The file at `path` will only be deleted if: +// 1) It is a socket file +// 2) Connecting to it results in ECONNREFUSED +func cleanupOrphanedSocket(path string) { +	fi, err := os.Stat(path) +	if err != nil { +		return +	} +	if fi.Mode().Type() != fs.ModeSocket { +		return +	} +	conn, err := net.DialTimeout("unix", path, time.Second) +	if err == nil { +		// This socket file is still active. Don't delete it. +		conn.Close() +		return +	} +	if errors.Is(err, syscall.ECONNREFUSED) { +		tlog.Info.Printf("ctlsock: deleting orphaned socket file %q\n", path) +		err = os.Remove(path) +		if err != nil { +			tlog.Warn.Printf("ctlsock: deleting socket file failed: %v", path) +		} +	} +} +  func Listen(path string) (net.Listener, error) { +	cleanupOrphanedSocket(path)  	return net.Listen("unix", path)  } | 
