mirror of
				https://github.com/k3s-io/kubernetes.git
				synced 2025-10-31 13:50:01 +00:00 
			
		
		
		
	Main upgrades: - github.com/opencontainers/runc v1.0.0-rc93 - github.com/containerd/containerd v1.4.4 - github.com/docker/docker v20.10.2 - github.com/mrunalp/fileutils v0.5.0 - github.com/opencontainers/selinux v1.8.0 - github.com/cilium/ebpf v0.2.0
		
			
				
	
	
		
			68 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| // +build freebsd,cgo openbsd,cgo
 | |
| 
 | |
| package mountinfo
 | |
| 
 | |
| /*
 | |
| #include <sys/param.h>
 | |
| #include <sys/ucred.h>
 | |
| #include <sys/mount.h>
 | |
| */
 | |
| import "C"
 | |
| 
 | |
| import (
 | |
| 	"fmt"
 | |
| 	"reflect"
 | |
| 	"unsafe"
 | |
| )
 | |
| 
 | |
| // parseMountTable returns information about mounted filesystems
 | |
| func parseMountTable(filter FilterFunc) ([]*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
 | |
| 		var skip, stop bool
 | |
| 		mountinfo.Mountpoint = C.GoString(&entry.f_mntonname[0])
 | |
| 		mountinfo.FSType = C.GoString(&entry.f_fstypename[0])
 | |
| 		mountinfo.Source = C.GoString(&entry.f_mntfromname[0])
 | |
| 
 | |
| 		if filter != nil {
 | |
| 			// filter out entries we're not interested in
 | |
| 			skip, stop = filter(&mountinfo)
 | |
| 			if skip {
 | |
| 				continue
 | |
| 			}
 | |
| 		}
 | |
| 
 | |
| 		out = append(out, &mountinfo)
 | |
| 		if stop {
 | |
| 			break
 | |
| 		}
 | |
| 	}
 | |
| 	return out, nil
 | |
| }
 | |
| 
 | |
| func mounted(path string) (bool, error) {
 | |
| 	// Fast path: compare st.st_dev fields.
 | |
| 	// This should always work for FreeBSD and OpenBSD.
 | |
| 	mounted, err := mountedByStat(path)
 | |
| 	if err == nil {
 | |
| 		return mounted, nil
 | |
| 	}
 | |
| 
 | |
| 	// Fallback to parsing mountinfo
 | |
| 	return mountedByMountinfo(path)
 | |
| }
 |