summaryrefslogtreecommitdiff
path: root/main.go
diff options
context:
space:
mode:
authorJakob Unterwurzacher2015-11-01 13:28:58 +0100
committerJakob Unterwurzacher2015-11-01 13:28:58 +0100
commitaf923d2d16e0eedc7d2c203e28a42b6af49a51f5 (patch)
tree62d8e28fd768c779047fe9c71f87b6b858caaeeb /main.go
parente31d319c399e619e4dec2f71782f1412a46f2d36 (diff)
Automatically lazy-unmount when we get SIGINT or SIGTERM
This hides the dangling "Transport endpoint is not connected" mountpoint for everyone but processes that have file open inside the mountpoint.
Diffstat (limited to 'main.go')
-rw-r--r--main.go34
1 files changed, 31 insertions, 3 deletions
diff --git a/main.go b/main.go
index 07d8e64..a3e40b0 100644
--- a/main.go
+++ b/main.go
@@ -4,9 +4,12 @@ import (
"flag"
"fmt"
"os"
+ "os/exec"
+ "os/signal"
"path/filepath"
"runtime"
"runtime/pprof"
+ "syscall"
"time"
"github.com/rfjakob/gocryptfs/cryptfs"
@@ -188,10 +191,16 @@ func main() {
}
fmt.Println("Filesystem ready.")
- // Send notification to our parent
- sendUsr1()
- // Jump into server loop
+ if !foreground {
+ // Send notification to our parent
+ sendUsr1()
+ }
+ // Wait for SIGING in the background and unmount ourselves if we get it
+ // This prevents a dangling "Transport endpoint is not connected" mountpoint
+ handleSigint(srv, mountpoint)
+ // Jump into server loop. Returns when it gets an umount request from the kernel.
srv.Serve()
+ // main returns with code 0
}
func pathfsFrontend(key []byte, cipherdir string, mountpoint string, debug bool, openssl bool) *fuse.Server {
@@ -224,3 +233,22 @@ func pathfsFrontend(key []byte, cipherdir string, mountpoint string, debug bool,
return srv
}
+
+func handleSigint(srv *fuse.Server, mountpoint string) {
+ ch := make(chan os.Signal, 1)
+ signal.Notify(ch, os.Interrupt)
+ signal.Notify(ch, syscall.SIGTERM)
+ go func() {
+ <-ch
+ err := srv.Unmount()
+ if err != nil {
+ fmt.Print(err)
+ fmt.Printf("Trying lazy unmount\n")
+ cmd := exec.Command("fusermount", "-u", "-z", mountpoint)
+ cmd.Stdout = os.Stdout
+ cmd.Stderr = os.Stderr
+ cmd.Run()
+ }
+ os.Exit(1)
+ }()
+}