/*
 * 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;
}
