#include #include #include #include #include #include static int parse_cidr(char *string, uint32_t *ip, uint32_t *mask) { char host[128] = ""; char *bit_str; uint32_t bits; strncpy(host, string, sizeof(host) - 1); bit_str = strchr(host, '/'); if (!bit_str) { return -1; } *bit_str++ = '\0'; bits = atoi(bit_str); if (bits < 13 || bits > 27) { return -2; } bits = atoi(bit_str); inet_pton(AF_INET, host, ip); *mask = 0xFFFFFFFF & ~(0xFFFFFFFF << bits); return 0; } #define test_net(_ip, _net, _mask) ((_net & _mask) == (_ip & _mask)) int main(int argc, char *argv[]) { int ip, net, mask; char net_str[128] = ""; char mask_str[128] = ""; if (argc == 3 && strchr(argv[2], '/')) { /* it is cidr notation */ if (parse_cidr(argv[2], &net, &mask)) { fprintf(stderr, "usage: %s /\n", argv[0]); exit(255); } } else if (argc < 4) { /* it is net and mask notation */ fprintf(stderr, "usage: %s \n", argv[0]); exit(255); } else { inet_pton(AF_INET, argv[2], &net); inet_pton(AF_INET, argv[3], &mask); } inet_pton(AF_INET, argv[1], &ip); inet_ntop(AF_INET, &net, net_str, sizeof(net_str) -1); inet_ntop(AF_INET, &mask, mask_str, sizeof(mask_str) -1); printf("ip:\t%s\nnet:\t%s\nmask:\t%s\nmatch:\t%s\n", argv[1], net_str, mask_str, test_net(ip, net, mask) ? "yes" : "no"); return 0; }