const procMountInfoPath … type HostUtil … // NewHostUtil returns a struct that implements the HostUtils interface on // linux platforms func NewHostUtil() *HostUtil { … } // DeviceOpened checks if block device in use by calling Open with O_EXCL flag. // If pathname is not a device, log and return false with nil error. // If open returns errno EBUSY, return true with nil error. // If open returns nil, return false with nil error. // Otherwise, return false with error func (hu *HostUtil) DeviceOpened(pathname string) (bool, error) { … } // PathIsDevice uses FileInfo returned from os.Stat to check if path refers // to a device. func (hu *HostUtil) PathIsDevice(pathname string) (bool, error) { … } // ExclusiveOpenFailsOnDevice is shared with NsEnterMounter func ExclusiveOpenFailsOnDevice(pathname string) (bool, error) { … } // GetDeviceNameFromMount given a mount point, find the device name from its global mount point func (hu *HostUtil) GetDeviceNameFromMount(mounter mount.Interface, mountPath, pluginMountDir string) (string, error) { … } // getDeviceNameFromMount find the device name from /proc/self/mountinfo in which // the mount path reference should match the given plugin mount directory. In case no mount path reference // matches, returns the volume name taken from its given mountPath func getDeviceNameFromMount(mounter mount.Interface, mountPath, pluginMountDir string) (string, error) { … } // MakeRShared checks that given path is on a mount with 'rshared' mount // propagation. If not, it bind-mounts the path as rshared. func (hu *HostUtil) MakeRShared(path string) error { … } // GetFileType checks for file/directory/socket/block/character devices. func (hu *HostUtil) GetFileType(pathname string) (FileType, error) { … } // PathExists tests if the given path already exists // Error is returned on any other error than "file not found". func (hu *HostUtil) PathExists(pathname string) (bool, error) { … } // EvalHostSymlinks returns the path name after evaluating symlinks. // TODO once the nsenter implementation is removed, this method can be removed // from the interface and filepath.EvalSymlinks used directly func (hu *HostUtil) EvalHostSymlinks(pathname string) (string, error) { … } // FindMountInfo returns the mount info on the given path. func (hu *HostUtil) FindMountInfo(path string) (mount.MountInfo, error) { … } // isShared returns true, if given path is on a mount point that has shared // mount propagation. func isShared(mount string, mountInfoPath string) (bool, error) { … } func findMountInfo(path, mountInfoPath string) (mount.MountInfo, error) { … } // DoMakeRShared is common implementation of MakeRShared on Linux. It checks if // path is shared and bind-mounts it as rshared if needed. mountCmd and // mountArgs are expected to contain mount-like command, DoMakeRShared will add // '--bind <path> <path>' and '--make-rshared <path>' to mountArgs. func DoMakeRShared(path string, mountInfoFilename string) error { … } type seLinuxEnabledFunc … // GetSELinux is common implementation of GetSELinuxSupport on Linux. func GetSELinux(path string, mountInfoFilename string, selinuxEnabled seLinuxEnabledFunc) (bool, error) { … } // GetSELinuxSupport returns true if given path is on a mount that supports // SELinux. func (hu *HostUtil) GetSELinuxSupport(pathname string) (bool, error) { … } // GetOwner returns the integer ID for the user and group of the given path func (hu *HostUtil) GetOwner(pathname string) (int64, int64, error) { … } // GetMode returns permissions of the path. func (hu *HostUtil) GetMode(pathname string) (os.FileMode, error) { … } // GetOwnerLinux is shared between Linux and NsEnterMounter // pathname must already be evaluated for symlinks func GetOwnerLinux(pathname string) (int64, int64, error) { … } // GetModeLinux is shared between Linux and NsEnterMounter func GetModeLinux(pathname string) (os.FileMode, error) { … } // GetSELinuxMountContext returns value of -o context=XYZ mount option on // given mount point. func (hu *HostUtil) GetSELinuxMountContext(pathname string) (string, error) { … } // getSELinux is common implementation of GetSELinuxSupport on Linux. // Using an extra function for unit tests. func getSELinuxMountContext(path string, mountInfoFilename string, selinuxEnabled seLinuxEnabledFunc) (string, error) { … }