home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume4 / mail.fixes < prev    next >
Internet Message Format  |  1986-11-30  |  12KB

  1. From: genrad!wjh12!mirror!rs (Rich Salz)
  2. Subject: Patches to BSD4.2 mail (SysV mailx?)
  3. Newsgroups: mod.sources
  4. Approved: jpn@panda.UUCP
  5.  
  6. Mod.sources:  Volume 4, Issue 95
  7. Submitted by: mirror!rs (Rich Salz)
  8.  
  9. Some people might find the following patches to BSD4.2 Mail useful.
  10. They implement the following changes:
  11.  
  12.     1.  If you typed "~r" and left off out filename, the message
  13.     "Interpolate what file?" is very confusing; I changed it to
  14.     "Filename missing."
  15.  
  16.     2.  On our machines, "everyone" is an alias for every user.  Beginning
  17.     users often confuse the "r" and "R" commands, so that "yes I am
  18.     interested in lunch" messages go to everyone, rather than just
  19.     the sender.  If the variable "naive" is set, attempts to
  20.     "reply" when one of the recipients is "everyone" will fail.  I
  21.     put "set naive" in /usr/lib/Mail.rc.
  22.  
  23.     3.  If you "save," "write," or "copy" a message, and the name of
  24.     the file starts with a "|" the message is piped into the given
  25.     program.  Two notes: saying "s |lpr" will print the message on
  26.     the printer and also mark it for deletion; searching for a pipe
  27.     in a message subject line no longer works.
  28.  
  29.     4.  If the variable "autoquit" is set, referencing past the end of
  30.     your mailbox via "next" or "dt" will automatically close out
  31.     the message and exit.  This is implemented such that you could
  32.     ask for verification, but I didn't put that it (because it's
  33.     kind of stupid).  Basically, this means that you can use "dt"
  34.     to cycle through your mail and exit when done.
  35.  
  36. enjoy,
  37.     /rich $alz
  38.  
  39. --
  40. Rich $alz    {mit-eddie, ihnp4!inmet, wjh12, cca, datacube}!mirror!rs
  41. Mirror Systems    2067 Massachusetts Avenue  Cambridge, MA, 02140
  42. Telephone:    6,176,610,777
  43.  
  44. -------------------------------CUT. NOT A SHAR FILE----------------------
  45.  
  46. *** /src/ucb/ucb/Mail/misc/Mail.help    Fri Aug 22 02:44:18 1980
  47. --- ./misc/Mail.help    Tue Apr 22 17:36:42 1986
  48. ***************
  49. *** 16,22
  50.   c [directory]            chdir to directory or home if none given
  51.   
  52.   A <message list> consists of integers, ranges of same, or user names separated
  53. ! by spaces.  If omitted, Mail uses the last message typed.
  54.   
  55.   A <user list> consists of user names or distribution names separated by spaces.
  56.   Distribution names are defined in .sendrc in your home directory.
  57.  
  58. --- 16,22 -----
  59.   c [directory]            chdir to directory or home if none given
  60.   
  61.   A <message list> consists of integers, ranges of same, or user names separated
  62. ! by spaces.  If omitted, Mail uses the last message typed.  A <user list>
  63. ! consists of user names or distribution names separated by spaces.
  64.   
  65.   A filename can start with "|", meaning "save to pipe."
  66. ***************
  67. *** 18,22
  68.   A <message list> consists of integers, ranges of same, or user names separated
  69.   by spaces.  If omitted, Mail uses the last message typed.
  70.   
  71. ! A <user list> consists of user names or distribution names separated by spaces.
  72. ! Distribution names are defined in .sendrc in your home directory.
  73.  
  74. --- 19,22 -----
  75.   by spaces.  If omitted, Mail uses the last message typed.  A <user list>
  76.   consists of user names or distribution names separated by spaces.
  77.   
  78. ! A filename can start with "|", meaning "save to pipe."
  79. *** /src/ucb/ucb/Mail/cmd2.c    Fri Aug 12 01:22:27 1983
  80. --- ./cmd2.c    Tue Apr 22 17:58:34 1986
  81. ***************
  82. *** 56,61
  83.               if (*ip2 == NULL)
  84.                   ip2 = msgvec;
  85.           } while (ip2 != ip);
  86.           printf("No messages applicable\n");
  87.           return(1);
  88.       }
  89.  
  90. --- 56,63 -----
  91.               if (*ip2 == NULL)
  92.                   ip2 = msgvec;
  93.           } while (ip2 != ip);
  94. +         if (value("autoquit") != NOSTR)
  95. +             autoquit();
  96.           printf("No messages applicable\n");
  97.           return(1);
  98.       }
  99. ***************
  100. *** 77,82
  101.           if ((mp->m_flag & (MDELETED|MSAVED)) == 0)
  102.               break;
  103.       if (mp >= &message[msgCount]) {
  104.           printf("At EOF\n");
  105.           return(0);
  106.       }
  107.  
  108. --- 79,86 -----
  109.           if ((mp->m_flag & (MDELETED|MSAVED)) == 0)
  110.               break;
  111.       if (mp >= &message[msgCount]) {
  112. +         if (value("autoquit") != NOSTR)
  113. +             autoquit();
  114.           printf("At EOF\n");
  115.           return(0);
  116.       }
  117. ***************
  118. *** 119,125
  119.   save1(str, mark)
  120.       char str[];
  121.   {
  122. !     register int *ip, mesg;
  123.       register struct message *mp;
  124.       char *file, *disp, *cmd;
  125.       int f, *msgvec, lc, t;
  126.  
  127. --- 123,129 -----
  128.   save1(str, mark)
  129.       char str[];
  130.   {
  131. !     register int *ip, mesg, piped;
  132.       register struct message *mp;
  133.       char *file, *disp, *cmd;
  134.       int f, *msgvec, lc, t;
  135. ***************
  136. *** 141,147
  137.       }
  138.       if (f && getmsglist(str, msgvec, 0) < 0)
  139.           return(1);
  140. !     if ((file = expand(file)) == NOSTR)
  141.           return(1);
  142.       printf("\"%s\" ", file);
  143.       flush();
  144.  
  145. --- 145,153 -----
  146.       }
  147.       if (f && getmsglist(str, msgvec, 0) < 0)
  148.           return(1);
  149. !     if (piped = *file == '|')
  150. !         ;
  151. !     else if ((file = expand(file)) == NOSTR)
  152.           return(1);
  153.       printf("\"%s\" ", file);
  154.       flush();
  155. ***************
  156. *** 145,151
  157.           return(1);
  158.       printf("\"%s\" ", file);
  159.       flush();
  160. !     if (stat(file, &statb) >= 0)
  161.           disp = "[Appended]";
  162.       else
  163.           disp = "[New file]";
  164.  
  165. --- 151,159 -----
  166.           return(1);
  167.       printf("\"%s\" ", file);
  168.       flush();
  169. !     if (piped)
  170. !         disp = "[Piped]";
  171. !     else if (stat(file, &statb) >= 0)
  172.           disp = "[Appended]";
  173.       else
  174.           disp = "[New file]";
  175. ***************
  176. *** 149,155
  177.           disp = "[Appended]";
  178.       else
  179.           disp = "[New file]";
  180. !     if ((obuf = fopen(file, "a")) == NULL) {
  181.           perror(NOSTR);
  182.           return(1);
  183.       }
  184.  
  185. --- 157,163 -----
  186.           disp = "[Appended]";
  187.       else
  188.           disp = "[New file]";
  189. !     if ((obuf = piped ? popen(&file[1], "w") : fopen(file, "a")) == NULL) {
  190.           perror(NOSTR);
  191.           return(1);
  192.       }
  193. ***************
  194. *** 161,167
  195.           mp = &message[mesg-1];
  196.           if ((t = send(mp, obuf, 0)) < 0) {
  197.               perror(file);
  198. !             fclose(obuf);
  199.               return(1);
  200.           }
  201.           lc += t;
  202.  
  203. --- 169,178 -----
  204.           mp = &message[mesg-1];
  205.           if ((t = send(mp, obuf, 0)) < 0) {
  206.               perror(file);
  207. !             if (piped)
  208. !                 pclose(obuf);
  209. !             else
  210. !                 fclose(obuf);
  211.               return(1);
  212.           }
  213.           lc += t;
  214. ***************
  215. *** 172,178
  216.       fflush(obuf);
  217.       if (ferror(obuf))
  218.           perror(file);
  219. !     fclose(obuf);
  220.       printf("%s %d/%ld\n", disp, lc, cc);
  221.       return(0);
  222.   }
  223.  
  224. --- 183,192 -----
  225.       fflush(obuf);
  226.       if (ferror(obuf))
  227.           perror(file);
  228. !     if (piped)
  229. !         pclose(obuf);
  230. !     else
  231. !         fclose(obuf);
  232.       printf("%s %d/%ld\n", disp, lc, cc);
  233.       return(0);
  234.   }
  235. ***************
  236. *** 185,191
  237.   swrite(str)
  238.       char str[];
  239.   {
  240. !     register int *ip, mesg;
  241.       register struct message *mp;
  242.       register char *file, *disp;
  243.       char linebuf[BUFSIZ];
  244.  
  245. --- 199,205 -----
  246.   swrite(str)
  247.       char str[];
  248.   {
  249. !     register int *ip, mesg, piped;
  250.       register struct message *mp;
  251.       register char *file, *disp;
  252.       char linebuf[BUFSIZ];
  253. ***************
  254. *** 196,202
  255.       msgvec = (int *) salloc((msgCount + 2) * sizeof *msgvec);
  256.       if ((file = snarf(str, &f)) == NOSTR)
  257.           return(1);
  258. !     if ((file = expand(file)) == NOSTR)
  259.           return(1);
  260.       if (!f) {
  261.           *msgvec = first(0, MMNORM);
  262.  
  263. --- 210,218 -----
  264.       msgvec = (int *) salloc((msgCount + 2) * sizeof *msgvec);
  265.       if ((file = snarf(str, &f)) == NOSTR)
  266.           return(1);
  267. !     if (piped = file[0] == '|')
  268. !         ;
  269. !     else if ((file = expand(file)) == NOSTR)
  270.           return(1);
  271.       if (!f) {
  272.           *msgvec = first(0, MMNORM);
  273. ***************
  274. *** 210,215
  275.           return(1);
  276.       printf("\"%s\" ", file);
  277.       flush();
  278.       if (stat(file, &statb) >= 0)
  279.           disp = "[Appended]";
  280.       else
  281.  
  282. --- 226,233 -----
  283.           return(1);
  284.       printf("\"%s\" ", file);
  285.       flush();
  286. +     if (piped)
  287. +         disp = "[Piped]";
  288.       if (stat(file, &statb) >= 0)
  289.           disp = "[Appended]";
  290.       else
  291. ***************
  292. *** 214,220
  293.           disp = "[Appended]";
  294.       else
  295.           disp = "[New file]";
  296. !     if ((obuf = fopen(file, "a")) == NULL) {
  297.           perror(NOSTR);
  298.           return(1);
  299.       }
  300.  
  301. --- 232,238 -----
  302.           disp = "[Appended]";
  303.       else
  304.           disp = "[New file]";
  305. !     if ((obuf = piped ? popen(&file[1], "w") : fopen(file, "a")) == NULL) {
  306.           perror(NOSTR);
  307.           return(1);
  308.       }
  309. ***************
  310. *** 237,243
  311.       fflush(obuf);
  312.       if (ferror(obuf))
  313.           perror(file);
  314. !     fclose(obuf);
  315.       printf("%s %d/%d\n", disp, lc, cc);
  316.       return(0);
  317.   }
  318.  
  319. --- 255,264 -----
  320.       fflush(obuf);
  321.       if (ferror(obuf))
  322.           perror(file);
  323. !     if (piped)
  324. !         pclose(obuf);
  325. !     else
  326. !         fclose(obuf);
  327.       printf("%s %d/%d\n", disp, lc, cc);
  328.       return(0);
  329.   }
  330. ***************
  331. *** 257,262
  332.       int *flag;
  333.   {
  334.       register char *cp;
  335.   
  336.       *flag = 1;
  337.       cp = strlen(linebuf) + linebuf - 1;
  338.  
  339. --- 278,284 -----
  340.       int *flag;
  341.   {
  342.       register char *cp;
  343. +     register char *q;
  344.   
  345.       *flag = 1;
  346.       cp = strlen(linebuf) + linebuf - 1;
  347. ***************
  348. *** 270,275
  349.       *++cp = 0;
  350.   
  351.       /*
  352.        * Now search for the beginning of the file name.
  353.        */
  354.   
  355.  
  356. --- 292,306 -----
  357.       *++cp = 0;
  358.   
  359.       /*
  360. +      * See if the name has a pipe symbol in it.
  361. +      */
  362. +      if (q = index(linebuf, '|')) {
  363. +         *q = 0;
  364. +         if (q = linebuf)
  365. +             *flag = 0;
  366. +         return(q + 1);
  367. +      }
  368. +     /*
  369.        * Now search for the beginning of the file name.
  370.        */
  371.   
  372. ***************
  373. *** 315,320
  374.               list[1] = NULL;
  375.               return(type(list));
  376.           }
  377.           printf("At EOF\n");
  378.           return(0);
  379.       }
  380.  
  381. --- 346,353 -----
  382.               list[1] = NULL;
  383.               return(type(list));
  384.           }
  385. +         if (value("autoquit") != NOSTR)
  386. +             autoquit();
  387.           printf("At EOF\n");
  388.           return(0);
  389.       }
  390. ***************
  391. *** 319,324
  392.           return(0);
  393.       }
  394.       else {
  395.           printf("No more messages\n");
  396.           return(0);
  397.       }
  398.  
  399. --- 352,359 -----
  400.           return(0);
  401.       }
  402.       else {
  403. +         if (value("autoquit") != NOSTR)
  404. +             autoquit();
  405.           printf("No more messages\n");
  406.           return(0);
  407.       }
  408. ***************
  409. *** 323,328
  410.           return(0);
  411.       }
  412.   }
  413.   
  414.   /*
  415.    * Delete the indicated messages.
  416.  
  417. --- 358,376 -----
  418.           return(0);
  419.       }
  420.   }
  421. + autoquit()
  422. + {
  423. +     printf("Last message... exiting\n");
  424. +     edstop();
  425. +     sigset(SIGHUP, SIG_IGN);
  426. +     sigset(SIGINT, SIG_IGN);
  427. +     sigset(SIGQUIT, SIG_IGN);
  428. +     quit();
  429. +     exit(0);
  430. + }
  431.   
  432.   /*
  433.    * Delete the indicated messages.
  434. *** /src/ucb/ucb/Mail/cmd3.c    Fri Aug 12 01:22:28 1983
  435. --- ./cmd3.c    Tue Apr 22 12:53:46 1986
  436. ***************
  437. *** 194,199
  438.       char buf[2 * LINESIZE], **ap;
  439.       struct name *np;
  440.       struct header head;
  441.   
  442.       if (msgvec[1] != 0) {
  443.           printf("Sorry, can't reply to multiple messages at once\n");
  444.  
  445. --- 194,200 -----
  446.       char buf[2 * LINESIZE], **ap;
  447.       struct name *np;
  448.       struct header head;
  449. +     int naive;
  450.   
  451.       if (msgvec[1] != 0) {
  452.           printf("Sorry, can't reply to multiple messages at once\n");
  453. ***************
  454. *** 244,249
  455.               strcpy(buf, cp);
  456.       }
  457.       head.h_to = buf;
  458.       head.h_subject = hfield("subject", mp);
  459.       if (head.h_subject == NOSTR)
  460.           head.h_subject = hfield("subj", mp);
  461.  
  462. --- 245,252 -----
  463.               strcpy(buf, cp);
  464.       }
  465.       head.h_to = buf;
  466. +     if ((naive = value("naive") != NOSTR) && *buf && dangerous(buf))
  467. +         goto notall;
  468.       head.h_subject = hfield("subject", mp);
  469.       if (head.h_subject == NOSTR)
  470.           head.h_subject = hfield("subj", mp);
  471. ***************
  472. *** 261,266
  473.               head.h_cc = detract(np, 0);
  474.           }
  475.       }
  476.       head.h_bcc = NOSTR;
  477.       mail1(&head);
  478.       return(0);
  479.  
  480. --- 264,271 -----
  481.               head.h_cc = detract(np, 0);
  482.           }
  483.       }
  484. +     if (naive && head.h_cc != NOSTR && dangerous(head.h_cc))
  485. +         goto notall;
  486.       head.h_bcc = NOSTR;
  487.       mail1(&head);
  488.       return(0);
  489. ***************
  490. *** 264,269
  491.       head.h_bcc = NOSTR;
  492.       mail1(&head);
  493.       return(0);
  494.   }
  495.   
  496.   /*
  497.  
  498. --- 269,292 -----
  499.       head.h_bcc = NOSTR;
  500.       mail1(&head);
  501.       return(0);
  502. + notall:
  503. +     printf("Naive userse can't reply to \"everyone\".\n");
  504. +     return(1);
  505. + }
  506. + dangerous(p)
  507. +     register char *p;
  508. + {
  509. +     static char *text="everyone";
  510. +     char *index();
  511. +     if (strlen(p) >= sizeof text - 1)
  512. +     for (; p = index(p, *text); p++)
  513. +         if (!strncmp(p, text, sizeof text - 1))
  514. +         return(1);
  515. +     return(0);
  516.   }
  517.   
  518.   /*
  519. *** /src/ucb/ucb/Mail/collect.c    Fri Aug 12 01:22:28 1983
  520. --- ./collect.c    Mon Apr 21 16:42:21 1986
  521. ***************
  522. *** 261,267
  523.               while (any(*cp, " \t"))
  524.                   cp++;
  525.               if (*cp == '\0') {
  526. !                 printf("Interpolate what file?\n");
  527.                   break;
  528.               }
  529.               cp = expand(cp);
  530.  
  531. --- 261,267 -----
  532.               while (any(*cp, " \t"))
  533.                   cp++;
  534.               if (*cp == '\0') {
  535. !                 printf("Filename missing!?\n");
  536.                   break;
  537.               }
  538.               cp = expand(cp);
  539.  
  540. ---------- end of submission -----------
  541.