Clean up stale socket at startup, if present
authorGreg Hurrell <greg@hurrell.net>
Thu, 28 Dec 2017 20:54:48 +0000 (12:54 -0800)
committerGreg Hurrell <greg@hurrell.net>
Thu, 28 Dec 2017 20:57:10 +0000 (12:57 -0800)
CHANGELOG.md
README.md
passage.go

index 3e7d5d0be891a696d1300e25154a37d5ec61ca47..19d6b19265f25e578fc42cf424621114cc3928e5 100644 (file)
@@ -1,5 +1,9 @@
 # Passage changelog
 
+## master
+
+- Automatically clean up stale socket files at startup.
+
 ## 0.1 (8 December 2016)
 
 - Initial release.
index fbf1670901fd94f437910305abe8bf0d1d15dd64..e1bb5159a4e4181ba3f08945dcb7742732a50f17 100644 (file)
--- a/README.md
+++ b/README.md
@@ -99,10 +99,6 @@ The `~/.passage.sock` socket is created with user-only (`0700`) permissions, but
 
 ## Troubleshooting
 
-### If the launch agent fails to start
-
-Check for a stale `~/.passage.sock` file, which may have been left behind in the event of a system crash, and remove it.
-
 ## Limitations
 
 Passage uses the [keybase/go-keychain](https://github.com/keybase/go-keychain) library to access the keychain, which currently only knows how to read "generic" (A.K.A. "application") passwords, not "Internet" passwords.
index d5d06ebb568a9e62b5f66a90d503d3a190d4bb85..8e5aceb741b00892305b1e9e0442a9f41425e490 100644 (file)
@@ -25,6 +25,23 @@ var version = "unknown"
 func main() {
        resetCache()
        path := getSockPath()
+
+       // Check to see if there is a pre-existing or stale socket present.
+       if _, err := os.Stat(path); !os.IsNotExist(err) {
+               // Socket already exists.
+               if _, err = net.Dial("unix", path); err == nil {
+                       // Socket is live!
+                       log.Fatal("Live socket already exists at: " + path)
+               }
+
+               // Likely a stale socket left over after a crash.
+               log.Print("Dead socket found at: " + path + " (removing)")
+               if err = os.Remove(path); err != nil {
+                       log.Fatal(err)
+               }
+       }
+
+       // Start listening.
        syscall.Umask(0077)
        listener, err := net.Listen("unix", path)
        if err != nil {