mirror of
				https://github.com/containers/podman.git
				synced 2025-11-04 17:07:20 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			64 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			64 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
//go:build !remote
 | 
						|
 | 
						|
package generate
 | 
						|
 | 
						|
import (
 | 
						|
	"fmt"
 | 
						|
	"strings"
 | 
						|
)
 | 
						|
 | 
						|
// ParseDevice parses device mapping string to a src, dest & permissions string
 | 
						|
func ParseDevice(device string) (string, string, string, error) {
 | 
						|
	var src string
 | 
						|
	var dst string
 | 
						|
	permissions := "rwm"
 | 
						|
	arr := strings.Split(device, ":")
 | 
						|
	switch len(arr) {
 | 
						|
	case 3:
 | 
						|
		if !IsValidDeviceMode(arr[2]) {
 | 
						|
			return "", "", "", fmt.Errorf("invalid device mode: %s", arr[2])
 | 
						|
		}
 | 
						|
		permissions = arr[2]
 | 
						|
		fallthrough
 | 
						|
	case 2:
 | 
						|
		if IsValidDeviceMode(arr[1]) {
 | 
						|
			permissions = arr[1]
 | 
						|
		} else {
 | 
						|
			if len(arr[1]) > 0 && arr[1][0] != '/' {
 | 
						|
				return "", "", "", fmt.Errorf("invalid device mode: %s", arr[1])
 | 
						|
			}
 | 
						|
			dst = arr[1]
 | 
						|
		}
 | 
						|
		fallthrough
 | 
						|
	case 1:
 | 
						|
		src = arr[0]
 | 
						|
	default:
 | 
						|
		return "", "", "", fmt.Errorf("invalid device specification: %s", device)
 | 
						|
	}
 | 
						|
 | 
						|
	if dst == "" {
 | 
						|
		dst = src
 | 
						|
	}
 | 
						|
	return src, dst, permissions, nil
 | 
						|
}
 | 
						|
 | 
						|
// IsValidDeviceMode checks if the mode for device is valid or not.
 | 
						|
// IsValid mode is a composition of r (read), w (write), and m (mknod).
 | 
						|
func IsValidDeviceMode(mode string) bool {
 | 
						|
	var legalDeviceMode = map[rune]bool{
 | 
						|
		'r': true,
 | 
						|
		'w': true,
 | 
						|
		'm': true,
 | 
						|
	}
 | 
						|
	if mode == "" {
 | 
						|
		return false
 | 
						|
	}
 | 
						|
	for _, c := range mode {
 | 
						|
		if !legalDeviceMode[c] {
 | 
						|
			return false
 | 
						|
		}
 | 
						|
		legalDeviceMode[c] = false
 | 
						|
	}
 | 
						|
	return true
 | 
						|
}
 |