2024-05-08 13:27:23 +02:00
|
|
|
//cli_parser.cpp
|
2024-05-08 10:24:32 +02:00
|
|
|
#include "cli_parser.h"
|
|
|
|
#include <getopt.h>
|
|
|
|
#include <iostream>
|
|
|
|
|
2024-05-08 13:27:23 +02:00
|
|
|
void config::parseCommandLine(int argc, char *argv[]) {
|
2024-05-08 10:24:32 +02:00
|
|
|
const struct option longOptions[] = {
|
2024-05-08 13:27:23 +02:00
|
|
|
{"host", required_argument, nullptr, 'h'},
|
|
|
|
{"port", required_argument, nullptr, 'p'},
|
|
|
|
{"vhost", required_argument, nullptr, 'v'},
|
|
|
|
{"vport", required_argument, nullptr, 'b'},
|
2024-05-08 10:24:32 +02:00
|
|
|
{"version", required_argument, nullptr, 'r'},
|
2024-05-08 13:27:23 +02:00
|
|
|
{"state", required_argument, nullptr, 's'},
|
2024-05-08 19:10:27 +02:00
|
|
|
{"minimal", no_argument, nullptr, 'm'},
|
2024-05-08 13:27:23 +02:00
|
|
|
{"help", no_argument, nullptr, 0},
|
|
|
|
{nullptr, 0, nullptr, 0}
|
2024-05-08 10:24:32 +02:00
|
|
|
};
|
|
|
|
|
|
|
|
int opt;
|
2024-05-08 19:10:27 +02:00
|
|
|
bool minimal = false;
|
|
|
|
while ((opt = getopt_long(argc, argv, "h:p:v:b:r:s:m:", longOptions, nullptr)) != -1) {
|
2024-05-08 10:24:32 +02:00
|
|
|
switch (opt) {
|
|
|
|
case 'h':
|
|
|
|
hostname = optarg;
|
|
|
|
break;
|
|
|
|
case 'p':
|
|
|
|
port = std::stoi(optarg);
|
|
|
|
break;
|
|
|
|
case 'v':
|
|
|
|
virtualHostname = optarg;
|
|
|
|
break;
|
|
|
|
case 'b':
|
|
|
|
virtualPort = std::stoi(optarg);
|
|
|
|
break;
|
|
|
|
case 'r':
|
|
|
|
protocolVersion = std::stoi(optarg);
|
|
|
|
break;
|
|
|
|
case 's':
|
|
|
|
nextState = std::stoi(optarg);
|
|
|
|
break;
|
2024-05-08 19:10:27 +02:00
|
|
|
case 'm':
|
|
|
|
nextState = 1;
|
|
|
|
protocolVersion = -1;
|
|
|
|
virtualPort = 0;
|
|
|
|
virtualHostname = "";
|
|
|
|
minimal = true;
|
|
|
|
break;
|
2024-05-08 10:24:32 +02:00
|
|
|
case 0: // --help
|
|
|
|
printHelp();
|
|
|
|
exit(0);
|
|
|
|
default: // '?'
|
|
|
|
printHelp();
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (hostname.empty()) {
|
|
|
|
std::cerr << "Error: Hostname is required.\n";
|
|
|
|
printHelp();
|
|
|
|
exit(1);
|
|
|
|
}
|
|
|
|
|
2024-05-08 19:10:27 +02:00
|
|
|
if (virtualHostname.empty() && !minimal) {
|
2024-05-08 10:24:32 +02:00
|
|
|
virtualHostname = hostname; // Default to real hostname
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
void config::printHelp() {
|
|
|
|
std::cout << "Usage: mcpinger [options]\n"
|
|
|
|
<< "Options:\n"
|
|
|
|
<< " --host <hostname> Real server hostname (required)\n"
|
|
|
|
<< " --port <port> Real server port (default 25565)\n"
|
|
|
|
<< " --vhost <virtual host> Virtual hostname (default is same as host)\n"
|
|
|
|
<< " --vport <virtual port> Virtual port (default is same as port)\n"
|
|
|
|
<< " --version <protocol> Protocol version (default -1)\n"
|
|
|
|
<< " --state <next state> Next state (default 1, status request)\n"
|
|
|
|
<< " --help Show this help message\n";
|
|
|
|
}
|