-
Notifications
You must be signed in to change notification settings - Fork 142
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
add mounts validation to runtimetest
Signed-off-by: liang chenye <liangchenye@huawei.com>
- Loading branch information
1 parent
923e88c
commit 43496a6
Showing
8 changed files
with
294 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
[code from](github.com/docker/docker/pkg/mount) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,45 @@ | ||
package mount | ||
|
||
// Info reveals information about a particular mounted filesystem. This | ||
// struct is populated from the content in the /proc/<pid>/mountinfo file. | ||
type Info struct { | ||
// ID is a unique identifier of the mount (may be reused after umount). | ||
ID int | ||
|
||
// Parent indicates the ID of the mount parent (or of self for the top of the | ||
// mount tree). | ||
Parent int | ||
|
||
// Major indicates one half of the device ID which identifies the device class. | ||
Major int | ||
|
||
// Minor indicates one half of the device ID which identifies a specific | ||
// instance of device. | ||
Minor int | ||
|
||
// Root of the mount within the filesystem. | ||
Root string | ||
|
||
// Mountpoint indicates the mount point relative to the process's root. | ||
Mountpoint string | ||
|
||
// Opts represents mount-specific options. | ||
Opts string | ||
|
||
// Optional represents optional fields. | ||
Optional string | ||
|
||
// Fstype indicates the type of filesystem, such as EXT3. | ||
Fstype string | ||
|
||
// Source indicates filesystem specific information or "none". | ||
Source string | ||
|
||
// VfsOpts represents per super block options. | ||
VfsOpts string | ||
} | ||
|
||
// GetMounts retrieves a list of mounts for the current running process. | ||
func GetMounts() ([]*Info, error) { | ||
return parseMountTable() | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,41 @@ | ||
package mount | ||
|
||
/* | ||
#include <sys/param.h> | ||
#include <sys/ucred.h> | ||
#include <sys/mount.h> | ||
*/ | ||
import "C" | ||
|
||
import ( | ||
"fmt" | ||
"reflect" | ||
"unsafe" | ||
) | ||
|
||
// Parse /proc/self/mountinfo because comparing Dev and ino does not work from | ||
// bind mounts. | ||
func parseMountTable() ([]*Info, error) { | ||
var rawEntries *C.struct_statfs | ||
|
||
count := int(C.getmntinfo(&rawEntries, C.MNT_WAIT)) | ||
if count == 0 { | ||
return nil, fmt.Errorf("Failed to call getmntinfo") | ||
} | ||
|
||
var entries []C.struct_statfs | ||
header := (*reflect.SliceHeader)(unsafe.Pointer(&entries)) | ||
header.Cap = count | ||
header.Len = count | ||
header.Data = uintptr(unsafe.Pointer(rawEntries)) | ||
|
||
var out []*Info | ||
for _, entry := range entries { | ||
var mountinfo Info | ||
mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0]) | ||
mountinfo.Source = C.GoString(&entry.f_mntfromname[0]) | ||
mountinfo.Fstype = C.GoString(&entry.f_fstypename[0]) | ||
out = append(out, &mountinfo) | ||
} | ||
return out, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,95 @@ | ||
// +build linux | ||
|
||
package mount | ||
|
||
import ( | ||
"bufio" | ||
"fmt" | ||
"io" | ||
"os" | ||
"strings" | ||
) | ||
|
||
const ( | ||
/* 36 35 98:0 /mnt1 /mnt2 rw,noatime master:1 - ext3 /dev/root rw,errors=continue | ||
(1)(2)(3) (4) (5) (6) (7) (8) (9) (10) (11) | ||
(1) mount ID: unique identifier of the mount (may be reused after umount) | ||
(2) parent ID: ID of parent (or of self for the top of the mount tree) | ||
(3) major:minor: value of st_dev for files on filesystem | ||
(4) root: root of the mount within the filesystem | ||
(5) mount point: mount point relative to the process's root | ||
(6) mount options: per mount options | ||
(7) optional fields: zero or more fields of the form "tag[:value]" | ||
(8) separator: marks the end of the optional fields | ||
(9) filesystem type: name of filesystem of the form "type[.subtype]" | ||
(10) mount source: filesystem specific information or "none" | ||
(11) super options: per super block options*/ | ||
mountinfoFormat = "%d %d %d:%d %s %s %s %s" | ||
) | ||
|
||
// Parse /proc/self/mountinfo because comparing Dev and ino does not work from | ||
// bind mounts | ||
func parseMountTable() ([]*Info, error) { | ||
f, err := os.Open("/proc/self/mountinfo") | ||
if err != nil { | ||
return nil, err | ||
} | ||
defer f.Close() | ||
|
||
return parseInfoFile(f) | ||
} | ||
|
||
func parseInfoFile(r io.Reader) ([]*Info, error) { | ||
var ( | ||
s = bufio.NewScanner(r) | ||
out = []*Info{} | ||
) | ||
|
||
for s.Scan() { | ||
if err := s.Err(); err != nil { | ||
return nil, err | ||
} | ||
|
||
var ( | ||
p = &Info{} | ||
text = s.Text() | ||
optionalFields string | ||
) | ||
|
||
if _, err := fmt.Sscanf(text, mountinfoFormat, | ||
&p.ID, &p.Parent, &p.Major, &p.Minor, | ||
&p.Root, &p.Mountpoint, &p.Opts, &optionalFields); err != nil { | ||
return nil, fmt.Errorf("Scanning '%s' failed: %s", text, err) | ||
} | ||
// Safe as mountinfo encodes mountpoints with spaces as \040. | ||
index := strings.Index(text, " - ") | ||
postSeparatorFields := strings.Fields(text[index+3:]) | ||
if len(postSeparatorFields) < 3 { | ||
return nil, fmt.Errorf("Error found less than 3 fields post '-' in %q", text) | ||
} | ||
|
||
if optionalFields != "-" { | ||
p.Optional = optionalFields | ||
} | ||
|
||
p.Fstype = postSeparatorFields[0] | ||
p.Source = postSeparatorFields[1] | ||
p.VfsOpts = strings.Join(postSeparatorFields[2:], " ") | ||
out = append(out, p) | ||
} | ||
return out, nil | ||
} | ||
|
||
// PidMountInfo collects the mounts for a specific process ID. If the process | ||
// ID is unknown, it is better to use `GetMounts` which will inspect | ||
// "/proc/self/mountinfo" instead. | ||
func PidMountInfo(pid int) ([]*Info, error) { | ||
f, err := os.Open(fmt.Sprintf("/proc/%d/mountinfo", pid)) | ||
if err != nil { | ||
return nil, err | ||
} | ||
defer f.Close() | ||
|
||
return parseInfoFile(f) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,37 @@ | ||
// +build solaris,cgo | ||
|
||
package mount | ||
|
||
/* | ||
#include <stdio.h> | ||
#include <sys/mnttab.h> | ||
*/ | ||
import "C" | ||
|
||
import ( | ||
"fmt" | ||
) | ||
|
||
func parseMountTable() ([]*Info, error) { | ||
mnttab := C.fopen(C.CString(C.MNTTAB), C.CString("r")) | ||
if mnttab == nil { | ||
return nil, fmt.Errorf("Failed to open %s", C.MNTTAB) | ||
} | ||
|
||
var out []*Info | ||
var mp C.struct_mnttab | ||
|
||
ret := C.getmntent(mnttab, &mp) | ||
for ret == 0 { | ||
var mountinfo Info | ||
mountinfo.Mountpoint = C.GoString(mp.mnt_mountp) | ||
mountinfo.Source = C.GoString(mp.mnt_special) | ||
mountinfo.Fstype = C.GoString(mp.mnt_fstype) | ||
mountinfo.Opts = C.GoString(mp.mnt_mntopts) | ||
out = append(out, &mountinfo) | ||
ret = C.getmntent(mnttab, &mp) | ||
} | ||
|
||
C.fclose(mnttab) | ||
return out, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,12 @@ | ||
// +build !windows,!linux,!freebsd,!solaris freebsd,!cgo solaris,!cgo | ||
|
||
package mount | ||
|
||
import ( | ||
"fmt" | ||
"runtime" | ||
) | ||
|
||
func parseMountTable() ([]*Info, error) { | ||
return nil, fmt.Errorf("mount.parseMountTable is not implemented on %s/%s", runtime.GOOS, runtime.GOARCH) | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,6 @@ | ||
package mount | ||
|
||
func parseMountTable() ([]*Info, error) { | ||
// Do NOT return an error! | ||
return nil, nil | ||
} |