//go:build linux package serial import ( "fmt" "golang.org/x/sys/unix" ) func platformModemLinkState(entry MappingChannel) LinkState { if entry.LinkSignal == "unknown" { return LinkState{Channel: entry.Channel, State: "unknown", Signal: "unknown", Message: "physical modem link signal is not board-validated"} } fd, err := unix.Open(entry.Device, unix.O_RDWR|unix.O_NOCTTY|unix.O_NONBLOCK|unix.O_CLOEXEC, 0) if err != nil { return LinkState{Channel: entry.Channel, State: "unknown", Signal: "unknown", Message: "serial device cannot be opened for modem status"} } defer unix.Close(fd) bits, err := unix.IoctlGetInt(fd, unix.TIOCMGET) if err != nil { return LinkState{Channel: entry.Channel, State: "unknown", Signal: "unknown", Message: fmt.Sprintf("%s modem status is unavailable", entry.LinkSignal)} } var mask int switch entry.LinkSignal { case "dcd": mask = unix.TIOCM_CAR case "dsr": mask = unix.TIOCM_DSR case "cts": mask = unix.TIOCM_CTS default: return LinkState{Channel: entry.Channel, State: "unknown", Signal: "unknown", Message: "unsupported modem link signal"} } state := "down" if bits&mask != 0 { state = "up" } return LinkState{Channel: entry.Channel, State: state, Signal: entry.LinkSignal, Available: true} }