mirror of
https://github.com/opencontainers/runc.git
synced 2025-12-24 11:50:58 +08:00
1. Simplify mount call by removing the procfd argument, and use the new mount() where procfd is not used. Now, the mount() arguments are the same as for unix.Mount. 2. Introduce a new mountViaFDs function, which is similar to the old mount(), except it can take procfd for both source and target. The new arguments are called srcFD and dstFD. 3. Modify the mount error to show both srcFD and dstFD so it's clear which one is used for which purpose. This fixes the issue of having a somewhat cryptic errors like this: > mount /proc/self/fd/11:/sys/fs/cgroup/systemd (via /proc/self/fd/12), flags: 0x20502f: operation not permitted (in which fd 11 is actually the source, and fd 12 is the target). After this change, it looks like > mount src=/proc/self/fd/11, dst=/sys/fs/cgroup/systemd, dstFD=/proc/self/fd/12, flags=0x20502f: operation not permitted so it's clear that 12 is a destination fd. 4. Fix the mountViaFDs callers to use dstFD (rather than procfd) for the variable name. 5. Use srcFD where mountFd is set. Signed-off-by: Kir Kolyshkin <kolyshkin@gmail.com>
42 lines
917 B
Go
42 lines
917 B
Go
package libcontainer
|
|
|
|
import (
|
|
"os"
|
|
|
|
"golang.org/x/sys/unix"
|
|
)
|
|
|
|
// mount initializes the console inside the rootfs mounting with the specified mount label
|
|
// and applying the correct ownership of the console.
|
|
func mountConsole(slavePath string) error {
|
|
oldMask := unix.Umask(0o000)
|
|
defer unix.Umask(oldMask)
|
|
f, err := os.Create("/dev/console")
|
|
if err != nil && !os.IsExist(err) {
|
|
return err
|
|
}
|
|
if f != nil {
|
|
f.Close()
|
|
}
|
|
return mount(slavePath, "/dev/console", "bind", unix.MS_BIND, "")
|
|
}
|
|
|
|
// dupStdio opens the slavePath for the console and dups the fds to the current
|
|
// processes stdio, fd 0,1,2.
|
|
func dupStdio(slavePath string) error {
|
|
fd, err := unix.Open(slavePath, unix.O_RDWR, 0)
|
|
if err != nil {
|
|
return &os.PathError{
|
|
Op: "open",
|
|
Path: slavePath,
|
|
Err: err,
|
|
}
|
|
}
|
|
for _, i := range []int{0, 1, 2} {
|
|
if err := unix.Dup3(fd, i, 0); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|