| /* | 
 |  * 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 <fcntl.h> | 
 | #include <stdio.h> | 
 | #include <string.h> | 
 | #include <sys/types.h> | 
 | #include <unistd.h> | 
 |  | 
 | /* Makes an address suitable for dialing or announcing.  Takes an address along | 
 |  * with a default network and service to use if they are not specified in the | 
 |  * address. | 
 |  * | 
 |  * Returns a pointer to data in buf[buf_sz] holding the actual address to use. | 
 |  * The caller manages the memory for buf. | 
 |  * | 
 |  * If you pass in only one ! in linear, this assumes this ! was between the net | 
 |  * and the host.  If you pass in no !s, we'll build one from defnet/defsrv. */ | 
 | char *netmkaddr(char *linear, char *defnet, char *defsrv, char *buf, | 
 |                 size_t buf_sz) | 
 | { | 
 | 	char *cp; | 
 |  | 
 | 	/* | 
 | 	 *  dump network name | 
 | 	 */ | 
 | 	cp = strchr(linear, '!'); | 
 | 	if (cp == 0) { | 
 | 		if (defnet == 0) { | 
 | 			if (defsrv) | 
 | 				snprintf(buf, buf_sz, "net!%s!%s", linear, | 
 | 					 defsrv); | 
 | 			else | 
 | 				snprintf(buf, buf_sz, "net!%s", linear); | 
 | 		} else { | 
 | 			if (defsrv) | 
 | 				snprintf(buf, buf_sz, "%s!%s!%s", defnet, | 
 | 					 linear, defsrv); | 
 | 			else | 
 | 				snprintf(buf, buf_sz, "%s!%s", defnet, linear); | 
 | 		} | 
 | 		return buf; | 
 | 	} | 
 |  | 
 | 	/* | 
 | 	 *  if there is already a service, use it | 
 | 	 */ | 
 | 	cp = strchr(cp + 1, '!'); | 
 | 	if (cp) | 
 | 		return linear; | 
 |  | 
 | 	/* | 
 | 	 *  add default service | 
 | 	 */ | 
 | 	if (defsrv == 0) | 
 | 		return linear; | 
 | 	snprintf(buf, buf_sz, "%s!%s", linear, defsrv); | 
 |  | 
 | 	return buf; | 
 | } |