feat(rigctld): name the misconfiguration instead of timing out silently
A client set to a RIG MODEL (Kenwood, Yaesu, …) pointed at the CAT-sharing port speaks raw rig dialect: "ID;", "IF;". That is not rigctl, so it fell to the unknown-command branch and got RPRT -11 like anything else. The symptom hides the cause completely. RPRT -11 has no ';' for the client's parser to terminate on, so it waits out its timeout and reports "reply incomplete, got nothing" — a hard failure that reads as "OpsLog's CAT sharing does not work", when it is one setting in the other program. A frame ending in ';' with no space in it cannot be a rigctl command, so the log now says what it is and what to set instead. Reported from Nexus, whose Hamlib error named kenwood_transaction — the one word that gave it away.
This commit is contained in:
@@ -308,6 +308,20 @@ func (s *Server) handle(line string) (resp string, quit bool) {
|
||||
return rprt(0), false
|
||||
|
||||
default:
|
||||
// A frame ending in ';' is not a rigctl command at all — it is raw rig
|
||||
// dialect (Kenwood/Elecraft/Yaesu), which means the client is configured
|
||||
// with a RIG MODEL pointing at this port instead of "Hamlib NET rigctl".
|
||||
//
|
||||
// Worth naming, because the symptom hides the cause completely: we answer
|
||||
// RPRT -11 like any unknown command, but that reply has no ';' to terminate
|
||||
// on, so the client's parser waits and then reports "reply incomplete, got
|
||||
// nothing". The operator sees a timeout and concludes the CAT share is
|
||||
// broken, when it is a one-line setting in the other program.
|
||||
if strings.HasSuffix(line, ";") && !strings.Contains(line, " ") {
|
||||
s.log("rigctld: %q is a raw rig command, not rigctl — the client is set to a RIG MODEL; "+
|
||||
"it must be set to \"Hamlib NET rigctl\" (rig 2) at this address", line)
|
||||
return rprt(-11), false
|
||||
}
|
||||
// RPRT -11 is "command not implemented". Answering something is essential:
|
||||
// a client waiting on a silent socket hangs rather than degrading.
|
||||
s.log("rigctld: unimplemented command %q", line)
|
||||
|
||||
Reference in New Issue
Block a user