home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Internet Tools 1993 July / Internet Tools.iso / RockRidge / mail / pp / pp-6.0 / Uip / resend / resend.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-12-18  |  5.4 KB  |  262 lines

  1. /* resend.c: resend a message onwards */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Uip/resend/RCS/resend.c,v 6.0 1991/12/18 20:42:09 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Uip/resend/RCS/resend.c,v 6.0 1991/12/18 20:42:09 jpo Rel $
  9.  *
  10.  * $Log: resend.c,v $
  11.  * Revision 6.0  1991/12/18  20:42:09  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "util.h"
  19. #include "prm.h"
  20. #include "q.h"
  21. #include "adr.h"
  22. #include "retcode.h"
  23. #include <pwd.h>
  24. #include <signal.h>
  25. #include <sys/stat.h>
  26. #include <varargs.h>
  27.  
  28. extern    char *strdup();
  29. extern UTC    utclocalise();
  30.  
  31. extern char *loc_dom_site;
  32. extern char *local_822_chan;
  33. extern char *hdr_822_bp;
  34. extern char    *ia5_bp;
  35.  
  36. static char   *username = (char *) 0;
  37.  
  38. #define ADR_TO    1
  39. #define ADR_CC    2
  40. static int    list = ADR_TO;
  41.  
  42. #define MAXADRS 100
  43. static char    *toadrs[MAXADRS];
  44. static int    tocnt = 0;
  45. static char    *ccadrs[MAXADRS];
  46. static int    cccnt = 0;
  47.  
  48. static RP_Buf    rps;
  49. static RP_Buf    *rp = &rps;
  50. static struct prm_vars prm;
  51. static Q_struct qs;
  52.  
  53. static void adios ();
  54.  
  55. #define prefix(a,b)    (lexnequ ((a), (b), strlen(a)) == 0)
  56.  
  57. main (argc, argv)
  58. int     argc;
  59. char   *argv[];
  60. {
  61.     char    *cp;
  62.  
  63.     uip_init (argv[0]);
  64.  
  65.     pgminit ();
  66.  
  67.     if (argc <= 1)
  68.         adios (NULLCP, "No addresses given");
  69.  
  70.     while (--argc > 0) {
  71.         cp = *++argv;
  72.         if (*cp == '-')
  73.             switch (cp[1]) {
  74.                 case 't':
  75.                 list = ADR_TO;
  76.                 break;
  77.                 case 'c':
  78.                 list = ADR_CC;
  79.                 break;
  80.                 case 'u':
  81.                 username = cp+2;
  82.                 if (!*username) { username = *++argv; argc--; }
  83.                 username = strdup(username);
  84.                 fprintf(stderr, "Username = `%s'\n", username);
  85.                 break;
  86.                 default:
  87.                 adios (NULLCP, "Bad switch %s", cp);
  88.             }
  89.         else if (list == ADR_TO)
  90.             toadrs[tocnt++] = cp;
  91.         else    ccadrs[cccnt++] = cp;
  92.     }
  93.     fprintf(stderr, "Now send mail\n");
  94.     sendmail ();
  95.     exit (0);
  96. }
  97.  
  98. pgminit ()
  99. {
  100.     extern struct passwd *getpwuid ();
  101.     extern char *getmailid ();
  102.     struct passwd  *pwdptr;
  103.     int     realid;
  104.  
  105.     if (!username)
  106.     {    realid = getuid ();
  107.  
  108.         if ((pwdptr = getpwuid (realid)) == (struct passwd *) NULL)
  109.             err_abrt (RP_PARM, "Unable to locate user's name");
  110.  
  111.         username = strdup (pwdptr -> pw_name);
  112.     }
  113. }
  114.  
  115. sendmail ()
  116. {
  117.     ADDR    *adr;
  118.     int i;
  119.  
  120.     prm_init (&prm);
  121.     q_init (&qs);
  122.  
  123.     qs.inbound = list_rchan_new (loc_dom_site, local_822_chan);
  124.     qs.encodedinfo.eit_types = list_bpt_new (hdr_822_bp);
  125.     list_bpt_add (&qs.encodedinfo.eit_types, list_bpt_new (ia5_bp));
  126.  
  127.     if (rp_isbad (io_init (rp)) ||
  128.         rp_isbad (io_wprm (&prm, rp)) ||
  129.         rp_isbad (io_wrq (&qs, rp)))
  130.         adios (NULLCP, "Unable to start submit: %s", rp -> rp_line);
  131.  
  132.     adr = adr_new (username, AD_822_TYPE, 0);
  133.     adr -> ad_status = AD_STAT_DONE;
  134.     adr -> ad_resp = NO;
  135.     if (rp_isbad (io_wadr (adr, AD_ORIGINATOR, rp)))
  136.         adios (NULLCP, "Bad sender %s: %s",
  137.                username, rp -> rp_line);
  138.     adr_tfree (adr);
  139.  
  140.     for ( i = 0; i < tocnt; i++) {
  141.         adr = adr_new (toadrs[i], AD_822_TYPE, 0);
  142.         if (rp_isbad (io_wadr (adr, AD_RECIPIENT, rp)))
  143.             adios (NULLCP, "Bad recipeint %s: %s",
  144.                    toadrs[i], rp -> rp_line);
  145.         adr_tfree (adr);
  146.     }
  147.     for ( i = 0; i < cccnt; i++) {
  148.         adr = adr_new (ccadrs[i], AD_822_TYPE, 0);
  149.         if (rp_isbad (io_wadr (adr, AD_RECIPIENT, rp)))
  150.             adios (NULLCP, "Bad recipeint %s: %s",
  151.                    ccadrs[i], rp -> rp_line);
  152.         adr_tfree (adr);
  153.     }
  154.  
  155.     if (rp_isbad (io_adend (rp)) ||
  156.         rp_isbad (io_tinit (rp)) ||
  157.         rp_isbad (io_tpart (hdr_822_bp, 0, rp)))
  158.         adios (NULLCP, "Can't initialise for text submission: %s",
  159.                rp -> rp_line);
  160.     
  161.     dumpheader();
  162.     doresent();
  163.  
  164.     dobody ();
  165. }
  166.  
  167. dumpheader()
  168. {
  169.     char    line[LINESIZE];
  170.  
  171.     while (fgets (line, LINESIZE, stdin) != NULL) {
  172.         if (line[0] == '\n')
  173.             break;
  174.         if (prefix ("resent-", line) ||
  175.             prefix ("received:", line) ||
  176.             prefix ("x400-received", line) ||
  177.             prefix ("via:", line))
  178.             if (rp_isbad (io_tdata ("Old-", 4)))
  179.                 adios (NULLCP, "Data Copy failed");
  180.         if (rp_isbad (io_tdata (line, strlen (line))))
  181.             adios (NULLCP, "Data copy failed");
  182.     }
  183. }
  184.  
  185. doresent()
  186. {
  187.     char    datbuf[64];
  188.     UTC    now, lut;
  189.     now = utcnow();
  190.     lut = utclocalise(now);
  191.     UTC2rfc(lut, datbuf);        /* rfc822 format date */
  192.     free ((char *) lut);
  193.     sndhdr ("Resent-Date:  ", datbuf);
  194.     sndhdr ("Resent-From:", username);
  195.     doto ();
  196.     (void) sprintf (datbuf, "1.%s", ia5_bp);
  197.     if ( rp_isbad (io_tdend (rp)) || rp_isbad (io_tpart (datbuf, 0, rp)))
  198.         adios (NULLCP, "Can't setup for body part: %s", rp -> rp_line);
  199. }
  200.  
  201. sndhdr (name, contents)
  202. char    name[],
  203.     contents[];
  204. {
  205.     char    linebuf[LINESIZE];
  206.  
  207.     (void) sprintf (linebuf, "%-10s%s\n", name, contents);
  208.     if (rp_isbad (io_tdata (linebuf, strlen (linebuf))))
  209.         adios (NULLCP, "Data Copy failed");
  210. }
  211.  
  212. doto ()
  213. {
  214.     register int    i;
  215.  
  216.     for (i = 0; i < tocnt; i++)
  217.         sndhdr ("Resent-To:", toadrs[i]);
  218.     for (i = 0; i < cccnt; i++)
  219.         sndhdr ("Resent-Cc:", ccadrs[i]);
  220. }
  221.  
  222. dobody ()
  223. {
  224.     char    buffer[BUFSIZ];
  225.     register int    i;
  226.  
  227.     while (!feof (stdin) && !ferror (stdin) &&
  228.         (i = fread (buffer, sizeof (char), sizeof (buffer), stdin)) > 0)
  229.         if (rp_isbad (io_tdata (buffer, i)))
  230.             adios (NULLCP, "Problem writing body");
  231.  
  232.     if (ferror (stdin))
  233.         adios (NULLCP, "Problem reading body");
  234.     if (rp_isbad (io_tdend (rp)) || rp_isbad (io_tend (rp)))
  235.         adios (NULLCP, "Error terminating: %s", rp -> rp_line);
  236. }
  237.  
  238. #ifndef lint
  239. static void    adios (va_alist)
  240. va_dcl
  241. {
  242.     va_list ap;
  243.  
  244.     va_start (ap);
  245.  
  246.     _ll_log (pp_log_norm, LLOG_FATAL, ap);
  247.     
  248.     va_end (ap);
  249.  
  250.     _exit (1);
  251. }
  252. #else
  253. /* VARARGS2 */
  254.  
  255. static void    adios (what, fmt)
  256. char   *what,
  257.        *fmt;
  258. {
  259.     adios (what, fmt);
  260. }
  261. #endif
  262.