blob: 90fe107a57d2b2b75d3fdfb90469f7061e8cf270 [file] [log] [blame]
/*
* 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;
}