diff options
| author | Ophestra <cat@gensokyo.uk> | 2025-07-03 02:59:43 +0900 |
|---|---|---|
| committer | Ophestra <cat@gensokyo.uk> | 2025-07-03 02:59:43 +0900 |
| commit | 1b5ecd9eaf3289d164d8ed1bce6013e0e4ef8e86 (patch) | |
| tree | 047fe5fabdfb37d5c0088f7f572cebc8b13853bb /mount.go | |
| parent | 82561d62b66f17c05604e87f18187bb3a91f00d2 (diff) | |
container: move out of toplevel
This allows slightly easier use of the vanity url. This also provides some disambiguation between low level containers and hakurei app containers.
Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'mount.go')
| -rw-r--r-- | mount.go | 123 |
1 files changed, 0 insertions, 123 deletions
diff --git a/mount.go b/mount.go deleted file mode 100644 index 44e1d9cc..00000000 --- a/mount.go +++ /dev/null @@ -1,123 +0,0 @@ -package hakurei - -import ( - "errors" - "fmt" - "os" - "path/filepath" - . "syscall" - - "git.gensokyo.uk/security/hakurei/vfs" -) - -func (p *procPaths) bindMount(source, target string, flags uintptr, eq bool) error { - if eq { - msg.Verbosef("resolved %q flags %#x", target, flags) - } else { - msg.Verbosef("resolved %q on %q flags %#x", source, target, flags) - } - - if err := Mount(source, target, "", MS_SILENT|MS_BIND|flags&MS_REC, ""); err != nil { - return wrapErrSuffix(err, - fmt.Sprintf("cannot mount %q on %q:", source, target)) - } - - var targetFinal string - if v, err := filepath.EvalSymlinks(target); err != nil { - return wrapErrSelf(err) - } else { - targetFinal = v - if targetFinal != target { - msg.Verbosef("target resolves to %q", targetFinal) - } - } - - // final target path according to the kernel through proc - var targetKFinal string - { - var destFd int - if err := IgnoringEINTR(func() (err error) { - destFd, err = Open(targetFinal, O_PATH|O_CLOEXEC, 0) - return - }); err != nil { - return wrapErrSuffix(err, - fmt.Sprintf("cannot open %q:", targetFinal)) - } - if v, err := os.Readlink(p.fd(destFd)); err != nil { - return wrapErrSelf(err) - } else if err = Close(destFd); err != nil { - return wrapErrSuffix(err, - fmt.Sprintf("cannot close %q:", targetFinal)) - } else { - targetKFinal = v - } - } - - mf := MS_NOSUID | flags&MS_NODEV | flags&MS_RDONLY - return hostProc.mountinfo(func(d *vfs.MountInfoDecoder) error { - n, err := d.Unfold(targetKFinal) - if err != nil { - if errors.Is(err, ESTALE) { - return msg.WrapErr(err, - fmt.Sprintf("mount point %q never appeared in mountinfo", targetKFinal)) - } - return wrapErrSuffix(err, - "cannot unfold mount hierarchy:") - } - - if err = remountWithFlags(n, mf); err != nil { - return err - } - if flags&MS_REC == 0 { - return nil - } - - for cur := range n.Collective() { - err = remountWithFlags(cur, mf) - if err != nil && !errors.Is(err, EACCES) { - return err - } - } - - return nil - }) -} - -func remountWithFlags(n *vfs.MountInfoNode, mf uintptr) error { - kf, unmatched := n.Flags() - if len(unmatched) != 0 { - msg.Verbosef("unmatched vfs options: %q", unmatched) - } - - if kf&mf != mf { - return wrapErrSuffix( - Mount("none", n.Clean, "", MS_SILENT|MS_BIND|MS_REMOUNT|kf|mf, ""), - fmt.Sprintf("cannot remount %q:", n.Clean)) - } - return nil -} - -func mountTmpfs(fsname, name string, size int, perm os.FileMode) error { - target := toSysroot(name) - if err := os.MkdirAll(target, parentPerm(perm)); err != nil { - return wrapErrSelf(err) - } - opt := fmt.Sprintf("mode=%#o", perm) - if size > 0 { - opt += fmt.Sprintf(",size=%d", size) - } - return wrapErrSuffix( - Mount(fsname, target, "tmpfs", MS_NOSUID|MS_NODEV, opt), - fmt.Sprintf("cannot mount tmpfs on %q:", name)) -} - -func parentPerm(perm os.FileMode) os.FileMode { - pperm := 0755 - if perm&0070 == 0 { - pperm &= ^0050 - } - if perm&0007 == 0 { - pperm &= ^0005 - } - return os.FileMode(pperm) -} |
