| /*  | 
 |  * This file is part of the UCB release of Plan 9. It is subject to the license | 
 |  * terms in the LICENSE file found in the top-level directory of this | 
 |  * distribution and at http://akaros.cs.berkeley.edu/files/Plan9License. No | 
 |  * part of the UCB release of Plan 9, including this file, may be copied, | 
 |  * modified, propagated, or distributed except according to the terms contained | 
 |  * in the LICENSE file. | 
 |  */ | 
 | #include <stdlib.h> | 
 |  | 
 | #include <stdio.h> | 
 | #include <parlib/parlib.h> | 
 | #include <unistd.h> | 
 | #include <signal.h> | 
 | #include <fcntl.h> | 
 | #include <iplib/iplib.h> | 
 | #include <ndblib/ndb.h> | 
 |  | 
 | /* return list of ip addresses for a name */ | 
 | struct ndbtuple *ndbgetipaddr(struct ndb *db, char *val) | 
 | { | 
 | 	char *attr, *p; | 
 | 	struct ndbtuple *it, *first, *last, *next; | 
 | 	struct ndbs s; | 
 |  | 
 | 	/* already an IP address? */ | 
 | 	attr = ipattr(val); | 
 | 	if(strcmp(attr, "ip") == 0){ | 
 | 		it = ndbnew("ip", val); | 
 | 		ndbsetmalloctag(it, getcallerpc(&db)); | 
 | 		return it; | 
 | 	} | 
 |  | 
 | 	/* look it up */ | 
 | 	p = ndbgetvalue(db, &s, attr, val, "ip", &it); | 
 | 	if(p == NULL) | 
 | 		return NULL; | 
 | 	free(p); | 
 |  | 
 | 	/* remove the non-ip entries */ | 
 | 	first = last = NULL; | 
 | 	for(; it; it = next){ | 
 | 		next = it->entry; | 
 | 		if(strcmp(it->attr, "ip") == 0){ | 
 | 			if(first == NULL) | 
 | 				first = it; | 
 | 			else | 
 | 				last->entry = it; | 
 | 			it->entry = NULL; | 
 | 			it->line = first; | 
 | 			last = it; | 
 | 		} else { | 
 | 			it->entry = NULL; | 
 | 			ndbfree(it); | 
 | 		} | 
 | 	} | 
 |  | 
 | 	ndbsetmalloctag(first, getcallerpc(&db)); | 
 | 	return first; | 
 | } |