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

  1. /* rfc8222uu.c: routine to convert from rfc822 style address to a 
  2. uucp style address via uucp chan table lookup - code adapted from mmdf 
  3. original */
  4.  
  5. # ifndef lint
  6. static char Rcsid[] = "@(#)$Header: /xtel/pp/pp-beta/Chans/uucp/RCS/rfc8222uu.c,v 6.0 1991/12/18 20:13:06 jpo Rel $";
  7. # endif
  8.  
  9. /*
  10.  * $Header: /xtel/pp/pp-beta/Chans/uucp/RCS/rfc8222uu.c,v 6.0 1991/12/18 20:13:06 jpo Rel $
  11.  *
  12.  * $Log: rfc8222uu.c,v $
  13.  * Revision 6.0  1991/12/18  20:13:06  jpo
  14.  * Release 6.0
  15.  *
  16.  */
  17.  
  18.  
  19.  
  20. #include    "util.h"
  21. #include    "chan.h"
  22. #include    "ap.h"
  23. #include    "adr.h"
  24. extern char    *strdup();
  25. extern CHAN    *mychan;
  26. extern char *uuxstr, *rindex();
  27.  
  28. extern int    ap_outtype;
  29. static char     nextnode[LINESIZE];
  30. static char     who[LINESIZE];
  31. static char    *MakeUucpFrom();
  32. static int    ScanUucpFrom();
  33.  
  34. extern char    *loc_dom_site, *loc_dom_mta;
  35.  
  36. int    rfc8222uu(host, orig, into)
  37. char    *host,
  38.     *orig,
  39.     **into;
  40. {
  41.     char        *bangptr;
  42.     char    linebuf[LINESIZE];
  43.     char        *atp, *percentp, *lp;
  44.     
  45.     AP_ptr  loc_ptr,        /* -- in case fake personal name needed -- */
  46.         dom_ptr,
  47.         ap;
  48.     char    adr[LINESIZE];
  49.  
  50.     ap_outtype = AP_PARSE_733;
  51.  
  52.     ap_norm_all_domains();
  53.     ap_use_percent ();
  54.  
  55.     if ((ap = ap_s2t(orig)) == NULLAP)
  56.     {
  57.         PP_LOG(LLOG_EXCEPTIONS,
  58.                ("Failure to parse address '%s'",orig));
  59.         return NOTOK;
  60.     }
  61.  
  62.     (void) ap_t2p(ap, (AP_ptr *) NULL, (AP_ptr *) NULL, /*&group_ptr, &name_ptr,*/
  63.                  &loc_ptr, &dom_ptr, (AP_ptr *) NULL); /*&route_ptr);*/
  64.     lp = ap_p2s_nc(NULLAP, NULLAP, loc_ptr, dom_ptr, NULLAP); /*route_ptr);*/
  65.     
  66.     atp = index(lp, '@');
  67.     if (atp != NULLCP)
  68.         *atp++ = '\0';
  69.     if (!lexequ(atp, host))
  70.         atp = NULLCP;    /* don't make path-to-foo!foo.uucp!user */
  71.     percentp = rindex(lp, '%');
  72.     if (percentp != NULLCP) {
  73.         *percentp = '\0';
  74.         if (atp)
  75.             (void) sprintf(adr, "%s!%s!%s", atp, ++percentp, lp);
  76.         else
  77.             (void) sprintf(adr, "%s!%s", ++percentp, lp);
  78.     } else if (atp) {
  79.         (void) sprintf(adr, "%s!%s", atp, lp);
  80.     } else 
  81.         (void) strcpy(adr,lp);
  82.     PP_TRACE(("address = '%s'",adr));
  83.     if (!isstr(host))
  84.         (void) strcpy(who, adr);
  85.     else {
  86.         if (tb_k2val(mychan->ch_table, host, nextnode, TRUE) == NOTOK) {
  87.             return NOTOK;
  88.         }
  89.         (void) sprintf(who, nextnode, adr);
  90.     }
  91.  
  92.     /* Extract first host name for destination */
  93.     if ((bangptr=index(who, '!')) != NULLCP)
  94.     {
  95.         /* at least one realy machine */
  96.         *bangptr++ = '\0';
  97.         (void) strcpy(nextnode, who);
  98.         (void) strcpy(who, bangptr);
  99.     } else (void) strcpy(nextnode, "");
  100.  
  101.     (void) sprintf(linebuf, "%s %s!rmail \\(%s%s\\)",
  102.         uuxstr, nextnode, *who=='~' ? "\\\\" : "", who);
  103.     PP_TRACE(("Queuing UUCP mail for %s via %s...\n",
  104.           who, nextnode));
  105.     *into = strdup(linebuf);
  106.     return OK;
  107. }
  108.  
  109. /*   */
  110. /* routine to create realfrom string */
  111.  
  112. char *
  113. findfrom (sender)
  114. char *sender;
  115. {
  116.     int     aptypesav;
  117.     char    *adr;
  118.     AP_ptr  ap;
  119.     AP_ptr  local,
  120.         domain,
  121.         route;
  122.  
  123. /* SEK have axed looking at top of file.  */
  124. /* This may not be wise - but very much neater */
  125. /* Delver has no business being given UUCP style messsages */
  126.  
  127.     if ((ap = ap_s2t (sender)) == NULLAP)
  128.     {
  129.         PP_LOG(LLOG_EXCEPTIONS,
  130.            ("Failure to parse address '%s'", sender));
  131.         return (strdup (sender));
  132.     }
  133.  
  134.     ap = ap_normalize (ap, CH_USA_PREF);
  135.     if(ap == (AP_ptr)MAYBE)
  136.         return( (char *)MAYBE);
  137.     ap_t2p (ap, (AP_ptr *) NULL, (AP_ptr *) NULL, &local, &domain, &route);
  138.     aptypesav = ap_outtype;
  139.     ap_outtype = AP_PARSE_733;
  140.     adr = ap_p2s_nc (NULLAP, NULLAP, local, domain, route);
  141.     if(adr == (char *)MAYBE){
  142.         ap_outtype = aptypesav;
  143.         return(adr);
  144.     }
  145.     if (route == NULLAP)
  146.     {
  147.         if (domain->ap_islocal == TRUE)
  148.         {
  149.             free (adr);
  150.             adr = strdup (local -> ap_obvalue);
  151.         }
  152.     }
  153.     PP_TRACE(("sender = '%s'", adr));
  154.     ap_outtype = aptypesav;
  155.  
  156.     lowerfy(adr);
  157.     return(MakeUucpFrom(adr));
  158. }
  159.  
  160. /*
  161.  * This added by pc (UKC) to generate correct 'From' lines with
  162.  * `!' separated routes for uucp sites
  163.  * the rules
  164.  *     a@b   -> b!a
  165.  *    a%b@c -> c!b!a
  166.  *    etc
  167.  *    a%b%c%d%e@x -> x!e!d!c!b!a
  168.  *    This is done by a call to a recursive routine which I hope is OK
  169.  */
  170. static
  171. char *
  172. MakeUucpFrom(adr)
  173. char *adr;
  174. {    char *new;
  175.     register char *site;
  176.     
  177.     /*NOSTRICT*/
  178.     if ((new = malloc((unsigned)strlen(adr)+1)) == (char *)0)
  179.         return ((char *)NOTOK);
  180.     /*
  181.      * Can we assume that this is a legal 733 address ?
  182.      * look for the first site
  183.      */
  184.     site = rindex(adr, '@');
  185.     if (site)
  186.     {    *site++ = '\0';
  187.         /*
  188.          * some input channels (notably ni_niftp) will add the
  189.          * name of the local machine into this address
  190.          * so we look for it and delete it if found
  191.          */
  192.         /*
  193.          * if not the same then put back a % to let ScanUucpFrom work
  194.          */
  195.         if (lexequ (loc_dom_site, site) != 0
  196.             && lexequ (loc_dom_mta, site) != 0)
  197.             site[-1] = '%';
  198.     }
  199.     ScanUucpFrom(new, adr);
  200.     free(adr);
  201. #ifdef DEBUG
  202.     PP_TRACE(("sender (From line) = '%s'", new));
  203. #endif
  204.       return(new);
  205. }
  206.  
  207. static int
  208. ScanUucpFrom(new, adr)
  209. register char *new;
  210. register char *adr;
  211. {    register char *site;
  212.  
  213.     /*
  214.      * This presumes that the address we are scanning is somewhat
  215.      * legal - but the @ has been replaced by a %
  216.      */
  217.     site = rindex(adr, '%');
  218.     if (site == (char *)0)
  219.     {    (void) strcpy(new, adr);
  220.         return;
  221.     }
  222.     *site++ = '\0';
  223.     (void) strcpy(new, site);
  224.     new += strlen(site);
  225.     *new++ = '!';
  226.     *new = '\0';
  227.     ScanUucpFrom(new, adr);
  228. }
  229.  
  230. int getrealfrom(orig, realfrom)
  231. ADDR    *orig;
  232. char    **realfrom;
  233. {
  234.     if ((*realfrom = findfrom(orig->ad_r822adr)) != NULLCP)
  235.         return OK;
  236.     return NOTOK;
  237. }
  238.  
  239. /* */
  240.  
  241. /*
  242.  *      LOWERFY()  -  convert string to lower case
  243.  */
  244. lowerfy (strp)
  245.     char *strp;
  246. {
  247.     while (*strp = uptolow (*strp))
  248.         strp++;
  249. }
  250.