mirror of
				https://github.com/containers/podman.git
				synced 2025-10-31 10:00:01 +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
 | |
| }
 | 
