home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / misc / volume6 / showhook.mh < prev    next >
Text File  |  1989-03-07  |  5KB  |  230 lines

  1. Newsgroups: comp.sources.misc
  2. From: allbery@uunet.UU.NET (Brandon S. Allbery - comp.sources.misc)
  3. Subject: v06i057: MH Mail patch to allow some action to be taken when mail is read
  4. Reply-To: pbrown@gldsyd.oz.au (Peter Brown)
  5.  
  6. Posting-number: Volume 6, Issue 57
  7. Submitted-by: pbrown@gldsyd.oz.au (Peter Brown)
  8. Archive-name: showhook.mh
  9.  
  10. [On looking this over, I note a few bugs:  specifically, the use of $s instead
  11. of %s in printf()'s (!).  It also requires that MH be configured with RPATHS,
  12. at least for the sample showhook.  Oh, well  ++bsa]
  13.  
  14. The following patch to mh's show.c and the associated code allow you to set up
  15. the mail so that some action can be taken when the mail is actually read using
  16. show, prev, or next.
  17.  
  18. The file regm.c is one that I set up to send a return receipt when the mail
  19. being read has a field "Classification:  Registered" such as Qoffice lets you
  20. put in.
  21.  
  22. The file regm.c could be easily modified to take care of other circumstances.
  23.  
  24.  
  25.  
  26. # This is a shell archive.  Remove anything before this line, then
  27. # unpack it by saving it in a file and typing "sh file".  (Files
  28. # unpacked will be owned by you and have default permissions.)
  29. #
  30. # This archive contains:
  31. # show.diff regm.c
  32.  
  33. echo x - show.diff
  34. cat > "show.diff" << '//E*O*F show.diff//'
  35. 39,41d38
  36. < #define SHOWHOOKSW 12
  37. <     "showhook", 5,
  38. 66,67c63
  39. <             msgnum,
  40. <             showhook = 0;
  41. ---
  42. >             msgnum;
  43. 115,117d110
  44. <                 case SHOWHOOKSW:
  45. <                     showhook = 1;
  46. <                     continue;
  47. 243d235
  48. 251,261d242
  49. < /* The following fork exec code was put in to set up automatic responce to
  50. <    registered mail
  51. < */
  52. <     if (showhook)
  53. <            if ( fork () == 0 )
  54. <             {
  55. <             vec[0] = "showhook";
  56. <             execvp ("showhook", vec);
  57. <             adios ("showhook", "unable to exec");
  58. <             }
  59. 268c249
  60. <             (void) mhl (vecp, vec);
  61. ---
  62. >         (void) mhl (vecp, vec);
  63. //E*O*F show.diff//
  64.  
  65. echo x - regm.c
  66. cat > "regm.c" << '//E*O*F regm.c//'
  67. #define RETURNT        0x01
  68. #define FROMT        0x02
  69. #define DATET        0x04
  70. #define SUBJECTT    0x08
  71. #define CLASST        0x10
  72.  
  73. #include <stdio.h>
  74. #include <string.h>
  75.  
  76. static char    msgfname[] = { "/tmp/REGMXXXXXX" },
  77.         outfname[] = { "/tmp/REGMXXXXXX" };
  78.  
  79. main (argc, argv)
  80. int argc;
  81. char *argv[];
  82. {
  83.  
  84.     static char *args[] = { "sendmail", "-i", "-t", (char *) 0 };
  85.  
  86.     char    sender[256],
  87.         time[256],
  88.         subject[256],
  89.         buf[256],
  90.         copybuf[BUFSIZ],
  91.         **argsp,
  92.         *tokp,
  93.         c;
  94.  
  95.     int    n,
  96.         passflag = 0;
  97.  
  98.     FILE    *msgf,
  99.         *outf,
  100.         *inf;
  101.  
  102.     while (argc-- > 1)
  103.     {
  104.         mktemp (msgfname);
  105.         if ((msgf = fopen (msgfname, "w+"))  ==  (FILE *) NULL)
  106.         {
  107.             fprintf (stderr, "$s: Couldn't open file\n", argv[0]);
  108.             lgooh (1);
  109.         }
  110.         mktemp (outfname);
  111.         if ((outf = fopen (outfname, "w+"))  ==  (FILE *) NULL)
  112.         {
  113.             fprintf (stderr, "$s: Couldn't open file\n", argv[0]);
  114.             lgooh (1);
  115.         }
  116.         if ((inf = fopen (argv[argc], "r+"))  ==  (FILE *) NULL)
  117.         {
  118.             fprintf (stderr, "$s: Couldn't open %s\n",
  119.                 argv[0], argv[argc]);
  120.             lgooh (1);
  121.         }
  122.  
  123.         while (fgets (buf, 256, inf)  !=  (char *) NULL)
  124.         {
  125.             fputs (buf, outf);
  126.  
  127.             tokp = strtok (buf, " ");
  128.             if ((strcmp (tokp, "Return-Path:")) == 0)
  129.             {
  130.                 tokp = strtok (((char *) NULL), "\n");
  131.                 strcpy (sender, tokp);
  132.                 passflag |= RETURNT;
  133.                 continue;
  134.             }
  135.             if ((strcmp (tokp, "From:")) == 0  &&
  136.                 (passflag & RETURNT) != RETURNT)
  137.             {
  138.                 tokp = strtok (((char *) NULL), " \n");
  139.                 strcpy (sender, tokp);
  140.                 passflag |= FROMT;
  141.                 continue;
  142.             }
  143.             if ((strcmp (tokp, "Date:")) == 0)
  144.             {
  145.                 tokp = strtok (((char *) NULL), "\n");
  146.                 strcpy (time, tokp);
  147.                 passflag |= DATET;
  148.                 continue;
  149.             }
  150.             if ((strcmp (tokp, "Subject:")) == 0)
  151.             {
  152.                 tokp = strtok (((char *) NULL), "\n");
  153.                 strcpy (subject, tokp);
  154.                 passflag |= SUBJECTT;
  155.                 continue;
  156.             }
  157.             if ((strcmp (tokp, "Classification:")) == 0)
  158.             {
  159.                 tokp = strtok (((char *) NULL), " \n");
  160.                 if ((strcmp (tokp, "Registered")) == 0)
  161.                 {
  162.                     fseek (outf, -11L, 1);
  163.                     fprintf (outf, "Return Receipt Sent\n");
  164.                     passflag = CLASST;
  165.                 }
  166.                 else
  167.                     lgooh (0);
  168.             }
  169.  
  170.         }
  171.         if ((passflag & CLASST) != CLASST)
  172.             lgooh (0);
  173.  
  174.         fprintf (msgf, "To: %s\n", sender);
  175.         fprintf (msgf, "Subject:  Return Receipt for: %s\n", time);
  176.         fprintf (msgf, "--------\n");
  177.         fprintf (msgf, "This message acknowledges receipt of your ");
  178.         fprintf (msgf, "message of %s ", time);
  179.         fprintf (msgf, "on the subject of: %s\n", subject);
  180.  
  181.         if ( freopen( msgfname, "r", stdin) == (FILE *) NULL)
  182.         {
  183.             fprintf (stderr, "\n\n%s: unable to reopen %s\n\n",
  184.                 argv[0], msgfname);
  185.             lgooh (1);
  186.         }
  187.  
  188.         rewind (inf);
  189.         rewind (outf);
  190.  
  191.         do
  192.             {
  193.             n = fread (copybuf, sizeof (char), BUFSIZ, outf);
  194.             fwrite (copybuf, sizeof (char), n, inf);
  195.         }
  196.         while (n == BUFSIZ);
  197.  
  198.         fclose (inf);
  199.  
  200.  
  201.         if (fork ()  ==  0)
  202.         {
  203.             execv ("/usr/lib/sendmail", args);
  204.             fprintf (stderr,
  205.                 "%s: Unable to exec /usr/lib/sendmail\n",
  206.                 argv[0]);
  207.         }
  208.         else lgooh (0);
  209.     }
  210. }
  211.  
  212. lgooh (exitval)
  213. int exitval;
  214. {
  215.  
  216.     if ((unlink (msgfname)) < 0)
  217.         fprintf (stderr, "Unable to unlink %s\n", msgfname);
  218.     if ((unlink (outfname)) < 0)
  219.         fprintf (stderr, "Unable to unlink %s\n", outfname);
  220.     exit (exitval);
  221. }
  222. //E*O*F regm.c//
  223.  
  224. exit 0
  225.  
  226.  
  227.