#include #include #include #include int decode_mac(int mac[6], const char *macstr) { return sscanf(macstr, "%x:%x:%x:%x:%x:%x", mac, mac + 1, mac + 2, mac + 3, mac + 4, mac + 5) == 6; } int mkname_unknown(char *name, const char *ipstr) { int ip_lastpart = 0; if (sscanf(ipstr, "192.168.0.%d", &ip_lastpart) != 1) return 0; sprintf(name, "u-%d", ip_lastpart); return 1; } void name_tolower(char *name) { while (*name != 0) { *name = tolower(*name); name++; } } void convert_eui64(int eui64[8], const int mac[6]) { eui64[0] = mac[0] ^ 0x02; eui64[1] = mac[1]; eui64[2] = mac[2]; eui64[3] = 0xff; eui64[4] = 0xfe; eui64[5] = mac[3]; eui64[6] = mac[4]; eui64[7] = mac[5]; } void format_ipv6fwd(char *ipv6addr, const int mac[6]) { int eui64[8]; convert_eui64(eui64, mac); snprintf(ipv6addr, 64, "2002:54f8:d15f:0000:%02x%02x:%02x%02x:%02x%02x:%02x%02x", eui64[0], eui64[1], eui64[2], eui64[3], eui64[4], eui64[5], eui64[6], eui64[7]); } void format_ipv6rvs(char *ipv6addr, const char *fwd) { const char *p = fwd + strlen(fwd); while (p >= fwd) { if (isalnum(*p)) { *(ipv6addr++) = *p; *(ipv6addr++) = '.'; } p--; } sprintf(ipv6addr, "ip6.arpa."); } int main() { char macstr[20] = {0}; char ipstr[20] = {0}; int mac[6] = {0}; char name[64] = {0}; char ipv6fwd[64] = {0}; char ipv6rvs[128] = {0}; char domain[128] = {0}; while (! feof(stdin)) { if (scanf("%*d %17s %15s %63s %*s", macstr, ipstr, name) != 3) { if (!feof(stdin)) fprintf(stderr, "Parsing error, last read %s\n", macstr); break; } if (!decode_mac(mac, macstr)) { fprintf(stderr, "MAC decode failed for %s\n", macstr); continue; } if (name[0] == '*') { if (!mkname_unknown(name, ipstr)) { fprintf(stderr, "Couldn't make name for %s\n", macstr); continue; } } name_tolower(name); format_ipv6fwd(ipv6fwd, mac); format_ipv6rvs(ipv6rvs, ipv6fwd); snprintf(domain, 128, "%s.intra.aimonen.fi.", name); printf("%s AAAA %s\n", domain, ipv6fwd); printf("%s PTR %s\n", ipv6rvs, domain); printf("\n"); } return EXIT_SUCCESS; }