git: 9front

Download patch

ref: 9a71b2157ec6e22f5a632aabbe5c9139f044cb1d
parent: 8e38accbd2d84b599bd868429fa1a045d07f0fe9
author: cinap_lenrek <cinap_lenrek@centraldogma>
date: Thu Dec 15 11:31:56 EST 2011

telnet: dont fiddle with consctl when posting svc, cleanup

--- a/sys/src/cmd/ip/telnet.c
+++ b/sys/src/cmd/ip/telnet.c
@@ -11,16 +11,11 @@
 int interrupted;
 int localecho;
 int notkbd;
+int returns;
+int stopped;
 
 static char *srv;
 
-typedef struct Comm Comm;
-struct Comm {
-	int returns;
-	int stopped;
-};
-Comm *comm;
-
 int	dodial(char*);
 void	fromkbd(int);
 void	fromnet(int);
@@ -33,7 +28,6 @@
 int	echochange(Biobuf*, int);
 int	termsub(Biobuf*, uchar*, int);
 int	xlocsub(Biobuf*, uchar*, int);
-void*	share(ulong);
 
 static int islikeatty(int);
 
@@ -46,8 +40,6 @@
 void
 main(int argc, char *argv[])
 {
-	int returns;
-
 	returns = 1;
 	ARGBEGIN{
 	case 'C':
@@ -77,9 +69,6 @@
 	opt[Term].sub = termsub;
 	opt[Xloc].sub = xlocsub;
 
-	comm = share(sizeof(comm));
-	comm->returns = returns;
-
 	telnet(dodial(argv[0]));
 }
 
@@ -97,7 +86,12 @@
 	data = dial(name, 0, devdir, 0);
 	if(data < 0)
 		fatal("%s: %r", name, 0);
-	fprint(2, "connected to %s on %s\n", name, devdir);
+	if(srv != nil){
+		if(rfork(RFPROC | RFNOWAIT | RFNOTEG) != 0)
+			exits("");
+	}
+	else
+		fprint(2, "connected to %s on %s\n", name, devdir);
 	return data;
 }
 
@@ -159,8 +153,8 @@
 		netpid = pid;
 		notify(notifyf);
 		fromkbd(net);
-		if(notkbd)
-			for(;;)
+		if (notkbd)
+			while(waitpid() != pid)
 				sleep(0);
 		if (svc)
 			remove(svc);
@@ -272,7 +266,7 @@
 		eofs = 0;
 		switch(c){
 		case '\n':	/* skip nl after string of cr's */
-			if(!opt[Binary].local && !comm->returns){
+			if(!opt[Binary].local && !returns){
 				++crnls;
 				if(freenl == 0)
 					break;
@@ -281,7 +275,7 @@
 			}
 			break;
 		case '\r':	/* first cr becomes nl, remainder dropped */
-			if(!opt[Binary].local && !comm->returns){
+			if(!opt[Binary].local && !returns){
 				if(crnls++ == 0){
 					freenl = 1;
 					c = '\n';
@@ -317,14 +311,13 @@
 	}
 }
 
-/*
- *  turn keyboard raw mode on
- */
 void
-rawon(void)
+consctlcmd(char *s)
 {
+	if(srv != nil)
+		return;
 	if(debug)
-		fprint(2, "rawon\n");
+		fprint(2, "consctl: %s\n", s);
 	if(consctl < 0)
 		consctl = open("/dev/consctl", OWRITE);
 	if(consctl < 0){
@@ -331,24 +324,25 @@
 		fprint(2, "can't open consctl: %r\n");
 		return;
 	}
-	write(consctl, "rawon", 5);
+	write(consctl, s, strlen(s));
 }
 
 /*
+ *  turn keyboard raw mode on
+ */
+void
+rawon(void)
+{
+	consctlcmd("rawon");
+}
+
+/*
  *  turn keyboard raw mode off
  */
 void
 rawoff(void)
 {
-	if(debug)
-		fprint(2, "rawoff\n");
-	if(consctl < 0)
-		consctl = open("/dev/consctl", OWRITE);
-	if(consctl < 0){
-		fprint(2, "can't open consctl: %r\n");
-		return;
-	}
-	write(consctl, "rawoff", 6);
+	consctlcmd("rawoff");
 }
 
 /*
@@ -362,7 +356,7 @@
 	char *cp;
 	int done;
 
-	comm->stopped = 1;
+	stopped = 1;
 
 	rawoff();
 	fprint(2, ">>> ");
@@ -369,7 +363,7 @@
 	for(done = 0; !done; ){
 		cp = Brdline(bp, '\n');
 		if(cp == 0){
-			comm->stopped = 0;
+			stopped = 0;
 			return -1;
 		}
 		cp[Blinelen(bp)-1] = 0;
@@ -382,7 +376,7 @@
 			done = 1;
 			break;
 		case 'q':
-			comm->stopped = 0;
+			stopped = 0;
 			return -1;
 		case 'o':
 			switch(*(cp+1)){
@@ -395,7 +389,7 @@
 			}
 			break;
 		case 'r':
-			comm->returns = !comm->returns;
+			returns = !returns;
 			done = 1;
 			break;
 		case 'i':
@@ -413,7 +407,7 @@
 	}
 
 	rawon();
-	comm->stopped = 0;
+	stopped = 0;
 	return 0;
 }
 
@@ -553,24 +547,4 @@
 
 	/* might be /mnt/term/dev/cons */
 	return strlen(buf) >= 9 && strcmp(buf+strlen(buf)-9, "/dev/cons") == 0;
-}
-
-/*
- *  create a shared segment.  Make is start 2 meg higher than the current
- *  end of process memory.
- */
-void*
-share(ulong len)
-{
-	uchar *vastart;
-
-	vastart = sbrk(0);
-	if(vastart == (void*)-1)
-		return 0;
-	vastart += 2*1024*1024;
-
-	if(segattach(0, "shared", vastart, len) == (void*)-1)
-		return 0;
-
-	return vastart;
 }
--