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

  1. /* rfc822_validate.c: validate a syntatic rfc 822 address */
  2.  
  3. # ifndef lint
  4. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Lib/parse/RCS/rfc822_val.c,v 6.0 1991/12/18 20:23:41 jpo Rel $";
  5. # endif
  6.  
  7. /*
  8.  * $Header: /xtel/pp/pp-beta/Lib/parse/RCS/rfc822_val.c,v 6.0 1991/12/18 20:23:41 jpo Rel $
  9.  *
  10.  * $Log: rfc822_val.c,v $
  11.  * Revision 6.0  1991/12/18  20:23:41  jpo
  12.  * Release 6.0
  13.  *
  14.  */
  15.  
  16. #include "head.h"
  17. #include "adr.h"
  18.  
  19. static int rfc822_val_domain(), rfc822_val_local();
  20.  
  21. int    rfc822_validate (ad, rp)
  22. register ADDR    *ad;
  23. RP_Buf        *rp;
  24. {
  25.     /* -- some debugging statements -- */
  26.     AP_ptr    dom_ptr, hptr;
  27.     int    cont;
  28.     char    tmp[BUFSIZ];
  29.  
  30.     if (ad->aparse->ap_route) {
  31.         for (hptr = ad->aparse->ap_route, cont = TRUE;
  32.              cont == TRUE;
  33.              hptr = hptr->ap_next) {
  34.             PP_DBG(("rfc822_validate (route=%s, type=%d)",
  35.                 hptr->ap_obvalue,
  36.                 hptr->ap_obtype));
  37.             switch (hptr -> ap_ptrtype) {
  38.                 case AP_PTR_MORE:
  39.                 break;
  40.                 default:
  41.                 /* -- no more route -- */
  42.                 cont = FALSE;
  43.                 break;
  44.             }
  45.         }
  46.     }
  47.  
  48.     if (ad->aparse->ap_domain)
  49.         PP_DBG(("rfc822_validate (dmn=%s, type=%d)",
  50.             ad->aparse->ap_domain->ap_obvalue,
  51.             ad->aparse->ap_domain->ap_obtype));
  52.     
  53.     if (ad->aparse->ap_local)
  54.         PP_DBG(("rfc822_validate (dmn=%s, type=%d)",
  55.             ad->aparse->ap_local->ap_obvalue,
  56.             ad->aparse->ap_local->ap_obtype));
  57.  
  58.     if (ad->aparse->ap_local == NULLAP) {
  59.         (void) sprintf (tmp,
  60.                 "No local address in %s",
  61.                 ad->ad_value);
  62.         ad->aparse->r822_error = strdup(tmp);
  63.         fillin_822_str(ad);
  64.         return RP_BAD;
  65.     }
  66.  
  67.     /* assume have stripped excess local domains from route */
  68.     
  69.     dom_ptr = (ad->aparse->ap_route) ? 
  70.         ad->aparse->ap_route :
  71.             ad->aparse->ap_domain;
  72.  
  73.     if (dom_ptr && dom_ptr->ap_normalised != TRUE)
  74.         /* -- shouldn't happen --*/
  75.         /* normalise dom_ptr */
  76.         (void) rfc822_norm_dmn(dom_ptr, ad->aparse->dmnorder);
  77.     
  78.     fillin_822_str(ad);
  79.  
  80.     if (dom_ptr && dom_ptr->ap_islocal == FALSE)
  81.         return rfc822_val_domain(ad, dom_ptr, rp);
  82.     else
  83.         return rfc822_val_local(ad, dom_ptr, rp);
  84. }
  85.                         
  86. /*   */
  87.  
  88. static int rfc822_val_domain(ad, dom_ptr, rp)
  89. register ADDR    *ad;
  90. AP_ptr        dom_ptr;
  91. RP_Buf        *rp;
  92. {
  93.     char    tmp[BUFSIZ];
  94.     LIST_RCHAN    *rlp;
  95.     /* not local so remove local if there */
  96.     if (ad->aparse->r822_local) {
  97.         free(ad->aparse->r822_local);
  98.         ad->aparse->r822_local = NULLCP;
  99.     }
  100.  
  101.     if (dom_ptr->ap_recognised == FALSE) {
  102.         /* unrecgonised domain */
  103.         /* dom_ptr->ap_error should be filled */
  104.         /* in when normalise was done */
  105.         if (dom_ptr->ap_error) {
  106.             if (ad->aparse->r822_error)
  107.                 free(ad->aparse->r822_error);
  108.             ad->aparse->r822_error = dom_ptr->ap_error;
  109.             dom_ptr->ap_error = NULLCP;
  110.         }
  111.         return RP_BAD;
  112.     }
  113.  
  114.     /* -- look up the channel table -- */
  115.     if (ad->ad_outchan == NULLIST_RCHAN)
  116.         if (dom_ptr->ap_chankey == NULLCP) {
  117.             /* just norm in domain table */
  118.             if (ad->aparse->r822_error)
  119.                 free(ad->aparse->r822_error);
  120.             PP_NOTICE(("No routing information associated with domain '%s'",
  121.                    dom_ptr->ap_obvalue));
  122.             (void) sprintf (tmp,
  123.                     "Unrouteable domain '%s'",
  124.                     ad->aparse->ap_domain->ap_obvalue);
  125.             ad->aparse->r822_error = strdup(tmp);
  126.             return parselose (rp, RP_BAD, "%s", tmp);
  127.         } else if (tb_getchan (dom_ptr->ap_chankey,
  128.                        &(ad->ad_outchan)) != OK) {
  129.             if (ad->aparse->r822_error)
  130.                 free(ad->aparse->r822_error);
  131.             (void) sprintf (tmp,
  132.                     "Unknown domain '%s'",
  133.                     ad->aparse->ap_domain->ap_obvalue);
  134.             PP_NOTICE(("No 822 channel registered for '%s'",
  135.                    dom_ptr->ap_chankey));
  136.             ad->aparse->r822_error = strdup(tmp);
  137.             return parselose (rp, RP_BAD, "%s", tmp);
  138.         }
  139.     /* --- *** ---
  140.        Go thru list of channels. if li_mta (i.e. mta) is not set
  141.        insert the official.
  142.        --- *** --- */
  143.     for (rlp=ad->ad_outchan; rlp; rlp = rlp->li_next)
  144.         if (rlp->li_mta == NULLCP)
  145.             rlp->li_mta = strdup (dom_ptr->ap_obvalue);
  146.  
  147.     if (ad->ad_outchan == NULL) 
  148.         return RP_BAD;
  149.     return RP_AOK;
  150. }
  151.  
  152. /*   */
  153.  
  154. static int rfc822_val_local(ad, dom_ptr, rp)
  155. register ADDR    *ad;
  156. AP_ptr        dom_ptr;
  157. RP_Buf        *rp;
  158. {
  159.     if (ad->aparse->r822_local) free(ad->aparse->r822_local);
  160.     ad->aparse->r822_local = ap_p2s(NULLAP, NULLAP,
  161.                       ad->aparse->ap_local,
  162.                       NULLAP, NULLAP);
  163.  
  164.     if (dom_ptr
  165.         && dom_ptr->ap_localhub) {
  166.         if (ad->aparse->local_hub_name)
  167.             free(ad->aparse->local_hub_name);
  168.         ad->aparse->local_hub_name = strdup(dom_ptr->ap_localhub);
  169.     }
  170.         
  171.     return ad_local(ad->aparse->r822_local, ad, rp);
  172.  
  173. }
  174.  
  175. /*   */
  176.  
  177. int fillin_822_str(ad)
  178. register ADDR    *ad;
  179. {
  180.     if (ad->aparse->r822_str) free(ad->aparse->r822_str);
  181.     if (ad->aparse->full == OK)
  182.         ad->aparse->r822_str = 
  183.             ap_p2s(ad->aparse->ap_group, ad->aparse->ap_name,
  184.                    ad->aparse->ap_local, ad->aparse->ap_domain,
  185.                    ad->aparse->ap_route);
  186.     else
  187.         ad->aparse->r822_str = 
  188.             ap_p2s_nc(NULLAP, NULLAP,
  189.                   ad->aparse->ap_local, ad->aparse->ap_domain,
  190.                   ad->aparse->ap_route);
  191.         
  192. }
  193.