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

  1. /* gen_ndr.c: generate the Non Delivery Notifications from submit */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Src/submit/RCS/gen_ndr.c,v 6.0 1991/12/18 20:28:02 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Src/submit/RCS/gen_ndr.c,v 6.0 1991/12/18 20:28:02 jpo Rel $
  9.  *
  10.  * $Log: gen_ndr.c,v $
  11.  * Revision 6.0  1991/12/18  20:28:02  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16.  
  17.  
  18. #include "head.h"
  19. #include "q.h"
  20. #include "dr.h"
  21. #include <isode/cmd_srch.h>
  22.  
  23. extern char             msg_fullpath[];
  24. extern char        *loc_dom_site;
  25. extern char        *msg_unique;
  26. extern CMD_TABLE    rr_tcode[],
  27.             rr_dcode[],
  28.             rr_rcode[];
  29. extern void        err_abrt();
  30.  
  31. /* -- local routines -- */
  32. void            gen_ndr();
  33. static void        gen_ndrFORrecip();
  34. static void        gen_ndrFORsender();
  35. static void        set_DRvalues();
  36.  
  37.  
  38.  
  39.  
  40. /*----------------------  Begin  Routines  -------------------------------- */
  41.  
  42.  
  43. #define isSet(x, str)    ((str) ? str : x  -> ad_value)
  44. #define gval(x)                 ((x -> ad_type) == AD_X400_TYPE ? \
  45.                  (isSet(x, x -> ad_r400adr)) : \
  46.                  (isSet(x, x -> ad_r822adr)))
  47.  
  48. void gen_ndr(qp)
  49. Q_struct *qp;
  50. {
  51.     PP_TRACE (("submit/gen_ndr()"));
  52.  
  53.     if (qp -> Oaddress -> ad_status == AD_STAT_DRREQUIRED)
  54.         gen_ndrFORsender(qp);
  55.     else 
  56.         gen_ndrFORrecip(qp);
  57. }
  58.  
  59.  
  60.  
  61.  
  62. static void gen_ndrFORsender(qp)
  63. Q_struct *qp;
  64. {
  65.     register ADDR           *ad,
  66.                 *sender;
  67.     char            errbuf[LINESIZE];
  68.  
  69.     PP_TRACE (("submit/gen_ndrFORsender()"));
  70.  
  71.     sender = qp -> Oaddress;
  72.     sender -> ad_status = AD_STAT_DONE;
  73.     (void) sprintf (errbuf,
  74.         "Bad sender address '%s' [%s], all recips are rejected",
  75.         gval(sender), sender -> ad_parse_message);
  76.  
  77.     if (qp -> queuetime == NULLUTC)
  78.         qp -> queuetime = utcnow();
  79.  
  80.     for (ad = qp -> Raddress; ad != NULLADDR; ad = ad -> ad_next) {
  81.         if (ad -> ad_status == AD_STAT_DONE)
  82.             continue;
  83.  
  84.         ad -> ad_status = AD_STAT_DRREQUIRED;
  85.         ad -> ad_reason = DRR_NO_REASON;
  86.         if (ad -> ad_add_info)
  87.             free (ad -> ad_add_info);
  88.         ad -> ad_add_info = NULLCP;
  89.         set_DRvalues (qp, sender, ad, errbuf);
  90.     }
  91.  
  92.     if (wr_q2drfile (qp, msg_fullpath, 0) != RP_OK)
  93.         err_abrt(RP_AGN, "Error writing delivery report");
  94.  
  95.     return;
  96. }
  97.  
  98.  
  99.  
  100.  
  101. static void gen_ndrFORrecip(qp)
  102. Q_struct *qp;
  103. {
  104.     register ADDR           *ad,
  105.                 *sender;
  106.     int                     recip_err = FALSE;
  107.  
  108.     PP_TRACE (("submit/gen_ndrFORrecip()"));
  109.  
  110.     sender = qp -> Oaddress;
  111.     if (qp -> queuetime == NULLUTC)
  112.         qp -> queuetime = utcnow();
  113.  
  114.     for (ad = qp -> Raddress; ad != NULLADDR; ad = ad -> ad_next) {
  115.         if (ad -> ad_status != AD_STAT_PEND &&
  116.             ad -> ad_status != AD_STAT_DRREQUIRED)
  117.             continue;
  118.  
  119.         if (rp_isbad (ad -> ad_parse_stat) ||
  120.             ad -> ad_status == AD_STAT_DRREQUIRED)
  121.         {
  122.             recip_err = TRUE;
  123.             set_DRvalues (qp, sender, ad, NULLCP);
  124.         }
  125.     }
  126.  
  127.  
  128.     if (recip_err == FALSE) {
  129.         PP_TRACE (("submit/gen_ndrFORrecip (not generated)"));
  130.         return;
  131.     }
  132.  
  133.  
  134.     if (wr_q2drfile (qp, msg_fullpath, 0) != RP_OK)
  135.         err_abrt (RP_AGN, "Error writing DR");
  136.  
  137.     return;
  138. }
  139.  
  140. static void set_DRvalues (qp, sender, recip, errstr)
  141. Q_struct *qp;
  142. ADDR    *sender;
  143. ADDR    *recip;
  144. char    *errstr;
  145. {
  146.     char    *str, boundadd[BUFSIZ];
  147.     int    freeit = 0;
  148.  
  149.     recip -> ad_type = sender -> ad_type;
  150.  
  151.     if (recip -> ad_reason == DRR_NO_REASON) {
  152.         recip -> ad_reason = DRR_UNABLE_TO_TRANSFER;
  153.         recip -> ad_diagnostic = DRD_UNRECOGNISED_OR;
  154.     }
  155.  
  156.     if ((str = recip -> ad_add_info) == NULLCP) {
  157.         if (errstr)
  158.             str = errstr;
  159.         else 
  160.             (void) sprintf (str = boundadd,
  161.                     "Bad recipient address '%s' [%s]",
  162.                     gval(recip),
  163.                     rp_valstr (recip -> ad_parse_stat));
  164.     }
  165.     else
  166.         freeit = 1;
  167.     set_1dr (qp, recip -> ad_no, msg_unique,
  168.          recip -> ad_reason,
  169.          recip -> ad_diagnostic, str);
  170.     if (freeit)
  171.         free (str);
  172. }
  173.