1 #include <u.h>
2 #include <libc.h>
3 #include <ctype.h>
4 
5 /*
6  *  make an address, add the defaults
7  */
8 char *
netmkaddr(char * linear,char * defnet,char * defsrv)9 netmkaddr(char *linear, char *defnet, char *defsrv)
10 {
11 	static char addr[256];
12 	char *cp;
13 
14 	/*
15 	 *  dump network name
16 	 */
17 	cp = strchr(linear, '!');
18 	if(cp == 0){
19 		if(defnet == 0)
20 			defnet = "net";
21 		/* allow unix sockets to omit unix! prefix */
22 		if(access(linear, 0) >= 0){
23 			snprint(addr, sizeof(addr), "unix!%s", linear);
24 			return addr;
25 		}
26 		/* allow host:service in deference to Unix convention */
27 		if((cp = strchr(linear, ':')) != nil){
28 			snprint(addr, sizeof(addr), "%s!%.*s!%s",
29 				defnet, utfnlen(linear, cp-linear),
30 				linear, cp+1);
31 			return addr;
32 		}
33 		if(defsrv)
34 			snprint(addr, sizeof(addr), "%s!%s!%s",
35 				defnet, linear, defsrv);
36 		else
37 			snprint(addr, sizeof(addr), "%s!%s", defnet, linear);
38 		return addr;
39 	}
40 
41 	/*
42 	 *  if there is already a service, use it
43 	 */
44 	cp = strchr(cp+1, '!');
45 	if(cp)
46 		return linear;
47 
48 	/*
49 	 * if the network is unix, no service
50 	 */
51 	if(strncmp(linear, "unix!", 5) == 0)
52 		return linear;
53 
54 	/*
55 	 *  add default service
56 	 */
57 	if(defsrv == 0)
58 		return linear;
59 
60 	snprint(addr, sizeof(addr), "%s!%s", linear, defsrv);
61 	return addr;
62 }
63