experiment: translation from standard notations to plan 9 in netmkaddr
diff --git a/man/man3/dial.3 b/man/man3/dial.3
index 7177e53..5c64528 100644
--- a/man/man3/dial.3
+++ b/man/man3/dial.3
@@ -162,6 +162,22 @@
 if they are not specified in the address.
 It returns a pointer to static data holding the actual address to use.
 .PP
+.I Netmkaddr
+also translates Unix conventions into Plan 9 syntax.
+If 
+.I addr
+is the name of a local file or Unix domain socket,
+.I netmkaddr
+will return
+.IB unix ! addr \fR.
+If
+.I addr
+is of the form 
+.IB host : port \fR,
+.I netmkaddr
+will return
+.IB net ! host ! port \fR.
+.PP
 .I Dialparse
 parses a network address as described above
 into a network name, a Unix domain socket address,
diff --git a/src/lib9/dial.c b/src/lib9/dial.c
index dcbdc0b..88dcf56 100644
--- a/src/lib9/dial.c
+++ b/src/lib9/dial.c
@@ -118,6 +118,9 @@
 		free(buf);
 		return -1;
 	}
+	/* Allow regular files in addition to Unix sockets. */
+	if((s = open(unix, ORDWR)) >= 0)
+		return s;
 	memset(&su, 0, sizeof su);
 	su.sun_family = AF_UNIX;
 	if(strlen(unix)+1 > sizeof su.sun_path){
diff --git a/src/lib9/netmkaddr.c b/src/lib9/netmkaddr.c
index fd53f46..b476516 100644
--- a/src/lib9/netmkaddr.c
+++ b/src/lib9/netmkaddr.c
@@ -16,21 +16,25 @@
 	 */
 	cp = strchr(linear, '!');
 	if(cp == 0){
-		if(defnet==0){
-			if(defsrv)
-				snprint(addr, sizeof(addr), "net!%s!%s",
-					linear, defsrv);
-			else
-				snprint(addr, sizeof(addr), "net!%s", linear);
+		if(defnet == 0)
+			defnet = "net";
+		/* allow unix sockets to omit unix! prefix */
+		if(access(linear, 0) >= 0){
+			snprint(addr, sizeof(addr), "unix!%s", linear);
+			return addr;
 		}
-		else {
-			if(defsrv)
-				snprint(addr, sizeof(addr), "%s!%s!%s", defnet,
-					linear, defsrv);
-			else
-				snprint(addr, sizeof(addr), "%s!%s", defnet,
-					linear);
+		/* allow host:service in deference to Unix convention */
+		if((cp = strchr(linear, ':')) != nil){
+			snprint(addr, sizeof(addr), "%s!%.*s!%s", 
+				defnet, utfnlen(linear, cp-linear),
+				linear, cp+1);
+			return addr;
 		}
+		if(defsrv)
+			snprint(addr, sizeof(addr), "%s!%s!%s",
+				defnet, linear, defsrv);
+		else
+			snprint(addr, sizeof(addr), "%s!%s", defnet, linear);
 		return addr;
 	}