telnet: dont fiddle with consctl when posting svc, cleanup
This commit is contained in:
parent
9310f981b0
commit
797ba8e6ff
1 changed files with 32 additions and 58 deletions
|
@ -11,15 +11,10 @@ int netpid;
|
||||||
int interrupted;
|
int interrupted;
|
||||||
int localecho;
|
int localecho;
|
||||||
int notkbd;
|
int notkbd;
|
||||||
|
|
||||||
static char *srv;
|
|
||||||
|
|
||||||
typedef struct Comm Comm;
|
|
||||||
struct Comm {
|
|
||||||
int returns;
|
int returns;
|
||||||
int stopped;
|
int stopped;
|
||||||
};
|
|
||||||
Comm *comm;
|
static char *srv;
|
||||||
|
|
||||||
int dodial(char*);
|
int dodial(char*);
|
||||||
void fromkbd(int);
|
void fromkbd(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,6 +86,11 @@ 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);
|
||||||
|
if(srv != nil){
|
||||||
|
if(rfork(RFPROC | RFNOWAIT | RFNOTEG) != 0)
|
||||||
|
exits("");
|
||||||
|
}
|
||||||
|
else
|
||||||
fprint(2, "connected to %s on %s\n", name, devdir);
|
fprint(2, "connected to %s on %s\n", name, devdir);
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
@ -160,7 +154,7 @@ telnet(int net)
|
||||||
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;
|
|
||||||
}
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue