diff --git a/.travis/check-posix-app-pty b/.travis/check-posix-app-pty index 5535948dd..aee985b1b 100755 --- a/.travis/check-posix-app-pty +++ b/.travis/check-posix-app-pty @@ -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 < "${OT_OUTPUT}" & spawn ${OT_CLI_CMD} send "panid 0xface\r\n" diff --git a/src/posix/client.c b/src/posix/client.c index ac505505a..bb7faad09 100644 --- a/src/posix/client.c +++ b/src/posix/client.c @@ -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;