#include "config.hpp"
#include <netdb.h>
struct config_s config = {};
static void usage(const char* p) {
LOG("Usage: %s listen-port destination:port/script", p);
}
static bool config_parse(char* a) {
char* p = strchr(a, ':');
if (!p || p-a >= (intptr_t)sizeof(config.host)) return false;
*p = '\0';
strcpy(config.host, a);
a = p+1;
p = strchr(a, '/');
if (!p) return false;
*p = '\0';
if (sscanf(a, "%hu", &config.dst.sin_port) != 1) return false;
config.dst.sin_port = htons(config.dst.sin_port);
a = p+1;
if (strlen(a) >= sizeof(config.script)) return false;
strcpy(config.script, a);
return true;
}
bool config_parse(int argc, char** argv) {
if (argc != 3) {
usage(argv[0]);
return false;
}
if (sscanf(argv[1], "%hu", &config.port) != 1 || !config_parse(argv[2])) {
LOG("cannot parse arguments");
return false;
}
struct hostent* he = gethostbyname(config.host);
if (!he || he->h_addrtype != AF_INET || he->h_length != sizeof(config.dst.sin_addr.s_addr)) {
LOG("cannot resolve '%s'", config.host);
return false;
}
config.dst.sin_family = AF_INET;
config.dst.sin_addr.s_addr = *((uint32_t*)he->h_addr);
return true;
}