|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T a
Length: 8764 (0x223c) Types: TextFile Names: »ap_norm.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Lib/addr/ap_norm.c«
/* ap_norm.c: normali[zs]e an address */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/addr/RCS/ap_norm.c,v 5.0 90/09/20 16:03:54 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Lib/addr/RCS/ap_norm.c,v 5.0 90/09/20 16:03:54 pp Exp Locker: pp $ * * $Log: ap_norm.c,v $ * Revision 5.0 90/09/20 16:03:54 pp * rcsforce : 5.0 public release * */ #include "head.h" #include "chan.h" #include "ap.h" extern char *loc_dom_site; extern int ap_lex_percent; static void ap_ptinit (); /* --------------------- Begin Routines -------------------------------- */ /* Normalize a parse tree, to fill-in host references, etc. Returns: 0 if ok -1 if error */ int all_domain_norm = FALSE; ap_norm_all_domains() { all_domain_norm = TRUE; } ap_norm_first_domain() { all_domain_norm = FALSE; } AP_ptr ap_normalize (thetree, order_pref) AP_ptr thetree; /* the parse tree */ int order_pref; { struct ap_node base_node; /* first node in routing chain */ AP_ptr r822_prefptr, person_ptr, mbx_prefptr, dom_prefptr, lst_comment_prefptr, last_ptr, group_ptr, ap; int oneNorm = FALSE; ap_ninit (&base_node); ap_sqinsert (&base_node, AP_PTR_MORE, thetree); ap_ptinit (&base_node, &person_ptr, &r822_prefptr, &mbx_prefptr, &dom_prefptr, &lst_comment_prefptr, &last_ptr, &group_ptr); /* Remember "list: ;"... */ if (mbx_prefptr == NULLAP) { PP_DBG (("Lib/addr/ap_normalize/No mailbox found!")); return (base_node.ap_next); } /* Normalize all refs in source route */ if (r822_prefptr != NULLAP) { ap = r822_prefptr; for(;;) { switch (ap -> ap_ptrtype) { case AP_PTR_NIL: break; case AP_PTR_NXT: break; case AP_PTR_MORE: /* -- next is part of this address -- */ ap = ap -> ap_next; switch (ap -> ap_obtype) { case AP_DOMAIN: ap_dmnormalize (ap, order_pref); if (all_domain_norm == TRUE) continue; oneNorm = TRUE; break; case AP_DOMAIN_LITERAL: case AP_COMMENT: continue; } } break; } } if (ap_lex_percent != TRUE) { /* if JNT mail, % is treated as lexically equivalent to @, and CSNET style routes ignored. Might accept CSNET routes if someone wants this... */ if (dom_prefptr == NULLAP) { /* -- no domain, so add default and leave -- */ PP_DBG (("Lib/addr/ap_normalize/no domain")); ap_locnormalize (&base_node, &r822_prefptr, &mbx_prefptr, &dom_prefptr); } } if ((dom_prefptr != NULLAP) && (oneNorm == FALSE) && (ap_dmnormalize (dom_prefptr -> ap_next, order_pref) == OK)) { PP_DBG (("Lib/addr/ap_normali/Local reference")); if (ap_lex_percent != TRUE) ap_locnormalize (&base_node, &r822_prefptr, &mbx_prefptr, &dom_prefptr); } if (dom_prefptr == NULLAP && r822_prefptr == NULLAP) { /* -- no host references anywhere -- */ if (mbx_prefptr == NULLAP || mbx_prefptr -> ap_next -> ap_obtype == AP_GROUP_NAME || mbx_prefptr -> ap_next -> ap_obtype == AP_GROUP_START) return (base_node.ap_next); ap_append (mbx_prefptr -> ap_next, AP_DOMAIN, loc_dom_site); PP_DBG (("Lib/addr/ap_normalize/appending %s domain", loc_dom_site)); ap_dmnormalize (mbx_prefptr -> ap_next -> ap_next, order_pref); } return (base_node.ap_next); } int ap_dmnormalize (ap, order_pref) AP_ptr ap; int order_pref; { char official[LINESIZE], *subdom; int retval; if (ap == NULL) return NOTOK; retval = tb_getdomain (ap->ap_obvalue, NULLCP, official, order_pref, &subdom); if (subdom != NULLCP) free(subdom); if (retval == OK) { if (official[0]) { free (ap -> ap_obvalue); ap -> ap_obvalue = strdup (official); PP_DBG (("Lib/addr/ap_dmnormalize/Official = '%s'", official)); } } else { PP_LOG (LLOG_EXCEPTIONS, ("Lib/addr/ap_dmnormalize error: No domain ref for %s", ap -> ap_obvalue)); return (OK); /* This is not worth choking on */ /* SEK */ } return (retval); } /* --------------------- Static Routines ------------------------------- */ static void ap_ptinit (base_prefptr, person_ptr, r822_prefptr, mbx_prefptr, dom_prefptr, lst_comment_prefptr, last_ptr, group_ptr) AP_ptr base_prefptr, *person_ptr, *r822_prefptr, *mbx_prefptr, *dom_prefptr, *lst_comment_prefptr, *last_ptr, *group_ptr; { AP_ptr ap; *person_ptr = NULLAP; *r822_prefptr = NULLAP; *mbx_prefptr = NULLAP; *dom_prefptr = NULLAP; *lst_comment_prefptr = NULLAP; *last_ptr = NULLAP; *group_ptr = NULLAP; /* Need switch here to catch leading mbox or domain */ if (base_prefptr == NULLAP || base_prefptr -> ap_next == NULLAP) return; switch (base_prefptr -> ap_next -> ap_obtype) { case AP_MAILBOX: *mbx_prefptr = base_prefptr; break; case AP_DOMAIN_LITERAL: case AP_DOMAIN: *r822_prefptr = base_prefptr; break; } for (ap = base_prefptr -> ap_next; ap -> ap_obtype != AP_NIL; ap = ap -> ap_next) { *last_ptr = ap; PP_DBG (("Lib/addr/ap_ptinit/val '%s'", ap -> ap_obvalue)); switch (ap -> ap_obtype) { case AP_PERSON_NAME: PP_DBG (("Lib/addr/ap_ptinit/person_ptr")); *person_ptr = ap; break; case AP_GROUP_NAME: PP_DBG (("Lib/addr/ap_ptinit/group_ptr")); *group_ptr = ap; break; } if (ap -> ap_ptrtype == AP_PTR_NXT) break; if (ap -> ap_ptrtype == AP_PTR_NIL) break; if (ap -> ap_next == NULLAP) break; switch (ap -> ap_next -> ap_obtype) { case AP_COMMENT: PP_DBG (("Lib/addr/ap_ptinit/got comment")); *lst_comment_prefptr = ap; break; case AP_GENERIC_WORD: PP_DBG (("Lib/addr/ap_ptinit/got word")); if (*mbx_prefptr != NULLAP) break; case AP_MAILBOX: PP_DBG (("Lib/addr/ap_ptinit/got mbox pref")); /* -- one before the mbox -- */ *mbx_prefptr = ap; break; case AP_DOMAIN_LITERAL: case AP_DOMAIN: if(*r822_prefptr == NULLAP && *mbx_prefptr == NULLAP){ PP_DBG (("Lib/addr/ap_ptinit/got r822_prefptr" )); *r822_prefptr = ap; } else if ((*dom_prefptr == NULLAP) && (*mbx_prefptr != NULLAP)) { /* -- need mailbox befor domain -- */ PP_DBG (("%s%s", "Lib/addr/ap_ptinit/", "got dom_prefptr")); *dom_prefptr = ap; } break; } } if (*last_ptr == NULLAP) PP_DBG (("Lib/addr/ap_ptinit/no last_ptr")); else PP_DBG (("Lib/addr/ap_ptinit/last_ptr '%s'", (*last_ptr) -> ap_obvalue)); } /* --------------------- Not JNTMAIL ----------------------------------- */ ap_locnormalize (obase_ptr, or822_prefptr, ombx_prefptr, odom_prefptr) AP_ptr obase_ptr, *or822_prefptr, *ombx_prefptr, *odom_prefptr; { /* -- tear local-part apart -- */ struct ap_node base_node; AP_ptr cur_ptr; AP_ptr r822_prefptr, person_ptr, mbx_prefptr, dom_prefptr, lst_comment_prefptr, last_ptr, group_ptr; char *cptr; PP_DBG (("Lib/addr/ap_locnormalize/parsing '%s'", (*ombx_prefptr) -> ap_next -> ap_obvalue)); ap_ninit (&base_node); ap_sqinsert (&base_node, AP_PTR_MORE, ap_s2t ((*ombx_prefptr) -> ap_next -> ap_obvalue)); ap_ptinit (&base_node, &person_ptr, &r822_prefptr, &mbx_prefptr, &dom_prefptr, &lst_comment_prefptr, &last_ptr, &group_ptr); if (dom_prefptr != NULLAP) { /* -- actually have some stuff -- */ /* -- replace old reference -- */ free ((*ombx_prefptr) -> ap_next -> ap_obvalue); (*ombx_prefptr) -> ap_next -> ap_obvalue = strdup (mbx_prefptr -> ap_next -> ap_obvalue); PP_DBG (("Lib/addr/ap_locnormalize/newlocal '%s'", (*ombx_prefptr) -> ap_next -> ap_obvalue)); if (r822_prefptr != NULLAP || *odom_prefptr != NULLAP) if (*or822_prefptr == NULLAP) /* -- initialize route pointer -- */ *or822_prefptr = obase_ptr; if (*odom_prefptr == NULLAP) *odom_prefptr = mbx_prefptr -> ap_next; else /* -- get rid of old domain reference -- */ ap_move (*or822_prefptr, *odom_prefptr); if (r822_prefptr != NULLAP) { /* -- put new chain at end of old -- */ PP_DBG (("%s%s", "Lib/addr/ap_locnormalize/", "adding new routing to end info")); for (cur_ptr = *or822_prefptr; cur_ptr -> ap_next -> ap_obtype == AP_DOMAIN || cur_ptr -> ap_next -> ap_obtype == AP_DOMAIN_LITERAL || cur_ptr -> ap_next -> ap_obtype == AP_COMMENT; cur_ptr = cur_ptr -> ap_next); ap_sqmove (cur_ptr, r822_prefptr, AP_DOMAIN); } ap_move (*odom_prefptr, dom_prefptr); } }