Add a "query version" command to the control protocol.
authorDavin McCall <davmac@davmac.org>
Mon, 23 Nov 2015 09:43:59 +0000 (09:43 +0000)
committerDavin McCall <davmac@davmac.org>
Mon, 23 Nov 2015 09:43:59 +0000 (09:43 +0000)
control-cmds.h
control.cc

index f0d2e7605d541d2c9079997134b248efe43a7150..4888f08946272bf0aed9890ea161b7071a586d29 100644 (file)
@@ -9,6 +9,9 @@ constexpr static int DINIT_CP_STOPSERVICE  = 1;
 // Roll-back all services:
 constexpr static int DINIT_CP_ROLLBACKALL = 2;
 
+// Query protocol version:
+constexpr static int DINIT_CP_QUERYVERSION = 3;
+
 
 // Replies:
 
@@ -28,3 +31,6 @@ constexpr static int DINIT_ROLLBACK_COMPLETED = 60;
 // Start service replies:
 constexpr static int DINIT_RP_SERVICELOADERR = 61;
 constexpr static int DINIT_RP_SERVICEOOM = 62; // couldn't start due to out-of-memory
+
+// Query version response:
+constexpr static int DINIT_RP_CPVERSION = 63;
index fd1c366f4aaff8a63d0520f764ade701d91ad3b1..bc7182a2a503f974e8a4fe507965e595a039a90f 100644 (file)
@@ -10,6 +10,15 @@ void ControlConn::processPacket()
     // shouldn't touch instance members after that point.
 
     int pktType = iobuf[0];
+    if (pktType == DINIT_CP_QUERYVERSION) {
+        // Responds with:
+        // DINIT_RP_CVERSION, (2 byte) minimum compatible version, (2 byte) maximum compatible version
+        char replyBuf[] = { DINIT_RP_CPVERSION, 0, 0, 0, 0 };
+        if (! queuePacket(replyBuf, 1)) return;
+        memmove(iobuf, iobuf + 1, 1024 - 1);
+        bufidx -= 1;
+        return;
+    }
     if (pktType == DINIT_CP_STARTSERVICE || pktType == DINIT_CP_STOPSERVICE) {
         if (bufidx < 4) {
             chklen = 4;
@@ -42,6 +51,7 @@ void ControlConn::processPacket()
                 if (! queuePacket(ack_buf, 1)) return;
             }
             catch (ServiceLoadExc &slexc) {
+                log(LogLevel::ERROR, "Could not start service ", slexc.serviceName, ": ", slexc.excDescription);
                 char outbuf[] = { DINIT_RP_SERVICELOADERR };
                 if (! queuePacket(outbuf, 1)) return;
             }
@@ -81,7 +91,11 @@ void ControlConn::processPacket()
         return;
     }
     else {
-        // TODO error response
+        // Unrecognized: give error response
+        char outbuf[] = { DINIT_RP_BADREQ };
+        if (! queuePacket(outbuf, 1)) return;
+        bad_conn_close = true;
+        ev_io_set(&iob, iob.fd, EV_WRITE);
     }
     return;
 }