// unmount attempts to unmount the provided FUSE mount point, forcibly // if necessary. func internalUnmount(m mount.Mount) error { point := m.MountPoint() log.Infof("Unmounting ipns at %s...", point) var cmd *exec.Cmd switch runtime.GOOS { case "darwin": cmd = exec.Command("diskutil", "umount", "force", point) case "linux": cmd = exec.Command("fusermount", "-u", point) default: return fmt.Errorf("unmount: unimplemented") } errc := make(chan error, 1) go func() { if err := exec.Command("umount", point).Run(); err == nil { errc <- err } // retry to unmount with the fallback cmd errc <- cmd.Run() }() select { case <-time.After(1 * time.Second): return fmt.Errorf("umount timeout") case err := <-errc: return err } }
// mount attempts to mount the provided FUSE mount point func internalMount(ipfs *core.IpfsNode, m mount.Mount) error { c, err := fuse.Mount(m.MountPoint()) if err != nil { return err } defer c.Close() fsys := FileSystem{Ipfs: ipfs} log.Infof("Mounted ipfs at %s.", m.MountPoint()) if err := fs.Serve(c, fsys); err != nil { return err } // check if the mount process has an error to report <-c.Ready if err := c.MountError; err != nil { m.Unmount() return err } return nil }