// 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 } }
func doMount(node *core.IpfsNode, fsdir, nsdir string) error { fmtFuseErr := func(err error) error { s := err.Error() if strings.Contains(s, fuseNoDirectory) { s = strings.Replace(s, `fusermount: "fusermount:`, "", -1) s = strings.Replace(s, `\n", exit status 1`, "", -1) return cmds.ClientError(s) } return err } // this sync stuff is so that both can be mounted simultaneously. var fsmount mount.Mount var nsmount mount.Mount var err1 error var err2 error done := make(chan struct{}) go func() { fsmount, err1 = rofs.Mount(node, fsdir) done <- struct{}{} }() go func() { nsmount, err2 = ipns.Mount(node, nsdir, fsdir) done <- struct{}{} }() <-done <-done if err1 != nil || err2 != nil { fsmount.Close() nsmount.Close() if err1 != nil { return fmtFuseErr(err1) } else { return fmtFuseErr(err2) } } // setup node state, so that it can be cancelled node.Mounts.Ipfs = fsmount node.Mounts.Ipns = nsmount return nil }
// 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 }