add con
diff --git a/src/cmd/9p.c b/src/cmd/9p.c
index 2570aa3..7d218e6 100644
--- a/src/cmd/9p.c
+++ b/src/cmd/9p.c
@@ -33,11 +33,13 @@
 void xstat(int, char**);
 void xls(int, char**);
 void xrdwr(int, char**);
+void xcon(int, char**);
 
 struct {
 	char *s;
 	void (*f)(int, char**);
 } cmds[] = {
+	"con", xcon,
 	"read", xread,
 	"write", xwrite,
 	"readfd", xreadfd,
@@ -318,6 +320,61 @@
 	threadexitsall(0);	
 }
 
+void
+rdcon(void *v)
+{
+	char buf[4096];
+	CFid *fid;
+	
+	fid = v;
+	for(;;){
+		n = read(0, buf, sizeof buf);
+		if(n <= 0)
+			threadexitsall(0);
+		if(fswrite(fid, buf, n) != n)
+			fprint(2, "write: %r\n");
+	}
+}
+
+void
+xcon(int argc, char **argv)
+{
+	char buf[4096], *r, *w, *e;
+	int n, nocr;
+	CFid *fid;
+	
+	nocr = 1;
+
+	ARGBEGIN{
+	case 'r':
+		nocr = 0;
+		break;
+	default:
+		usage();
+	}ARGEND
+
+	if(argc != 1)
+		usage();
+
+	fid = xopen(argv[0], ORDWR);
+	proccreate(rdcon, fid, STACK);
+	for(;;){
+		n = fsread(fid, buf, n);
+		if(n <= 0)
+			threadexitsall(0);
+		if(nocr){
+			for(r=w=buf, e=buf+n; r<e; r++)
+				if(*r != '\r')
+					*w++ = *r;
+			n = w-buf;
+		}
+		if(write(1, buf, n) != n)
+			threadexitsall(0);
+	}
+	fsclose(fid);
+	threadexitsall(0);	
+}
+
 static char *mon[] = 
 {
 	"Jan", "Feb", "Mar", "Apr", "May", "Jun",