tools/hexnet: Implement function for reading bytes from stdin
parent
a7e07d2c3c
commit
1d7e98d0b3
|
@ -16,6 +16,7 @@
|
|||
//version 3 along with this program.
|
||||
//If not, see https://www.gnu.org/licenses/agpl-3.0.en.html
|
||||
|
||||
#include <chrono>
|
||||
#include <csignal>
|
||||
#include <iomanip>
|
||||
#include <iostream>
|
||||
|
@ -70,6 +71,38 @@ in_port_t port;
|
|||
const uint32_t bufferSize = 2048;
|
||||
uint8_t networkBuffer[bufferSize];
|
||||
|
||||
std::string readByteFromStdin() {
|
||||
std::string input = "";
|
||||
// read 2 characters from stdin
|
||||
char characterInput;
|
||||
bool readByte = false;
|
||||
uint16_t iterationsSinceLastInput = 0;
|
||||
while (input.length() < 2 && !exitProgram) {
|
||||
if (std::cin.good()) {
|
||||
std::cin.get(characterInput);
|
||||
readByte = true;
|
||||
} else {
|
||||
readByte = false;
|
||||
}
|
||||
// ignore space, tabs, and newlines
|
||||
if (readByte && characterInput!=' ' && characterInput!='\n' && characterInput!='\r' && characterInput!='\t') {
|
||||
input.push_back(characterInput);
|
||||
}
|
||||
|
||||
iterationsSinceLastInput++;
|
||||
if (readByte) {
|
||||
iterationsSinceLastInput = 0;
|
||||
}
|
||||
if (iterationsSinceLastInput>1024) {
|
||||
// prevent integer overflow
|
||||
iterationsSinceLastInput = 1024;
|
||||
|
||||
std::this_thread::sleep_for(std::chrono::milliseconds(1000));
|
||||
}
|
||||
}
|
||||
return exitProgram? "" : std::string(1, (char) std::stoi(input, nullptr, 16));
|
||||
}
|
||||
|
||||
void signalHandler(int signal) {
|
||||
// shut down gracefully
|
||||
exitProgram = true;
|
||||
|
@ -148,7 +181,7 @@ int main(int argc, char* argv[]) {
|
|||
std::vector<CLI::Argument> arguments;
|
||||
arguments.push_back(CLI::Argument("PORT", "the port to lsiten on (or connect to)"));
|
||||
|
||||
CLI::ArgumentsParser cliParser = CLI::ArgumentsParser(argc, argv, flags, options, arguments, "Arbitrary TCP/UDP connections in hex format", "Note: Make sure your terminal is set up so it doesn't buffer input and, if desired, disable input echoing.\n\tSomething like `stty -echo cbreak` should do but it will also disable some key combinations.");
|
||||
CLI::ArgumentsParser cliParser = CLI::ArgumentsParser(argc, argv, flags, options, arguments, "Arbitrary TCP/UDP connections in hex format", "Spaces, tabs, newlines, and carriage returns in the input are ignored.\n\tYou may want to disable input echoing using `stty -echo` (reenable using `stty echo`).\n\tNote that many terminals do line buffering on the input by default.");
|
||||
|
||||
if (cliParser.getFlag("help").value) {
|
||||
std::cout << cliParser.getUsage() << std::endl;
|
||||
|
|
Loading…
Reference in New Issue