#include <sys_defs.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <msg.h>
#include <mymalloc.h>
#include <inet_addr_list.h>
void inet_addr_list_init(INET_ADDR_LIST *list)
{
int init_size;
list->used = 0;
list->size = 0;
init_size = 2;
list->addrs = (struct in_addr *) mymalloc(sizeof(*list->addrs) * init_size);
list->size = init_size;
}
void inet_addr_list_append(INET_ADDR_LIST *list, struct in_addr * addr)
{
char *myname = "inet_addr_list_append";
int new_size;
if (msg_verbose > 1)
msg_info("%s: %s", myname, inet_ntoa(*addr));
if (list->used >= list->size) {
new_size = list->size * 2;
list->addrs = (struct in_addr *)
myrealloc((char *) list->addrs, sizeof(*list->addrs) * new_size);
list->size = new_size;
}
list->addrs[list->used++] = *addr;
}
static int inet_addr_list_comp(const void *a, const void *b)
{
const struct in_addr *a_addr = (const struct in_addr *) a;
const struct in_addr *b_addr = (const struct in_addr *) b;
return (a_addr->s_addr - b_addr->s_addr);
}
void inet_addr_list_uniq(INET_ADDR_LIST *list)
{
int n;
int m;
qsort((void *) list->addrs, list->used,
sizeof(list->addrs[0]), inet_addr_list_comp);
for (m = n = 0; m < list->used; m++, n++) {
if (m != n)
list->addrs[n] = list->addrs[m];
while (m + 1 < list->used
&& inet_addr_list_comp((void *) &(list->addrs[n]),
(void *) &(list->addrs[m + 1])) == 0)
m += 1;
}
list->used = n;
}
void inet_addr_list_free(INET_ADDR_LIST *list)
{
myfree((char *) list->addrs);
}
#ifdef TEST
#include <inet_addr_host.h>
static void inet_addr_list_print(INET_ADDR_LIST *list)
{
int n;
for (n = 0; n < list->used; n++)
msg_info("%s", inet_ntoa(list->addrs[n]));
}
int main(int argc, char **argv)
{
INET_ADDR_LIST list;
inet_addr_list_init(&list);
while (--argc && *++argv)
if (inet_addr_host(&list, *argv) == 0)
msg_fatal("host not found: %s", *argv);
msg_info("list before sort/uniq");
inet_addr_list_print(&list);
inet_addr_list_uniq(&list);
msg_info("list after sort/uniq");
inet_addr_list_print(&list);
inet_addr_list_free(&list);
return (0);
}
#endif