Skip to content

Commit

Permalink
Merge pull request #132 from raharper/fix/linux-udevadm-parsing
Browse files Browse the repository at this point in the history
linux/udev: fix udevadm info parser to not be fatal
  • Loading branch information
hallyn authored Feb 16, 2024
2 parents 7c6624f + 0ef4318 commit 7b7d307
Show file tree
Hide file tree
Showing 2 changed files with 39 additions and 4 deletions.
41 changes: 37 additions & 4 deletions linux/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -48,15 +48,50 @@ func parseUdevInfo(out []byte, info *disko.UdevInfo) error {
}

toks = bytes.SplitN(line, []byte(": "), 2)
payload = string(toks[1])

if len(toks) != 2 {
log.Printf("parseUdevInfo: ignoring unparsable line %q\n", line)
continue
}

payload = string(toks[1])
switch toks[0][0] {
case 'P':
// Device path in /sys/
info.SysPath = payload
case 'M':
// Device name in /sys/ (i.e. the last component of "P:")
continue
case 'R':
// Device number in /sys/ (i.e. the numeric suffix of the last component of "P:")
continue
case 'U':
// Kernel subsystem
continue
case 'T':
// Kernel device type with subsystem
continue
case 'D':
// Kernel device node major/minor
continue
case 'I':
// Network interface index
continue
case 'N':
// Kernel device node name
info.Name = payload
case 'L':
// Device node symlink priority
continue
case 'S':
// Device node symlink
info.Symlinks = append(info.Symlinks, strings.Split(payload, " ")...)
case 'Q':
// Block device sequence number (DISKSEQ)
continue
case 'V':
// Attached driver
continue
case 'E':
kv := strings.SplitN(payload, "=", 2)
// use of Unquote is to decode \x20, \x2f and friends.
Expand All @@ -68,10 +103,8 @@ func parseUdevInfo(out []byte, info *disko.UdevInfo) error {
}

info.Properties[kv[0]] = strings.TrimSpace(s)
case 'L':
// a 'devlink priority'. skip for now.
default:
return fmt.Errorf("error parsing line: (%s)", line)
log.Printf("parseUdevInfo: ignoring unknown udevadm info prefix %q in %q\n", toks[0][0], line)
}
}

Expand Down
2 changes: 2 additions & 0 deletions linux/util_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import (
func TestParseUdevInfo(t *testing.T) {
data := []byte(`P: /devices/virtual/block/dm-0
N: dm-0
M: dm-0
S: disk/by-id/dm-name-nvme0n1p6_crypt
S: disk/by-id/dm-uuid-CRYPT-LUKS1-b174c64e7a714359a8b56b79fb66e92b-nvme0n1p6_crypt
S: disk/by-uuid/25df9069-80c7-46f4-a47c-305613c2cb6b
Expand Down Expand Up @@ -49,6 +50,7 @@ E: DEVNAME=/dev/dm-0
func TestParseUdevInfo2(t *testing.T) {
data := []byte(`P: /devices/pci0000:00/..../block/sda
N: sda
M: sda
S: disk/by-id/scsi-35000c500a0d8963f
S: disk/by-id/wwn-0x5000c500a0d8963f
S: disk/by-path/pci-0000:05:00.0-scsi-0:0:8:0
Expand Down

0 comments on commit 7b7d307

Please sign in to comment.