X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/0fa68535f744e9f5686c2db1ba5109cb4d4adbc2..dcef69d277225417e8027b45b6eda2aa29d8b3c9:/usr/src/usr.bin/mail/collect.c diff --git a/usr/src/usr.bin/mail/collect.c b/usr/src/usr.bin/mail/collect.c index 674d9ec0f5..a7ed484acf 100644 --- a/usr/src/usr.bin/mail/collect.c +++ b/usr/src/usr.bin/mail/collect.c @@ -7,7 +7,7 @@ * ~ escapes. */ -static char *SccsId = "@(#)collect.c 2.2 %G%"; +static char *SccsId = "@(#)collect.c 2.13 %G%"; #include "rcv.h" #include @@ -27,7 +27,9 @@ static char *SccsId = "@(#)collect.c 2.2 %G%"; static int (*savesig)(); /* Previous SIGINT value */ static int (*savehup)(); /* Previous SIGHUP value */ +# ifdef VMUNIX static int (*savecont)(); /* Previous SIGCONT value */ +# endif VMUNIX static FILE *newi; /* File for saving away */ static FILE *newo; /* Output side of same */ static int hf; /* Ignore interrups */ @@ -45,6 +47,7 @@ collect(hp) char linebuf[LINESIZE], *cp; extern char tempMail[]; int notify(); + extern collintsig(), collhupsig(); noreset++; ibuf = obuf = NULL; @@ -53,11 +56,16 @@ collect(hp) else hf = 0; hadintr = 0; +# ifdef VMUNIX if ((savesig = sigset(SIGINT, SIG_IGN)) != SIG_IGN) sigset(SIGINT, hf ? intack : collrub), sighold(SIGINT); if ((savehup = sigset(SIGHUP, SIG_IGN)) != SIG_IGN) - sigset(SIGHUP, collrub), sighold(SIGINT); + sigset(SIGHUP, collrub), sighold(SIGHUP); savecont = sigset(SIGCONT, collcont); +# else VMUNIX + savesig = signal(SIGINT, SIG_IGN); + savehup = signal(SIGHUP, SIG_IGN); +# endif VMUNIX newi = NULL; newo = NULL; if ((obuf = fopen(tempMail, "w")) == NULL) { @@ -96,14 +104,21 @@ collect(hp) eof = 0; for (;;) { setjmp(coljmp); +# ifdef VMUNIX sigrelse(SIGINT); sigrelse(SIGHUP); +# else VMUNIX + if (savesig != SIG_IGN) + signal(SIGINT, hf ? intack : collintsig); + if (savehup != SIG_IGN) + signal(SIGHUP, collhupsig); +# endif VMUNIX flush(); if (readline(stdin, linebuf) <= 0) { if (intty && value("ignoreeof") != NOSTR) { if (++eof > 35) break; - printf("Use \"%cq\" to terminate letter\n", + printf("Use \".\" to terminate letter\n", escape); continue; } @@ -111,7 +126,8 @@ collect(hp) } eof = 0; hadintr = 0; - if (intty && equal(".", linebuf) && value("dot") != NOSTR) + if (intty && equal(".", linebuf) && + (value("dot") != NOSTR || value("ignoreeof") != NOSTR)) break; if (linebuf[0] != escape || rflag != NOSTR) { if ((t = putline(obuf, linebuf)) < 0) @@ -159,13 +175,14 @@ collect(hp) */ execute(&linebuf[2], 1); + printf("(continue)\n"); break; case '.': /* * Simulate end of file on input. */ - goto eof; + goto eofl; case 'q': case 'Q': @@ -315,7 +332,7 @@ collect(hp) case '?': if ((fbuf = fopen(THELPFILE, "r")) == NULL) { - printf("No help just now.\n"); + perror(THELPFILE); break; } t = getc(fbuf); @@ -375,12 +392,14 @@ collect(hp) break; } } -eof: +eofl: fclose(obuf); rewind(ibuf); sigset(SIGINT, savesig); sigset(SIGHUP, savehup); +# ifdef VMUNIX sigset(SIGCONT, savecont); +# endif VMUNIX noreset = 0; return(ibuf); @@ -391,7 +410,9 @@ err: fclose(obuf); sigset(SIGINT, savesig); sigset(SIGHUP, savehup); +# ifdef VMUNIX sigset(SIGCONT, savecont); +# endif VMUNIX noreset = 0; return(NULL); } @@ -427,7 +448,7 @@ exwrite(name, ibuf, f) printf("\"%s\" ", name); fflush(stdout); } - if (stat(name, &junk) >= 0) { + if (stat(name, &junk) >= 0 && (junk.st_mode & S_IFMT) == S_IFREG) { if (!f) fprintf(stderr, "%s: ", name); fprintf(stderr, "File exists\n", name); @@ -471,13 +492,15 @@ mesedit(ibuf, obuf, c) int pid, s; FILE *fbuf; register int t; - int (*sig)(), (*scont)(), foonly(); + int (*sig)(), (*scont)(), signull(); struct stat sbuf; extern char tempMail[], tempEdit[]; register char *edit; sig = sigset(SIGINT, SIG_IGN); - scont = sigset(SIGCONT, foonly); +# ifdef VMUNIX + scont = sigset(SIGCONT, signull); +# endif VMUNIX if (stat(tempEdit, &sbuf) >= 0) { printf("%s: file exists\n", tempEdit); goto out; @@ -505,6 +528,7 @@ mesedit(ibuf, obuf, c) edit = c == 'e' ? EDITOR : VISUAL; pid = vfork(); if (pid == 0) { + sigchild(); if (sig != SIG_IGN) sigsys(SIGINT, SIG_DFL); execl(edit, edit, tempEdit, 0); @@ -518,7 +542,7 @@ mesedit(ibuf, obuf, c) } while (wait(&s) != pid) ; - if (s != 0) { + if ((s & 0377) != 0) { printf("Fatal error in \"%s\"\n", edit); remove(tempEdit); goto out; @@ -547,19 +571,14 @@ mesedit(ibuf, obuf, c) fix: perror(tempEdit); out: +# ifdef VMUNIX sigset(SIGCONT, scont); +# endif VMUNIX sigset(SIGINT, sig); newi = ibuf; return(obuf); } -/* - * Currently, Berkeley virtual VAX/UNIX will not let you change the - * disposition of SIGCONT, except to trap it somewhere new. - * Hence, sigset(SIGCONT, foonly) is used to ignore continue signals. - */ -foonly() {} - /* * Pipe the message through the command. * Old message is on stdin of command; @@ -604,6 +623,7 @@ mespipe(ibuf, obuf, cmd) * stdout = new message. */ + sigchild(); close(0); dup(fileno(ibuf)); close(1); @@ -650,7 +670,6 @@ err: * the message temporary. The flag argument is 'm' if we * should shift over and 'f' if not. */ - forward(ms, obuf, f) char ms[]; FILE *obuf; @@ -676,12 +695,12 @@ forward(ms, obuf, f) touch(*ip); printf(" %d", *ip); if (f == 'm') { - if (transmit(&message[*ip-1], obuf) < 0) { + if (transmit(&message[*ip-1], obuf) < 0L) { perror(tempMail); return(-1); } } else - if (send(&message[*ip-1], obuf) < 0) { + if (send(&message[*ip-1], obuf, 0) < 0) { perror(tempMail); return(-1); } @@ -697,28 +716,30 @@ forward(ms, obuf, f) * on error. */ +long transmit(mailp, obuf) struct message *mailp; FILE *obuf; { register struct message *mp; - register int c, ch; - int n, bol; + register int ch; + long c, n; + int bol; FILE *ibuf; mp = mailp; ibuf = setinput(mp); - c = msize(mp); + c = mp->m_size; n = c; bol = 1; - while (c-- > 0) { + while (c-- > 0L) { if (bol) { bol = 0; putc('\t', obuf); n++; if (ferror(obuf)) { perror("/tmp"); - return(-1); + return(-1L); } } ch = getc(ibuf); @@ -727,7 +748,7 @@ transmit(mailp, obuf) putc(ch, obuf); if (ferror(obuf)) { perror("/tmp"); - return(-1); + return(-1L); } } return(n); @@ -751,6 +772,20 @@ collcont(s) * were previously set anyway. */ +# ifndef VMUNIX +collintsig() +{ + signal(SIGINT, SIG_IGN); + collrub(SIGINT); +} + +collhupsig() +{ + signal(SIGHUP, SIG_IGN); + collrub(SIGHUP); +} +# endif VMUNIX + collrub(s) { register FILE *dbuf; @@ -760,7 +795,9 @@ collrub(s) hadintr++; clrbuf(stdout); printf("\n(Interrupt -- one more to kill letter)\n"); +# ifdef VMUNIX sigrelse(s); +# endif VMUNIX longjmp(coljmp, 1); } fclose(newo); @@ -778,7 +815,9 @@ done: fclose(newi); sigset(SIGINT, savesig); sigset(SIGHUP, savehup); +# ifdef VMUNIX sigset(SIGCONT, savecont); +# endif VMUNIX if (rcvmode) { if (s == SIGHUP) hangup(SIGHUP); @@ -796,7 +835,6 @@ done: intack(s) { - sigrelse(SIGCONT); puts("@"); fflush(stdout); clearerr(stdin);