BSD 3 development
[unix-history] / usr / src / cmd / cu.c
index 39ee82c..308e3c9 100644 (file)
@@ -26,6 +26,7 @@ char  *lspeed = "300";
 
 int    ln;     /* fd for comm line */
 char   tkill, terase;  /* current input kill & erase */
 
 int    ln;     /* fd for comm line */
 char   tkill, terase;  /* current input kill & erase */
+int    efk;            /* process of id of listener  */
 char   c;
 
 char   *connmsg[] = {
 char   c;
 
 char   *connmsg[] = {
@@ -78,6 +79,7 @@ sig14()
 
 int    dout;
 int    nhup;
 
 int    dout;
 int    nhup;
+int    dbflag;
 
 /*
  *     main: get connection, set speed for line.
 
 /*
  *     main: get connection, set speed for line.
@@ -106,6 +108,10 @@ char *av[];
                        --ac;
                        continue;
                }
                        --ac;
                        continue;
                }
+               if (equal(*av, "-d")) {
+                       dbflag++;
+                       continue;
+               }
                if (ac < 2)
                        break;
                if (equal(*av, "-s"))
                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) {
                fk = fork();
        nhup = (int)signal(SIGINT, SIG_IGN);
        if (fk == 0) {
+               chwrsig();
                rd();
                prf("\007Lost carrier");
                exit(3);
        }
        mode(1);
                rd();
                prf("\007Lost carrier");
                exit(3);
        }
        mode(1);
+       efk = fk;
        wr();
        mode(0);
        kill(fk, SIGKILL);
        wr();
        mode(0);
        kill(fk, SIGKILL);
@@ -292,13 +300,15 @@ A:
                case '$':
                        fk = fork();
                        if (fk == 0) {
                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);
                                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);
                        }
                                prf("Can't execute shell");
                                exit(~0);
                        }
@@ -332,6 +342,21 @@ A:
                        if (x) return;
                        if (dout) echo("<");
                        break;
                        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;
                case '%':
                        dopercen(&b[2]);
                        break;
@@ -435,6 +460,60 @@ register char *s;
        while (*s)
                write(ln, s++, 1);
 }
        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
 
 /*
  *     rd: read from remote: line -> 1
@@ -446,12 +525,12 @@ register char *s;
 
 rd()
 {
 
 rd()
 {
-       int ds,slnt;
+       extern int ds,slnt;
        char *p,*q,b[600];
        p=b;
        ds=(-1);
        char *p,*q,b[600];
        p=b;
        ds=(-1);
+agin:
        while (rdc(ln) == 1) {
        while (rdc(ln) == 1) {
-               if (ds<0) slnt=0;
                if (!slnt) wrc(1);
                *p++=c;
                if (c!='\n') continue;
                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);
        }
                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;};
 }
 
 struct {char lobyte; char hibyte;};