/* 
 * 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 <sys/types.h>
#include <string.h>
#include <fcntl.h>
#include <stdio.h>
#include <unistd.h>

/* truncate functionality for now. No lib/ndb.
#include <libnet.h>
 */

/*
 *  make an address, add the defaults
 *
 *  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)
{
	/* TODO: this isn't threadsafe */
	static char addr[256];
	char *cp;

	/*
	 *  dump network name
	 */
	cp = strchr(linear, '!');
	if(cp == 0){
		if(defnet==0){
			if(defsrv)
				snprintf(addr, sizeof(addr), "net!%s!%s",
					linear, defsrv);
			else
				snprintf(addr, sizeof(addr), "net!%s", linear);
		}
		else {
			if(defsrv)
				snprintf(addr, sizeof(addr), "%s!%s!%s", defnet,
					linear, defsrv);
			else
				snprintf(addr, sizeof(addr), "%s!%s", defnet,
					linear);
		}
		return addr;
	}

	/*
	 *  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(addr, sizeof(addr), "%s!%s", linear, defsrv);

	return addr;
}
