mirror of https://github.com/docker/docs.git
				
				
				
			
		
			
				
	
	
		
			68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			68 lines
		
	
	
		
			1.6 KiB
		
	
	
	
		
			Go
		
	
	
	
| package mount
 | |
| 
 | |
| import (
 | |
| 	"time"
 | |
| )
 | |
| 
 | |
| func GetMounts() ([]*MountInfo, error) {
 | |
| 	return parseMountTable()
 | |
| }
 | |
| 
 | |
| // Looks at /proc/self/mountinfo to determine of the specified
 | |
| // mountpoint has been mounted
 | |
| func Mounted(mountpoint string) (bool, error) {
 | |
| 	entries, err := parseMountTable()
 | |
| 	if err != nil {
 | |
| 		return false, err
 | |
| 	}
 | |
| 
 | |
| 	// Search the table for the mountpoint
 | |
| 	for _, e := range entries {
 | |
| 		if e.Mountpoint == mountpoint {
 | |
| 			return true, nil
 | |
| 		}
 | |
| 	}
 | |
| 	return false, nil
 | |
| }
 | |
| 
 | |
| // Mount the specified options at the target path only if
 | |
| // the target is not mounted
 | |
| // Options must be specified as fstab style
 | |
| func Mount(device, target, mType, options string) error {
 | |
| 	if mounted, err := Mounted(target); err != nil || mounted {
 | |
| 		return err
 | |
| 	}
 | |
| 	return ForceMount(device, target, mType, options)
 | |
| }
 | |
| 
 | |
| // Mount the specified options at the target path
 | |
| // reguardless if the target is mounted or not
 | |
| // Options must be specified as fstab style
 | |
| func ForceMount(device, target, mType, options string) error {
 | |
| 	flag, data := parseOptions(options)
 | |
| 	if err := mount(device, target, mType, uintptr(flag), data); err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| // Unmount the target only if it is mounted
 | |
| func Unmount(target string) error {
 | |
| 	if mounted, err := Mounted(target); err != nil || !mounted {
 | |
| 		return err
 | |
| 	}
 | |
| 	return ForceUnmount(target)
 | |
| }
 | |
| 
 | |
| // Unmount the target reguardless if it is mounted or not
 | |
| func ForceUnmount(target string) (err error) {
 | |
| 	// Simple retry logic for unmount
 | |
| 	for i := 0; i < 10; i++ {
 | |
| 		if err = unmount(target, 0); err == nil {
 | |
| 			return nil
 | |
| 		}
 | |
| 		time.Sleep(100 * time.Millisecond)
 | |
| 	}
 | |
| 	return
 | |
| }
 |