masscan-mark-ii/src/main-readrange.c

107 lines
3.2 KiB
C

#include "main-readrange.h"
#include "masscan.h"
#include <assert.h>
/***************************************************************************
***************************************************************************/
/*static unsigned
count_cidr_bits(struct Range range)
{
unsigned i;
for (i=0; i<32; i++) {
unsigned mask = 0xFFFFFFFF >> i;
if ((range.begin & ~mask) == (range.end & ~mask)) {
if ((range.begin & mask) == 0 && (range.end & mask) == mask)
return i;
}
}
return 0;
}*/
/***************************************************************************
***************************************************************************/
static unsigned
count_cidr6_bits(struct Range6 range)
{
uint64_t i;
/* Kludge: can't handle more than 64-bits of CIDR ranges */
if (range.begin.hi != range.begin.lo)
return 0;
for (i=0; i<64; i++) {
uint64_t mask = 0xFFFFFFFFffffffffull >> i;
if ((range.begin.lo & ~mask) == (range.end.lo & ~mask)) {
if ((range.begin.lo & mask) == 0 && (range.end.lo & mask) == mask)
return (unsigned)i;
}
}
return 0;
}
/***************************************************************************
***************************************************************************/
void
main_readrange(struct Masscan *masscan)
{
struct RangeList *list4 = &masscan->targets.ipv4;
struct Range6List *list6 = &masscan->targets.ipv6;
unsigned i;
FILE *fp = stdout;
for (i=0; i<list4->count; i++) {
unsigned prefix_length;
struct Range range = list4->list[i];
if (range.begin == range.end) {
fprintf(fp, "%u.%u.%u.%u\n",
(range.begin>>24)&0xFF,
(range.begin>>16)&0xFF,
(range.begin>> 8)&0xFF,
(range.begin>> 0)&0xFF
);
} else if (range_is_cidr(range, &prefix_length)) {
fprintf(fp, "%u.%u.%u.%u/%u\n",
(range.begin>>24)&0xFF,
(range.begin>>16)&0xFF,
(range.begin>> 8)&0xFF,
(range.begin>> 0)&0xFF,
prefix_length
);
} else {
fprintf(fp, "%u.%u.%u.%u-%u.%u.%u.%u\n",
(range.begin>>24)&0xFF,
(range.begin>>16)&0xFF,
(range.begin>> 8)&0xFF,
(range.begin>> 0)&0xFF,
(range.end>>24)&0xFF,
(range.end>>16)&0xFF,
(range.end>> 8)&0xFF,
(range.end>> 0)&0xFF
);
}
}
for (i=0; i<list6->count; i++) {
struct Range6 range = list6->list[i];
ipaddress_formatted_t fmt = ipv6address_fmt(range.begin);
fprintf(fp, "%s", fmt.string);
if (!ipv6address_is_equal(range.begin, range.end)) {
unsigned cidr_bits = count_cidr6_bits(range);
if (cidr_bits) {
fprintf(fp, "/%u", cidr_bits);
} else {
fmt = ipv6address_fmt(range.end);
fprintf(fp, "-%s", fmt.string);
}
}
fprintf(fp, "\n");
}
}