+
+char *cidr_from_inaddr(struct in_addr in) {
+ char *ptr1, *ptr2, *address, *out;
+ int a, b, c, d, addr, i, j = 0, k = 0;
+ int bits[32];
+
+ address = inet_ntoa(in);
+
+ ptr1 = ptr2 = address;
+ ptr2 = (char *)strchr(ptr1, '.');
+ if (!ptr2)
+ return(NULL);
+ a = atoi(ptr1);
+
+ ptr1 = ptr2 + 1;
+ ptr2 = (char *)strchr(ptr1, '.');
+ if (!ptr2)
+ return(NULL);
+ b = atoi(ptr1);
+
+ ptr1 = ptr2 + 1;
+ ptr2 = (char *)strchr(ptr1, '.');
+ if (!ptr2)
+ return(NULL);
+ c = atoi(ptr1);
+
+ ptr1 = ptr2 + 1;
+ d = atoi(ptr1);
+
+ if (a < 0 || a > 255 ||
+ b < 0 || b > 255 ||
+ c < 0 || c > 255 ||
+ d < 0 || d > 255)
+ return(NULL);
+
+ addr = d + (c*256) + (b*256*256) + (a*256*256*256);
+
+ for (i = 0; i < 32; i++) {
+ bits[i] = (addr & 1);
+ addr = (addr >> 1);
+ }
+
+ while (bits[j] == 0) {
+ j++;
+ if (j > 31) break;
+ }
+ while (bits[j] == 1) {
+ j++;
+ k++;
+ if (j > 31) break;
+ }
+
+ if (j != 32)
+ return(NULL);
+
+ out = (char *)malloc(20);
+ if (!out)
+ exit(MR_NO_MEM);
+ sprintf(out, "/%i", k);
+
+ return(out);
+}