diff --git a/list_linux.go b/list_linux.go new file mode 100644 index 0000000..13b6fe3 --- /dev/null +++ b/list_linux.go @@ -0,0 +1,43 @@ +package serial + +import ( + "bytes" + "io/ioutil" + "os" + "path/filepath" + "sort" +) + +// ListRX returns the detected serial ports sorted. +func ListRX() (names []string, err error) { + matches, err := filepath.Glob("/sys/class/tty/*/rx_trig_bytes") + if err != nil { + return nil, err + } + + names = make([]string, 0, len(matches)) + for _, m := range matches { + uevent, err := ioutil.ReadFile(filepath.Clean(m + "/../uevent")) + if err != nil && !os.IsNotExist(err) { + return nil, err + } + + var name string + for _, line := range bytes.Split(uevent, []byte{'\n'}) { + if bytes.HasPrefix(line, []byte("DEVNAME=")) { + name = "/dev/" + string(line[8:]) + break + } + } + + if _, err := os.Lstat(name); err == nil { + names = append(names, name) + } else if !os.IsNotExist(err) { + return nil, err + } + } + + sort.Strings(names) + + return +} diff --git a/list_linux_test.go b/list_linux_test.go new file mode 100644 index 0000000..b153af6 --- /dev/null +++ b/list_linux_test.go @@ -0,0 +1,34 @@ +package serial + +import ( + "os" + "testing" +) + +func TestListRX(t *testing.T) { + port0 := os.Getenv("PORT0") + port1 := os.Getenv("PORT1") + + names, err := ListRX() + if err != nil { + t.Fatal(err) + } + + for _, name := range names { + t.Log("got", name) + + switch { + case name == port0: + port0 = "" + case name == port1: + port1 = "" + } + } + + if port0 != "" { + t.Errorf("PORT0=%q not found", port0) + } + if port1 != "" { + t.Errorf("PORT1=%q not found", port1) + } +}