xref: /plan9-contrib/sys/src/libndb/ndbgetipaddr.c (revision 1a4050f5b2ddf426a278e3233ccd7b6bcb0639b8)
195a264b3SDavid du Colombier #include <u.h>
295a264b3SDavid du Colombier #include <libc.h>
395a264b3SDavid du Colombier #include <bio.h>
495a264b3SDavid du Colombier #include <ndb.h>
595a264b3SDavid du Colombier #include <ip.h>
695a264b3SDavid du Colombier 
795a264b3SDavid du Colombier /* return list of ip addresses for a name */
895a264b3SDavid du Colombier Ndbtuple*
ndbgetipaddr(Ndb * db,char * val)995a264b3SDavid du Colombier ndbgetipaddr(Ndb *db, char *val)
1095a264b3SDavid du Colombier {
1157837e0bSDavid du Colombier 	char *attr, *p;
1295a264b3SDavid du Colombier 	Ndbtuple *it, *first, *last, *next;
1395a264b3SDavid du Colombier 	Ndbs s;
1495a264b3SDavid du Colombier 
1595a264b3SDavid du Colombier 	/* already an IP address? */
1695a264b3SDavid du Colombier 	attr = ipattr(val);
1795a264b3SDavid du Colombier 	if(strcmp(attr, "ip") == 0){
1895a264b3SDavid du Colombier 		it = ndbnew("ip", val);
19*1a4050f5SDavid du Colombier 		ndbsetmalloctag(it, getcallerpc(&db));
2095a264b3SDavid du Colombier 		return it;
2195a264b3SDavid du Colombier 	}
2295a264b3SDavid du Colombier 
2395a264b3SDavid du Colombier 	/* look it up */
2457837e0bSDavid du Colombier 	p = ndbgetvalue(db, &s, attr, val, "ip", &it);
2557837e0bSDavid du Colombier 	if(p == nil)
2695a264b3SDavid du Colombier 		return nil;
2757837e0bSDavid du Colombier 	free(p);
2895a264b3SDavid du Colombier 
2995a264b3SDavid du Colombier 	/* remove the non-ip entries */
3095a264b3SDavid du Colombier 	first = last = nil;
3195a264b3SDavid du Colombier 	for(; it; it = next){
3295a264b3SDavid du Colombier 		next = it->entry;
3395a264b3SDavid du Colombier 		if(strcmp(it->attr, "ip") == 0){
3495a264b3SDavid du Colombier 			if(first == nil)
3595a264b3SDavid du Colombier 				first = it;
3695a264b3SDavid du Colombier 			else
3795a264b3SDavid du Colombier 				last->entry = it;
3895a264b3SDavid du Colombier 			it->entry = nil;
3995a264b3SDavid du Colombier 			it->line = first;
4095a264b3SDavid du Colombier 			last = it;
4195a264b3SDavid du Colombier 		} else {
4295a264b3SDavid du Colombier 			it->entry = nil;
4395a264b3SDavid du Colombier 			ndbfree(it);
4495a264b3SDavid du Colombier 		}
4595a264b3SDavid du Colombier 	}
4695a264b3SDavid du Colombier 
47*1a4050f5SDavid du Colombier 	ndbsetmalloctag(first, getcallerpc(&db));
4895a264b3SDavid du Colombier 	return first;
4995a264b3SDavid du Colombier }
50