X-Git-Url: https://git.subgeniuskitty.com/unix-history/.git/blobdiff_plain/d702437aa46cb880f27cf5a6e59ce3d11fb776a8..297a7defe6590fca5cfbd5dbdd1bc993473f1eec:/usr/src/usr.bin/mail/cmd1.c diff --git a/usr/src/usr.bin/mail/cmd1.c b/usr/src/usr.bin/mail/cmd1.c index f1ad2a8720..942d5db689 100644 --- a/usr/src/usr.bin/mail/cmd1.c +++ b/usr/src/usr.bin/mail/cmd1.c @@ -8,10 +8,11 @@ * User commands. */ -static char *SccsId = "@(#)cmd1.c 1.1 %G%"; +static char *SccsId = "@(#)cmd1.c 2.10 %G%"; /* * Print the current active headings. + * Don't change dot if invoker didn't give an argument. */ static int screen; @@ -21,25 +22,28 @@ headers(msgvec) { register int n, mesg, flag; register struct message *mp; + int size; + size = screensize(); n = msgvec[0]; if (n != 0) - screen = (n-1)/SCREEN; + screen = (n-1)/size; if (screen < 0) screen = 0; - mp = &message[screen * SCREEN]; + mp = &message[screen * size]; if (mp >= &message[msgCount]) - mp = &message[msgCount - SCREEN]; + mp = &message[msgCount - size]; if (mp < &message[0]) mp = &message[0]; flag = 0; mesg = mp - &message[0]; - dot = mp; + if (dot != &message[n-1]) + dot = mp; for (; mp < &message[msgCount]; mp++) { mesg++; if (mp->m_flag & MDELETED) continue; - if (flag++ >= SCREEN) + if (flag++ >= size) break; printhead(mesg); sreset(); @@ -51,6 +55,36 @@ headers(msgvec) return(0); } +/* + * Set the list of alternate names for out host. + */ +local(namelist) + char **namelist; +{ + register int c; + register char **ap, **ap2, *cp; + + c = argcount(namelist) + 1; + if (c == 1) { + if (localnames == 0) + return(0); + for (ap = localnames; *ap; ap++) + printf("%s ", *ap); + printf("\n"); + return(0); + } + if (localnames != 0) + cfree((char *) localnames); + localnames = (char **) calloc(c, sizeof (char *)); + for (ap = namelist, ap2 = localnames; *ap; ap++, ap2++) { + cp = (char *) calloc(strlen(*ap) + 1, sizeof (char)); + strcpy(cp, *ap); + *ap2 = cp; + } + *ap2 = 0; + return(0); +} + /* * Scroll to the next/previous screen */ @@ -58,16 +92,17 @@ headers(msgvec) scroll(arg) char arg[]; { - register int s; + register int s, size; int cur[1]; cur[0] = 0; + size = screensize(); s = screen; switch (*arg) { case 0: case '+': s++; - if (s*SCREEN > msgCount) { + if (s * size > msgCount) { printf("On last screenful of messages\n"); return(0); } @@ -89,6 +124,32 @@ scroll(arg) return(headers(cur)); } +/* + * Compute what the screen size should be. + * We use the following algorithm: + * If user specifies with screen option, use that. + * If baud rate < 1200, use 5 + * If baud rate = 1200, use 10 + * If baud rate > 1200, use 20 + */ +screensize() +{ + register char *cp; + register int s; + + if ((cp = value("screen")) != NOSTR) { + s = atoi(cp); + if (s > 0) + return(s); + } + if (baud < B1200) + s = 5; + else if (baud == B1200) + s = 10; + else + s = 20; + return(s); +} /* * Print out the headlines for each message @@ -118,7 +179,7 @@ printhead(mesg) { struct message *mp; FILE *ibuf; - char headline[LINESIZE], wcount[10], *subjline, dispc; + char headline[LINESIZE], wcount[10], *subjline, dispc, curind; char pbuf[BUFSIZ]; int s; struct headline hl; @@ -137,24 +198,31 @@ printhead(mesg) if (subjline != NOSTR && strlen(subjline) > 28) subjline[29] = '\0'; + curind = dot == mp ? '>' : ' '; dispc = ' '; if (mp->m_flag & MSAVED) dispc = '*'; if (mp->m_flag & MPRESERVE) dispc = 'P'; + if ((mp->m_flag & (MREAD|MNEW)) == MNEW) + dispc = 'N'; + if ((mp->m_flag & (MREAD|MNEW)) == 0) + dispc = 'U'; + if (mp->m_flag & MBOX) + dispc = 'M'; parse(headline, &hl, pbuf); - sprintf(wcount, " %d/%d", mp->m_lines, mp->m_size); + sprintf(wcount, " %d/%ld", mp->m_lines, mp->m_size); s = strlen(wcount); cp = wcount + s; while (s < 7) s++, *cp++ = ' '; *cp = '\0'; if (subjline != NOSTR) - printf("%c%3d %-8s %16.16s %s \"%s\"\n", dispc, mesg, - nameof(mp), hl.l_date, wcount, subjline); + printf("%c%c%3d %-8s %16.16s %s \"%s\"\n", curind, dispc, mesg, + nameof(mp, 0), hl.l_date, wcount, subjline); else - printf("%c%3d %-8s %16.16s %s\n", dispc, mesg, - nameof(mp), hl.l_date, wcount); + printf("%c%c%3d %-8s %16.16s %s\n", curind, dispc, mesg, + nameof(mp, 0), hl.l_date, wcount); } /* @@ -192,41 +260,109 @@ pcmdlist() return(0); } +/* + * Type out messages, honor ignored fields. + */ +type(msgvec) + int *msgvec; +{ + + return(type1(msgvec, 1)); +} + +/* + * Type out messages, even printing ignored fields. + */ +Type(msgvec) + int *msgvec; +{ + + return(type1(msgvec, 0)); +} + /* * Type out the messages requested. */ +jmp_buf pipestop; -type(msgvec) +type1(msgvec, doign) int *msgvec; { register *ip; register struct message *mp; register int mesg; - int c; - FILE *ibuf; - + register char *cp; + int c, nlines; + int brokpipe(); + FILE *ibuf, *obuf; + + obuf = stdout; + if (setjmp(pipestop)) { + if (obuf != stdout) { + pipef = NULL; + pclose(obuf); + } + sigset(SIGPIPE, SIG_DFL); + return(0); + } + if (intty && outtty && (cp = value("crt")) != NOSTR) { + for (ip = msgvec, nlines = 0; *ip && ip-msgvec < msgCount; ip++) + nlines += message[*ip - 1].m_lines; + if (nlines > atoi(cp)) { + obuf = popen(MORE, "w"); + if (obuf == NULL) { + perror(MORE); + obuf = stdout; + } + else { + pipef = obuf; + sigset(SIGPIPE, brokpipe); + } + } + } for (ip = msgvec; *ip && ip-msgvec < msgCount; ip++) { mesg = *ip; touch(mesg); mp = &message[mesg-1]; dot = mp; - print(mp); + print(mp, obuf, doign); } + if (obuf != stdout) { + pipef = NULL; + pclose(obuf); + } + sigset(SIGPIPE, SIG_DFL); return(0); } +/* + * Respond to a broken pipe signal -- + * probably caused by using quitting more. + */ + +brokpipe() +{ +# ifdef VMUNIX + sigrelse(SIGPIPE); +# else + signal(SIGPIPE, brokpipe); +# endif + longjmp(pipestop, 1); +} + /* * Print the indicated message on standard output. */ -print(mp) +print(mp, obuf, doign) register struct message *mp; + FILE *obuf; { if (value("quiet") == NOSTR) - printf("Message %2d:\n", mp - &message[0] + 1); + fprintf(obuf, "Message %2d:\n", mp - &message[0] + 1); touch(mp - &message[0] + 1); - send(mp, stdout); + send(mp, obuf, doign); } /* @@ -285,9 +421,56 @@ stouch(msgvec) register int *ip; for (ip = msgvec; *ip != 0; ip++) { - touch(*ip); dot = &message[*ip-1]; + dot->m_flag |= MTOUCH; dot->m_flag &= ~MPRESERVE; } return(0); } + +/* + * Make sure all passed messages get mboxed. + */ + +mboxit(msgvec) + int msgvec[]; +{ + register int *ip; + + for (ip = msgvec; *ip != 0; ip++) { + dot = &message[*ip-1]; + dot->m_flag |= MTOUCH|MBOX; + dot->m_flag &= ~MPRESERVE; + } + return(0); +} + +/* + * List the folders the user currently has. + */ +folders() +{ + char dirname[BUFSIZ], cmd[BUFSIZ]; + int pid, s, e; + + if (getfold(dirname) < 0) { + printf("No value set for \"folder\"\n"); + return(-1); + } + switch ((pid = fork())) { + case 0: + sigchild(); + execlp("ls", "ls", dirname, 0); + clrbuf(stdout); + exit(1); + + case -1: + perror("fork"); + return(-1); + + default: + while ((e = wait(&s)) != -1 && e != pid) + ; + } + return(0); +}