#include "calc.h" #include "itoa_lut.h" #include #include #include #include #include int print_usage() { printf("Invalid arguments:\n\tcalc \n"); return 1; } uint32_t calc_netmask(unsigned int cidr) { return UINT32_MAX << (32 - cidr); } uint32_t segments_to_ip(unsigned int segments[4]) { return (segments[0] << 3*8) | (segments[1] << 2*8) | (segments[2] << 1*8) | (segments[3]); } uint32_t subnetmask_for_netspace(unsigned int desired_netspace) { uint32_t start = UINT32_MAX; // +1 because 2s complement while (~start +1 < desired_netspace + 2) { start = start << 1; } return start; } void write_ip(char **chunk_ptr, uint32_t ip) { // local ptr so we don't have to deref every time char *ptr = *chunk_ptr; LutEntry e = itoa_lut[(ip >> 24) & 0xff]; WRITE_STR(ptr, e.chars, e.len) ptr[0] = '.'; ptr += 1; e = itoa_lut[(ip >> 16) & 0xff]; WRITE_STR(ptr, e.chars, e.len) ptr[0] = '.'; ptr += 1; e = itoa_lut[(ip >> 8) & 0xff]; WRITE_STR(ptr, e.chars, e.len) ptr[0] = '.'; ptr += 1; e = itoa_lut[ip & 0xff]; WRITE_STR(ptr, e.chars, e.len) *chunk_ptr = ptr; } int main(int argc, char** argv) { struct timespec start; clock_gettime(CLOCK_MONOTONIC, &start); unsigned int segments[4] = {0}; unsigned int cidr = 0; unsigned int min_ips_per_subnet = 0; // parse args if (argc < 3) { return print_usage(); } if (sscanf(argv[1], "%u.%u.%u.%u/%u", &segments[0], &segments[1], &segments[2], &segments[3], &cidr) != 5) return print_usage(); if (sscanf(argv[2], "%u", &min_ips_per_subnet) != 1) return print_usage(); CalcRequest req = { .network = segments_to_ip(segments), // fixed later .netmask = calc_netmask(cidr), .subnet_mask = subnetmask_for_netspace(min_ips_per_subnet), .count = 0, // later }; // User can provide any ip address, this converts it to the network address req.network = req.network & req.netmask; // +1 because 2s complement const unsigned int ips_per_subnet = ~req.subnet_mask + 1; req.count = (~req.netmask+1) / (ips_per_subnet); FILE *out = fopen("file.json", "w"); if (out == NULL) { perror("Failed to open output file:"); return errno; } fprintf(out, "[\n"); // file start uint32_t offset = 0; int i = 0; char chunk[1024] = {0}; while (i