#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;
}