V10/ipc/libipc/ipcpath.c

Compare this file to the similar file:
Show the results in this format:

#include "defs.h"
#include <signal.h>

#define CAT(x) if (x) for(cp=x;bp-buf<sizeof(buf)-1&&*cp;) *bp++=*cp++; *bp='\0'

/*
 *	Create an ipc path that starts in the /cs directory
 *
 *	ipcpath("x", "d", "s") -> "/cs/d!x!s"
 *	ipcpath("x", "/d", "s") -> "/d!x!s"
 *	ipcpath("x!y", "d", "s") -> "/cs/x!y!s"
 *	ipcpath("x!y!z", "d", "s") -> "/cs/x!y!z"
 *	ipcpath("", "", "s") -> "/cs/s"
 *	ipcpath("x", "", "") -> "/cs/x"
 *
 *	all other combinations are undefined
 */
char *
ipcpath(machine, defdialer, service)
	char *machine;
	char *defdialer;
	char *service;
{
	char buf[256];
	static char buf2[sizeof(buf)+sizeof(CSROOT)];
	char *bp, *bang1;
	char *cp;

	bp = buf;
	if (machine!=NULL && *machine!='\0') {
		if ((bang1=strchr(machine, '!'))==NULL){
			if(defdialer!=NULL && *defdialer!='\0'){
				CAT(defdialer);
				CAT("!");
			}
			CAT(machine);
			if (service!=NULL && *service!='\0') {
				CAT("!");
				CAT(service);
			}
		} else {
			CAT(machine);
			if (strchr(bang1+1, '!')==NULL && service!=NULL
			&& *service!='\0') {
				CAT("!");
				CAT(service);
			}
		}
	} else {
		if (service!=NULL && *service!='\0') {
			CAT(service);
		}
	}
	if (*buf=='/')
		*buf2 = '\0';
	else
		strcpy(buf2, CSROOT);
	strcat(buf2, buf);
	return buf2;
}