telnet: dont fiddle with consctl when posting svc, cleanup

This commit is contained in:
cinap_lenrek 2011-12-15 16:31:56 +01:00
parent 9310f981b0
commit 797ba8e6ff

View file

@ -11,16 +11,11 @@ int netpid;
int interrupted; int interrupted;
int localecho; int localecho;
int notkbd; int notkbd;
int returns;
int stopped;
static char *srv; static char *srv;
typedef struct Comm Comm;
struct Comm {
int returns;
int stopped;
};
Comm *comm;
int dodial(char*); int dodial(char*);
void fromkbd(int); void fromkbd(int);
void fromnet(int); void fromnet(int);
@ -33,7 +28,6 @@ char* system(int, char*);
int echochange(Biobuf*, int); int echochange(Biobuf*, int);
int termsub(Biobuf*, uchar*, int); int termsub(Biobuf*, uchar*, int);
int xlocsub(Biobuf*, uchar*, int); int xlocsub(Biobuf*, uchar*, int);
void* share(ulong);
static int islikeatty(int); static int islikeatty(int);
@ -46,8 +40,6 @@ usage(void)
void void
main(int argc, char *argv[]) main(int argc, char *argv[])
{ {
int returns;
returns = 1; returns = 1;
ARGBEGIN{ ARGBEGIN{
case 'C': case 'C':
@ -77,9 +69,6 @@ main(int argc, char *argv[])
opt[Term].sub = termsub; opt[Term].sub = termsub;
opt[Xloc].sub = xlocsub; opt[Xloc].sub = xlocsub;
comm = share(sizeof(comm));
comm->returns = returns;
telnet(dodial(argv[0])); telnet(dodial(argv[0]));
} }
@ -97,7 +86,12 @@ dodial(char *dest)
data = dial(name, 0, devdir, 0); data = dial(name, 0, devdir, 0);
if(data < 0) if(data < 0)
fatal("%s: %r", name, 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; return data;
} }
@ -159,8 +153,8 @@ telnet(int net)
netpid = pid; netpid = pid;
notify(notifyf); notify(notifyf);
fromkbd(net); fromkbd(net);
if(notkbd) if (notkbd)
for(;;) while(waitpid() != pid)
sleep(0); sleep(0);
if (svc) if (svc)
remove(svc); remove(svc);
@ -272,7 +266,7 @@ fromnet(int net)
eofs = 0; eofs = 0;
switch(c){ switch(c){
case '\n': /* skip nl after string of cr's */ case '\n': /* skip nl after string of cr's */
if(!opt[Binary].local && !comm->returns){ if(!opt[Binary].local && !returns){
++crnls; ++crnls;
if(freenl == 0) if(freenl == 0)
break; break;
@ -281,7 +275,7 @@ fromnet(int net)
} }
break; break;
case '\r': /* first cr becomes nl, remainder dropped */ case '\r': /* first cr becomes nl, remainder dropped */
if(!opt[Binary].local && !comm->returns){ if(!opt[Binary].local && !returns){
if(crnls++ == 0){ if(crnls++ == 0){
freenl = 1; freenl = 1;
c = '\n'; c = '\n';
@ -317,21 +311,29 @@ fromnet(int net)
} }
} }
/*
* turn keyboard raw mode on
*/
void void
rawon(void) consctlcmd(char *s)
{ {
if(srv != nil)
return;
if(debug) if(debug)
fprint(2, "rawon\n"); fprint(2, "consctl: %s\n", s);
if(consctl < 0) if(consctl < 0)
consctl = open("/dev/consctl", OWRITE); consctl = open("/dev/consctl", OWRITE);
if(consctl < 0){ if(consctl < 0){
fprint(2, "can't open consctl: %r\n"); fprint(2, "can't open consctl: %r\n");
return; return;
} }
write(consctl, "rawon", 5); write(consctl, s, strlen(s));
}
/*
* turn keyboard raw mode on
*/
void
rawon(void)
{
consctlcmd("rawon");
} }
/* /*
@ -340,15 +342,7 @@ rawon(void)
void void
rawoff(void) rawoff(void)
{ {
if(debug) consctlcmd("rawoff");
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);
} }
/* /*
@ -362,14 +356,14 @@ menu(Biobuf *bp, int net)
char *cp; char *cp;
int done; int done;
comm->stopped = 1; stopped = 1;
rawoff(); rawoff();
fprint(2, ">>> "); fprint(2, ">>> ");
for(done = 0; !done; ){ for(done = 0; !done; ){
cp = Brdline(bp, '\n'); cp = Brdline(bp, '\n');
if(cp == 0){ if(cp == 0){
comm->stopped = 0; stopped = 0;
return -1; return -1;
} }
cp[Blinelen(bp)-1] = 0; cp[Blinelen(bp)-1] = 0;
@ -382,7 +376,7 @@ menu(Biobuf *bp, int net)
done = 1; done = 1;
break; break;
case 'q': case 'q':
comm->stopped = 0; stopped = 0;
return -1; return -1;
case 'o': case 'o':
switch(*(cp+1)){ switch(*(cp+1)){
@ -395,7 +389,7 @@ menu(Biobuf *bp, int net)
} }
break; break;
case 'r': case 'r':
comm->returns = !comm->returns; returns = !returns;
done = 1; done = 1;
break; break;
case 'i': case 'i':
@ -413,7 +407,7 @@ menu(Biobuf *bp, int net)
} }
rawon(); rawon();
comm->stopped = 0; stopped = 0;
return 0; return 0;
} }
@ -554,23 +548,3 @@ islikeatty(int fd)
/* might be /mnt/term/dev/cons */ /* might be /mnt/term/dev/cons */
return strlen(buf) >= 9 && strcmp(buf+strlen(buf)-9, "/dev/cons") == 0; 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;
}