aboutsummaryrefslogtreecommitdiff
path: root/internal
diff options
context:
space:
mode:
Diffstat (limited to 'internal')
-rw-r--r--internal/ctlsocksrv/ctlsock_listen.go35
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)
}