X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/30a4933324b382be970fecfd5dc4464d8ac268cd..773233cae4bfdd2ba4f37317fafa3d31ce7b0bed:/usr/src/cmd/cu.c diff --git a/usr/src/cmd/cu.c b/usr/src/cmd/cu.c index 39ee82c675..308e3c9434 100644 --- a/usr/src/cmd/cu.c +++ b/usr/src/cmd/cu.c @@ -26,6 +26,7 @@ char *lspeed = "300"; int ln; /* fd for comm line */ char tkill, terase; /* current input kill & erase */ +int efk; /* process of id of listener */ char c; char *connmsg[] = { @@ -78,6 +79,7 @@ sig14() int dout; int nhup; +int dbflag; /* * main: get connection, set speed for line. @@ -106,6 +108,10 @@ char *av[]; --ac; continue; } + if (equal(*av, "-d")) { + dbflag++; + continue; + } if (ac < 2) break; if (equal(*av, "-s")) @@ -151,11 +157,13 @@ char *av[]; fk = fork(); nhup = (int)signal(SIGINT, SIG_IGN); if (fk == 0) { + chwrsig(); rd(); prf("\007Lost carrier"); exit(3); } mode(1); + efk = fk; wr(); mode(0); kill(fk, SIGKILL); @@ -292,13 +300,15 @@ A: case '$': fk = fork(); if (fk == 0) { + char *shell = getenv("SHELL"); + if (shell == 0) shell = "/bin/sh"; close(1); dup(b[1] == '$'? ln:2); close(ln); mode(0); if (!nhup) signal(SIGINT, SIG_DFL); - if (b[2] == 0) execl("/bin/sh","-",0); - else execl("/bin/sh","sh","-c",b+2,0); + if (b[2] == 0) execl(shell,"-",0); + else execl(shell,"sh","-c",b+2,0); prf("Can't execute shell"); exit(~0); } @@ -332,6 +342,21 @@ A: if (x) return; if (dout) echo("<"); break; + case '>': + case ':': + { + FILE *fp; char tbuff[128]; register char *q; + sprintf(tbuff,"/tmp/cu%d",efk); + if(NULL==(fp = fopen(tbuff,"w"))) { + prf("Can't tell other demon to divert"); + break; + } + fprintf(fp,"%s\n",(b[1]=='>'?&b[2]: &b[1] )); + if(dbflag) prf("name to be written in temporary:"),prf(&b[2]); + fclose(fp); + kill(efk,SIGEMT); + } + break; case '%': dopercen(&b[2]); break; @@ -435,6 +460,60 @@ register char *s; while (*s) write(ln, s++, 1); } +/* chwrsig: Catch orders from wr process + * to instigate diversion + */ +int whoami; +chwrsig(){ + int dodiver(); + whoami = getpid(); + signal(SIGEMT,dodiver); +} +int ds,slnt; +int justrung; +dodiver(){ + static char dobuff[128], morejunk[256]; register char *cp; + FILE *fp; + justrung = 1; + signal(SIGEMT,dodiver); + sprintf(dobuff,"/tmp/cu%d",whoami); + fp = fopen(dobuff,"r"); + if(fp==NULL) prf("Couldn't open temporary"); + unlink(dobuff); + if(dbflag) { + prf("Name of temporary:"); + prf(dobuff); + } + fgets(dobuff,128,fp); fclose(fp); + if(dbflag) { + prf("Name of target file:"); + prf(dobuff); + } + for(cp = dobuff-1; *++cp; ) /* squash newline */ + if(*cp=='\n') *cp=0; + cp = dobuff; + if (*cp=='>') cp++; + if (*cp==':') { + cp++; + if(*cp==0) { + slnt ^= 1; + return; + } else { + slnt = 1; + } + } + if (ds >= 0) close(ds); + if (*cp==0) { + slnt = 0; + ds = -1; + return; + } + if (*dobuff!='>' || (ds=open(cp,1))<0) ds=creat(cp,0644); + lseek(ds, (long)0, 2); + if(ds < 0) prf("Creat failed:"), prf(cp); + if (ds<0) prf("Can't divert %s",cp+1); +} + /* * rd: read from remote: line -> 1 @@ -446,12 +525,12 @@ register char *s; rd() { - int ds,slnt; + extern int ds,slnt; char *p,*q,b[600]; p=b; ds=(-1); +agin: while (rdc(ln) == 1) { - if (ds<0) slnt=0; if (!slnt) wrc(1); *p++=c; if (c!='\n') continue; @@ -487,6 +566,10 @@ rd() lseek(ds, (long)0, 2); if (ds<0) prf("Can't divert %s",b+1); } + if(justrung) { + justrung = 0; + goto agin; + } } struct {char lobyte; char hibyte;};