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:
2026-08-11 09:54:28 +02:00
parent 9531a54ac1
commit 796a1d8e7d
2 changed files with 18 additions and 2 deletions
+14
View File
@@ -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)