summaryrefslogtreecommitdiff
path: root/sys/src/libndb/ndbgetipaddr.c
blob: f34df6b2234bc9f39939f8742ff6efefd89b263f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#include <u.h>
#include <libc.h>
#include <bio.h>
#include <ndb.h>
#include <ip.h>

/* return list of ip addresses for a name */
Ndbtuple*
ndbgetipaddr(Ndb *db, char *val)
{
	char *attr, *p;
	Ndbtuple *it, *first, *last, *next;
	Ndbs s;

	/* already an IP address? */
	attr = ipattr(val);
	if(strcmp(attr, "ip") == 0){
		it = ndbnew("ip", val);
		it->line = it;
		ndbsetmalloctag(it, getcallerpc(&db));
		return it;
	}

	/* look it up */
	p = ndbgetvalue(db, &s, attr, val, "ip", &it);
	if(p == nil)
		return nil;
	free(p);
	first = last = nil;
	do {
		/* remove the non-ip entries */
		for(; it != nil; it = next){
			next = it->entry;
			if(strcmp(it->attr, "ip") == 0){
				if(first == nil)
					first = it;
				else {
					last->entry = it;
					last->line = it;
				}
				it->entry = nil;
				it->line = first;
				last = it;
			} else {
				it->entry = nil;
				ndbfree(it);
			}
		}
	} while((it = ndbsnext(&s, attr, val)) != nil);

	first = ndbdedup(first);

	ndbsetmalloctag(first, getcallerpc(&db));
	return first;
}