[posix-host] add command mode for ot-ctl (#4457)

ot-ctl will now send the command line arguments to ot-daemon and print
the reply.
This commit is contained in:
Jiacheng Guo
2020-01-14 22:07:36 -08:00
committed by Jonathan Hui
parent 05ba4c29f4
commit 7d92134da2
2 changed files with 111 additions and 0 deletions
+4
View File
@@ -80,6 +80,10 @@ check() {
OT_CLI_CMD="$(pwd)/$(ls output/posix/*linux*/bin/ot-cli) ${OT_NCP_PATH} ${CORE_PTY}"
fi
if [[ "${DAEMON}" = 1 ]]; then
sudo ${OT_CLI_CMD} panid 0xface | grep 'Done' || die 'failed to get panid with ot-ctl'
fi
sudo expect <<EOF > "${OT_OUTPUT}" &
spawn ${OT_CLI_CMD}
send "panid 0xface\r\n"
+107
View File
@@ -75,6 +75,107 @@ static void InputCallback(char *aLine)
}
#endif // OPENTHREAD_USE_READLINE
static bool FindDone(int *aDoneState, char aNowCharacter)
{
switch (aNowCharacter)
{
case 'D':
*aDoneState = *aDoneState == 0 ? 1 : -1;
break;
case 'o':
*aDoneState = *aDoneState == 1 ? 2 : -1;
break;
case 'n':
*aDoneState = *aDoneState == 2 ? 3 : -1;
break;
case 'e':
*aDoneState = *aDoneState == 3 ? 4 : -1;
break;
case '\r':
case '\n':
if (*aDoneState == 4)
{
*aDoneState = 5;
}
else
{
*aDoneState = 0;
}
break;
default:
*aDoneState = -1;
break;
}
return *aDoneState == 5;
}
static bool FindError(int *aErrorState, char aNowCharacter)
{
switch (aNowCharacter)
{
case 'E':
*aErrorState = *aErrorState == 0 ? 1 : -1;
break;
case 'r':
if (*aErrorState == 1 || *aErrorState == 2 || *aErrorState == 4)
{
(*aErrorState)++;
}
else
{
*aErrorState = -1;
}
break;
case 'o':
*aErrorState = *aErrorState == 3 ? 4 : -1;
break;
case ' ':
*aErrorState = *aErrorState == 5 ? 6 : -1;
break;
case '\r':
case '\n':
*aErrorState = 0;
break;
default:
*aErrorState = -1;
break;
}
return *aErrorState == 6;
}
static void SendBlockingCommand(int aArgc, char *aArgv[])
{
char buffer[OPENTHREAD_CONFIG_DIAG_CMD_LINE_BUFFER_SIZE];
int doneState = 0;
int errorState = 0;
for (int i = 0; i < aArgc; i++)
{
otEXPECT_ACTION(write(sSessionFd, aArgv[i], strlen(aArgv[i])) >= 0, perror("Failed to send command"));
otEXPECT_ACTION(write(sSessionFd, " ", 1) >= 0, perror("Failed to send command"));
}
otEXPECT_ACTION(write(sSessionFd, "\n", 1) >= 0, perror("Failed to send command"));
while (true)
{
ssize_t rval = read(sSessionFd, buffer, sizeof(buffer));
otEXPECT(rval >= 0);
write(STDOUT_FILENO, buffer, rval);
for (ssize_t i = 0; i < rval; i++)
{
if (FindDone(&doneState, buffer[i]) || FindError(&errorState, buffer[i]))
{
otEXIT_NOW();
}
}
}
exit:
return;
}
int main(int argc, char *argv[])
{
OT_UNUSED_VARIABLE(argc);
@@ -109,6 +210,12 @@ int main(int argc, char *argv[])
#endif
}
if (argc > 1)
{
SendBlockingCommand(argc - 1, &argv[1]);
otEXIT_NOW(ret = 0);
}
while (1)
{
fd_set readFdSet;