Print 'Error' when CLI command results in an error, rather than failing silently. (#66)

This commit is contained in:
Jonathan Hui
2016-05-24 13:27:05 -07:00
parent 4ff88e835f
commit 161b241e86
2 changed files with 121 additions and 111 deletions
+119 -111
View File
@@ -136,6 +136,18 @@ int Interpreter::Hex2Bin(const char *aHex, uint8_t *aBin, uint16_t aBinLength)
return cur - aBin;
}
void Interpreter::AppendResult(ThreadError error)
{
if (error == kThreadError_None)
{
sResponse.Append("Done\r\n");
}
else
{
sResponse.Append("Error %d\r\n", error);
}
}
ThreadError Interpreter::ParseLong(char *argv, long &value)
{
char *endptr;
@@ -153,6 +165,7 @@ void Interpreter::ProcessHelp(int argc, char *argv[])
void Interpreter::ProcessChannel(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long value;
if (argc == 0)
@@ -161,18 +174,17 @@ void Interpreter::ProcessChannel(int argc, char *argv[])
}
else
{
SuccessOrExit(ParseLong(argv[0], value));
SuccessOrExit(error = ParseLong(argv[0], value));
otSetChannel(value);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessChildTimeout(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long value;
if (argc == 0)
@@ -181,18 +193,17 @@ void Interpreter::ProcessChildTimeout(int argc, char *argv[])
}
else
{
SuccessOrExit(ParseLong(argv[0], value));
SuccessOrExit(error = ParseLong(argv[0], value));
otSetChildTimeout(value);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessContextIdReuseDelay(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long value;
if (argc == 0)
@@ -205,10 +216,8 @@ void Interpreter::ProcessContextIdReuseDelay(int argc, char *argv[])
otSetContextIdReuseDelay(value);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessExtAddress(int argc, char *argv[])
@@ -217,11 +226,13 @@ void Interpreter::ProcessExtAddress(int argc, char *argv[])
sResponse.Append("%02x%02x%02x%02x%02x%02x%02x%02x\r\n",
extAddress[0], extAddress[1], extAddress[2], extAddress[3],
extAddress[4], extAddress[5], extAddress[6], extAddress[7]);
sResponse.Append("Done\r\n");
AppendResult(kThreadError_None);
}
void Interpreter::ProcessExtPanId(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
if (argc == 0)
{
const uint8_t *extPanId = otGetExtendedPanId();
@@ -233,15 +244,13 @@ void Interpreter::ProcessExtPanId(int argc, char *argv[])
{
uint8_t extPanId[8];
VerifyOrExit(Hex2Bin(argv[0], extPanId, sizeof(extPanId)) >= 0, ;);
VerifyOrExit(Hex2Bin(argv[0], extPanId, sizeof(extPanId)) >= 0, error = kThreadError_Parse);
otSetExtendedPanId(extPanId);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
ThreadError Interpreter::ProcessIpAddrAdd(int argc, char *argv[])
@@ -277,6 +286,8 @@ exit:
void Interpreter::ProcessIpAddr(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
if (argc == 0)
{
for (const otNetifAddress *addr = otGetUnicastAddresses(); addr; addr = addr->mNext)
@@ -292,22 +303,21 @@ void Interpreter::ProcessIpAddr(int argc, char *argv[])
{
if (strcmp(argv[0], "add") == 0)
{
SuccessOrExit(ProcessIpAddrAdd(argc - 1, argv + 1));
SuccessOrExit(error = ProcessIpAddrAdd(argc - 1, argv + 1));
}
else if (strcmp(argv[0], "del") == 0)
{
SuccessOrExit(ProcessIpAddrDel(argc - 1, argv + 1));
SuccessOrExit(error = ProcessIpAddrDel(argc - 1, argv + 1));
}
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessKeySequence(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long value;
if (argc == 0)
@@ -316,18 +326,17 @@ void Interpreter::ProcessKeySequence(int argc, char *argv[])
}
else
{
SuccessOrExit(ParseLong(argv[0], value));
SuccessOrExit(error = ParseLong(argv[0], value));
otSetKeySequenceCounter(value);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessLeaderWeight(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long value;
if (argc == 0)
@@ -336,18 +345,17 @@ void Interpreter::ProcessLeaderWeight(int argc, char *argv[])
}
else
{
SuccessOrExit(ParseLong(argv[0], value));
SuccessOrExit(error = ParseLong(argv[0], value));
otSetLocalLeaderWeight(value);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessMasterKey(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
uint8_t keyLength;
if (argc == 0)
@@ -365,18 +373,17 @@ void Interpreter::ProcessMasterKey(int argc, char *argv[])
{
uint8_t key[16];
VerifyOrExit((keyLength = Hex2Bin(argv[0], key, sizeof(key))) >= 0, ;);
SuccessOrExit(otSetMasterKey(key, keyLength));
VerifyOrExit((keyLength = Hex2Bin(argv[0], key, sizeof(key))) >= 0, error = kThreadError_Parse);
SuccessOrExit(error = otSetMasterKey(key, keyLength));
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessMode(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
otLinkModeConfig linkMode = {};
if (argc == 0)
@@ -428,30 +435,29 @@ void Interpreter::ProcessMode(int argc, char *argv[])
break;
default:
ExitNow();
ExitNow(error = kThreadError_Parse);
}
}
SuccessOrExit(otSetLinkMode(linkMode));
SuccessOrExit(error = otSetLinkMode(linkMode));
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessNetworkDataRegister(int argc, char *argv[])
{
SuccessOrExit(otSendServerData());
sResponse.Append("Done\r\n");
ThreadError error = kThreadError_None;
SuccessOrExit(error = otSendServerData());
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessNetworkIdTimeout(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long value;
if (argc == 0)
@@ -460,35 +466,34 @@ void Interpreter::ProcessNetworkIdTimeout(int argc, char *argv[])
}
else
{
SuccessOrExit(ParseLong(argv[0], value));
SuccessOrExit(error = ParseLong(argv[0], value));
otSetNetworkIdTimeout(value);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessNetworkName(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
if (argc == 0)
{
sResponse.Append("%.*s\r\n", OT_NETWORK_NAME_SIZE, otGetNetworkName());
}
else
{
SuccessOrExit(otSetNetworkName(argv[0]));
SuccessOrExit(error = otSetNetworkName(argv[0]));
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessPanId(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long value;
if (argc == 0)
@@ -497,14 +502,12 @@ void Interpreter::ProcessPanId(int argc, char *argv[])
}
else
{
SuccessOrExit(ParseLong(argv[0], value));
SuccessOrExit(error = ParseLong(argv[0], value));
otSetPanId(value);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::HandleEchoResponse(void *aContext, Message &aMessage, const Ip6::MessageInfo &aMessageInfo)
@@ -527,25 +530,28 @@ void Interpreter::HandleEchoResponse(void *aContext, Message &aMessage, const Ip
void Interpreter::ProcessPing(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long length = 8;
VerifyOrExit(argc > 0, ;);
VerifyOrExit(argc > 0, error = kThreadError_Parse);
memset(&sSockAddr, 0, sizeof(sSockAddr));
SuccessOrExit(sSockAddr.GetAddress().FromString(argv[0]));
SuccessOrExit(error = sSockAddr.GetAddress().FromString(argv[0]));
sSockAddr.mScopeId = 1;
if (argc > 1)
{
SuccessOrExit(ParseLong(argv[1], length));
SuccessOrExit(error = ParseLong(argv[1], length));
}
sIcmpEcho.SendEchoRequest(sSockAddr, sEchoRequest, length);
sResponse.Init();
exit:
return;
exit:
AppendResult(error);
}
ThreadError Interpreter::ProcessPrefixAdd(int argc, char *argv[])
@@ -668,40 +674,39 @@ exit:
void Interpreter::ProcessPrefix(int argc, char *argv[])
{
VerifyOrExit(argc > 0, ;);
ThreadError error = kThreadError_None;
VerifyOrExit(argc > 0, error = kThreadError_Parse);
if (strcmp(argv[0], "add") == 0)
{
SuccessOrExit(ProcessPrefixAdd(argc - 1, argv + 1));
SuccessOrExit(error = ProcessPrefixAdd(argc - 1, argv + 1));
}
else if (strcmp(argv[0], "remove") == 0)
{
SuccessOrExit(ProcessPrefixRemove(argc - 1, argv + 1));
SuccessOrExit(error = ProcessPrefixRemove(argc - 1, argv + 1));
}
else
{
ExitNow();
ExitNow(error = kThreadError_Parse);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessReleaseRouterId(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long value;
if (argc != 0)
{
SuccessOrExit(ParseLong(argv[0], value));
SuccessOrExit(otReleaseRouterId(value));
sResponse.Append("Done\r\n");
}
VerifyOrExit(argc > 0, error = kThreadError_Parse);
SuccessOrExit(error = ParseLong(argv[0], value));
SuccessOrExit(error = otReleaseRouterId(value));
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessRloc16(int argc, char *argv[])
@@ -802,29 +807,30 @@ exit:
void Interpreter::ProcessRoute(int argc, char *argv[])
{
VerifyOrExit(argc > 0, ;);
ThreadError error = kThreadError_None;
VerifyOrExit(argc > 0, error = kThreadError_Parse);
if (strcmp(argv[0], "add") == 0)
{
SuccessOrExit(ProcessRouteAdd(argc - 1, argv + 1));
SuccessOrExit(error = ProcessRouteAdd(argc - 1, argv + 1));
}
else if (strcmp(argv[0], "remove") == 0)
{
SuccessOrExit(ProcessRouteRemove(argc - 1, argv + 1));
SuccessOrExit(error = ProcessRouteRemove(argc - 1, argv + 1));
}
else
{
ExitNow();
ExitNow(error = kThreadError_Parse);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessRouterUpgradeThreshold(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
long value;
if (argc == 0)
@@ -833,33 +839,34 @@ void Interpreter::ProcessRouterUpgradeThreshold(int argc, char *argv[])
}
else
{
SuccessOrExit(ParseLong(argv[0], value));
SuccessOrExit(error = ParseLong(argv[0], value));
otSetRouterUpgradeThreshold(value);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessScan(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
uint16_t scanChannels = 0;
long value;
if (argc > 0)
{
SuccessOrExit(ParseLong(argv[0], value));
SuccessOrExit(error = ParseLong(argv[0], value));
scanChannels = 1 << (value - kPhyMinChannel);
}
SuccessOrExit(otActiveScan(scanChannels, 0, &HandleActiveScanResult));
SuccessOrExit(error = otActiveScan(scanChannels, 0, &HandleActiveScanResult));
sResponse.Append("| J | Network Name | Extended PAN | PAN | MAC Address | Ch | dBm |\r\n");
sResponse.Append("+---+------------------+------------------+------+------------------+----+-----+\r\n");
exit:
return;
exit:
AppendResult(error);
}
void Interpreter::HandleActiveScanResult(otActiveScanResult *aResult)
@@ -910,7 +917,7 @@ exit:
void Interpreter::ProcessShutdown(int argc, char *argv[])
{
sResponse.Append("Done\r\n");
AppendResult(kThreadError_None);
sServer->Output(sResponse.GetResponse(), sResponse.GetResponseLength());
otPlatSerialDisable();
exit(0);
@@ -918,15 +925,18 @@ void Interpreter::ProcessShutdown(int argc, char *argv[])
void Interpreter::ProcessStart(int argc, char *argv[])
{
SuccessOrExit(otEnable());
sResponse.Append("Done\r\n");
ThreadError error = kThreadError_None;
SuccessOrExit(error = otEnable());
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessState(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
if (argc == 0)
{
switch (otGetDeviceRole())
@@ -956,65 +966,65 @@ void Interpreter::ProcessState(int argc, char *argv[])
{
if (strcmp(argv[0], "detached") == 0)
{
SuccessOrExit(otBecomeDetached());
SuccessOrExit(error = otBecomeDetached());
}
else if (strcmp(argv[0], "child") == 0)
{
SuccessOrExit(otBecomeChild(kMleAttachSamePartition));
SuccessOrExit(error = otBecomeChild(kMleAttachSamePartition));
}
else if (strcmp(argv[0], "router") == 0)
{
SuccessOrExit(otBecomeRouter());
SuccessOrExit(error = otBecomeRouter());
}
else if (strcmp(argv[0], "leader") == 0)
{
SuccessOrExit(otBecomeLeader());
SuccessOrExit(error = otBecomeLeader());
}
else
{
ExitNow();
ExitNow(error = kThreadError_Parse);
}
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessStop(int argc, char *argv[])
{
SuccessOrExit(otDisable());
sResponse.Append("Done\r\n");
ThreadError error = kThreadError_None;
SuccessOrExit(error = otDisable());
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessWhitelist(int argc, char *argv[])
{
ThreadError error = kThreadError_None;
int argcur = 0;
uint8_t extAddr[8];
int8_t rssi;
if (argcur >= argc)
{
;
ExitNow(error = kThreadError_Parse);
}
else if (strcmp(argv[argcur], "add") == 0)
{
VerifyOrExit(++argcur < argc, ;);
VerifyOrExit(Hex2Bin(argv[argcur], extAddr, sizeof(extAddr)) == sizeof(extAddr), ;);
VerifyOrExit(++argcur < argc, error = kThreadError_Parse);
VerifyOrExit(Hex2Bin(argv[argcur], extAddr, sizeof(extAddr)) == sizeof(extAddr), error = kThreadError_Parse);
if (++argcur < argc)
{
rssi = strtol(argv[argcur], NULL, 0);
VerifyOrExit(otAddMacWhitelistRssi(extAddr, rssi) == kThreadError_None, ;);
VerifyOrExit(otAddMacWhitelistRssi(extAddr, rssi) == kThreadError_None, error = kThreadError_Parse);
}
else
{
otAddMacWhitelist(extAddr);
VerifyOrExit(otAddMacWhitelist(extAddr) == kThreadError_None, ;);
VerifyOrExit(otAddMacWhitelist(extAddr) == kThreadError_None, error = kThreadError_Parse);
}
}
else if (strcmp(argv[argcur], "clear") == 0)
@@ -1031,15 +1041,13 @@ void Interpreter::ProcessWhitelist(int argc, char *argv[])
}
else if (strcmp(argv[argcur], "remove") == 0)
{
VerifyOrExit(++argcur < argc, ;);
VerifyOrExit(Hex2Bin(argv[argcur], extAddr, sizeof(extAddr)) == sizeof(extAddr), ;);
VerifyOrExit(++argcur < argc, error = kThreadError_Parse);
VerifyOrExit(Hex2Bin(argv[argcur], extAddr, sizeof(extAddr)) == sizeof(extAddr), error = kThreadError_Parse);
otRemoveMacWhitelist(extAddr);
}
sResponse.Append("Done\r\n");
exit:
return;
AppendResult(error);
}
void Interpreter::ProcessLine(char *aBuf, uint16_t aBufLength, Server &aServer)