blob: 57dcfa9dfe03a40bb3323aa0b327cfb3ef2694f8 [file] [log] [blame]
/*
* INTEL CONFIDENTIAL
* Copyright © 2011 Intel
* Corporation All Rights Reserved.
*
* The source code contained or described herein and all documents related to
* the source code ("Material") are owned by Intel Corporation or its suppliers
* or licensors. Title to the Material remains with Intel Corporation or its
* suppliers and licensors. The Material contains trade secrets and proprietary
* and confidential information of Intel or its suppliers and licensors. The
* Material is protected by worldwide copyright and trade secret laws and
* treaty provisions. No part of the Material may be used, copied, reproduced,
* modified, published, uploaded, posted, transmitted, distributed, or
* disclosed in any way without Intel’s prior express written permission.
*
* No license under any patent, copyright, trade secret or other intellectual
* property right is granted to or conferred upon you by disclosure or delivery
* of the Materials, either expressly, by implication, inducement, estoppel or
* otherwise. Any license under such intellectual property rights must be
* express and approved by Intel in writing.
*
* CREATED: 2011-06-01
* UPDATED: 2011-07-27
*/
#include <iostream>
#include <string>
#include <cstring>
#include <stdlib.h>
#include "RequestMessage.h"
#include "AnswerMessage.h"
#include "ConnectionSocket.h"
#include "NaiveTokenizer.h"
using namespace std;
class CRequestMessageGenerator
{
private:
istream& _input; // File to read the commands from
public:
CRequestMessageGenerator(istream& input) : _input(input) {}
enum EStatus {
OK,
STOP,
EMPTY_LINE,
ERROR
};
EStatus next(CRequestMessage& requestMessage)
{
string sLine;
char* pcLine;
char* pcLine_backup; // pcLine will be modified by NaiveTokenizer
// so we need to keep track of its original value
char* pcToken;
// Read a single line from the input file
getline(_input, sLine);
if (_input.eof() && (_input.gcount() == 0)) {
return STOP; // No more commands
}
if (_input.fail()) {
return ERROR; // Error while reading file
}
pcLine = strdup(sLine.c_str());
pcLine_backup = pcLine;
if (!pcLine) {
return ERROR;
}
// Set the first word as the command
pcToken = NaiveTokenizer::getNextToken(&pcLine);
if (!pcToken) {
free(pcLine_backup);
return EMPTY_LINE;
}
requestMessage.setCommand(pcToken);
while ((pcToken = NaiveTokenizer::getNextToken(&pcLine)) != NULL) {
// Add each word as arguments to the command
requestMessage.addArgument(pcToken);
}
free(pcLine_backup);
return OK;
}
};
bool sendAndDisplayCommand(CConnectionSocket &connectionSocket, CRequestMessage &requestMessage)
{
if (!requestMessage.serialize(&connectionSocket, true)) {
cerr << "Unable to send command to target" << endl;
return false;
}
///// Get answer
CAnswerMessage answerMessage;
if (!answerMessage.serialize(&connectionSocket, false)) {
cerr << "No answer received from target" << endl;
return false;
}
// Success?
if (!answerMessage.success()) {
// Display error answer
cerr << answerMessage.getAnswer() << endl;
return false;
}
// Display success answer
cout << answerMessage.getAnswer() << endl;
return true;
}
// hostname port command [argument[s]]
// or
// hostname port < commands
int main(int argc, char *argv[])
{
bool bFromStdin = false; // Read commands from stdin instead of arguments
// Enough args?
if (argc < 3) {
cerr << "Missing arguments" << endl;
cerr << "Usage: " << endl;
cerr << "Send a single command:" << endl;
cerr << "\t" << argv[0] << " hostname port command [argument[s]]" << endl;
cerr << "Send several commands, read from stdin:" << endl;
cerr << "\t" << argv[0] << " hostname port" << endl;
return 1;
} else if (argc < 4) {
bFromStdin = true;
}
// Get port number
uint16_t uiPort = (uint16_t)strtoul(argv[2], NULL, 0);
// Connect to target
CConnectionSocket connectionSocket;
// Set timeout
connectionSocket.setTimeout(5000);
string strError;
// Connect
if (!connectionSocket.connect(argv[1], uiPort, strError)) {
cerr << strError << endl;
return 1;
}
if (bFromStdin) {
CRequestMessageGenerator generator(cin);
CRequestMessage requestMessage;
CRequestMessageGenerator::EStatus status;
while (true) {
status = generator.next(requestMessage);
switch (status) {
case CRequestMessageGenerator::OK:
if (!sendAndDisplayCommand(connectionSocket, requestMessage)) {
return 1;
}
break;
case CRequestMessageGenerator::STOP:
return 0;
case CRequestMessageGenerator::ERROR:
cerr << "Error while reading the input" << endl;
return 1;
case CRequestMessageGenerator::EMPTY_LINE:
continue;
}
}
} else {
// Create command message
CRequestMessage requestMessage(argv[3]);
// Add arguments
uint32_t uiArg;
for (uiArg = 4; uiArg < (uint32_t)argc; uiArg++) {
requestMessage.addArgument(argv[uiArg]);
}
if (!sendAndDisplayCommand(connectionSocket, requestMessage)) {
return 1;
}
}
// Program status
return 0;
}