|
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 o
Length: 5944 (0x1738) Types: TextFile Names: »or_or2rbits.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0 └─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z« └─⟦e5a54fb17⟧ └─⟦this⟧ »pp-5.0/Lib/or/or_or2rbits.c«
/* or_or2rbits.c: break or into bits */ # ifndef lint static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/or/RCS/or_or2rbits.c,v 5.0 90/09/20 16:08:22 pp Exp Locker: pp $"; # endif /* * $Header: /cs/research/pp/hubris/pp-beta/Lib/or/RCS/or_or2rbits.c,v 5.0 90/09/20 16:08:22 pp Exp Locker: pp $ * * $Log: or_or2rbits.c,v $ * Revision 5.0 90/09/20 16:08:22 pp * rcsforce : 5.0 public release * */ #include "or.h" #include "util.h" #include "table.h" extern char *loc_dom_site; extern char or_error[]; extern char *or2rfc_tbl; static Table *tb_or2rfc; /* --- definitions --- */ #define NO_MATCH 0 #define OU_O_MATCH 1 #define PRMD_ADMD_C_MATCH 2 /* -- local routines -- */ int or_or2rbits(); static get_psORasc(); /* --------------------- Begin Routines -------------------------------- */ /* --- Get local + domain from or --- */ int or_or2rbits (or, local, domain) OR_ptr or; char *local; char *domain; { OR_ptr ptr, dptr, tptr; char buf[LINESIZE], tbuf[LINESIZE], loc_ps[LINESIZE], /* --- Printable String --- */ dom_ps[LINESIZE], /* --- Printable String --- */ *indptr; int match_found; PP_DBG (("Lib/or_or2rbits()")); if (tb_or2rfc == NULLTBL) if ((tb_or2rfc = tb_nm2struct (or2rfc_tbl)) == NULLTBL) { PP_LOG (LLOG_EXCEPTIONS, ("Lib/or_or2rbits : or2rfc table not found!")); sprintf (or_error, "No or2rfc table!"); return NOTOK; } if (or_add_atsigns (&or) == NOTOK) return NOTOK; /* --- See how much we can domain check against --- */ for (ptr = or; ptr -> or_next != NULLOR; ptr = ptr -> or_next) if (ptr -> or_type > OR_OU) break; /* --- pointing to the first non-dom compt --- */ if (ptr != or) { ptr = ptr -> or_prev; dptr = ptr; /* --- move until we find a match --- */ for (; ptr != NULLOR; ptr = ptr->or_prev) { or_or2dmn (NULLOR, ptr, buf); if (tb_k2val (tb_or2rfc, buf, tbuf) != OK) continue; match_found = or_or2rbits_atsigns (ptr); switch (match_found) { case NO_MATCH: break; case PRMD_ADMD_C_MATCH: goto doexplicit; case OU_O_MATCH: dptr = ptr; break; } /* --- check that tbuf is a valid domain syntax --- */ if (or_or2rbits_ckdmn (tbuf) == NOTOK) goto doexplicit; /* --- get local and domain parts --- */ if (match_found == NO_MATCH) if (or_or2rbits_match (ptr, tptr, &dptr) == NOTOK) goto doexplicit; dom_ps[0] ='\0'; for (tptr = dptr; tptr != ptr; tptr = tptr->or_prev) if (lexequ (tptr -> or_value, "@") == 0) dptr = tptr -> or_prev; for (tptr = dptr; tptr != ptr; tptr = tptr->or_prev) { (void) strcat (dom_ps, tptr -> or_value); (void) strcat (dom_ps, "."); } (void) strcat (dom_ps, tbuf); get_psORasc (dom_ps, domain); tptr = dptr -> or_next; if (or_delete_atsigns (&tptr) == NOTOK) return NOTOK; tptr -> or_prev = NULLOR; or_or2std (tptr, loc_ps, TRUE); if (loc_ps[strlen (loc_ps) - 1] == '/') or_or2std (tptr, loc_ps, FALSE); get_psORasc (loc_ps, local); tptr -> or_prev = dptr; PP_DBG (( "Lib/or_or2rbits DMN encoded local='%s', dmn='%s'", local, domain )); if (or_delete_atsigns (&or) == NOTOK) return NOTOK; return OK; } /* end of for */ } /* end of if */ doexplicit: /* --- Do full LHS encoding --- */ if (or_delete_atsigns (&or) == NOTOK) return NOTOK; (void) strcpy (domain, loc_dom_site); or_or2std (or, loc_ps, FALSE); get_psORasc (loc_ps, local); PP_DBG (("Lib/or_or2rbits/Default setting local='%s' domain='%s'", local, domain)); return OK; } /* -------------------------- Static Routines ---------------------------- */ static int or_or2rbits_ckdmn (dmn) char *dmn; { char buf[LINESIZE]; char *ptr = dmn; PP_DBG (("Lib/or_or2rbits_ckdmn (%s)", dmn)); buf[0] = '\0'; while (or_gettoken (&ptr, '.', buf) == OK) if (!or_isdomsyntax (buf)) { PP_LOG (LLOG_EXCEPTIONS, ("%s '%s'", "Lib/or_or2rbits: Bad style X400 addr", dmn)); sprintf (or_error, "Bad style X400 address '%s'", dmn); return NOTOK; } return OK; } static int or_or2rbits_match (start, curr, dmn) OR_ptr start; OR_ptr curr; OR_ptr *dmn; { char buf[LINESIZE]; /* --- *** --- Build domain - match. If attribute value does not hold a valid domain syntax, then move that part to the local part. This is only done if no mapping for that attribute has been specified in the or2rfc table. Example: '/s=user/ou=org unit/prmd=valid/admd=gold 400/c=gb/' will be RFC987 mapped to: '"/s=user/ou=org unit/"@valid.gold-400.gb' --- *** --- */ for (curr = *dmn; curr != start; curr = curr -> or_prev) { get_psORasc (curr -> or_value, buf); if ((!or_isdomsyntax (buf)) && (lexequ (buf, "@") != 0)) { if (curr -> or_prev) *dmn = curr -> or_prev; else { PP_LOG (LLOG_EXCEPTIONS,("%s '%s'", "Lib/or_or2rbits/No OR prev", curr -> or_value)); sprintf (or_error, "No OR prev '%s'", curr->or_value); return NOTOK; } } } return OK; } /* --- match for "@" signs in the or2rfc table --- */ static int or_or2rbits_atsigns (or) OR_ptr or; { OR_ptr next = or -> or_next; /* save the value */ int type = or -> or_type; OR_ptr at; char key[LINESIZE], value[LINESIZE]; int retval; if (type < OR_OU) type++; else return NO_MATCH; at = or_new (type, NULLCP, "@"); at -> or_prev = or; at -> or_next = NULLOR; or -> or_next = at; or_or2dmn (NULLOR, at, key); retval = tb_k2val (tb_or2rfc, key, value); or -> or_next = next; at -> or_prev = at -> or_next = NULLOR; or_free (at); if (retval != OK) return NO_MATCH; if (type < OR_O) return PRMD_ADMD_C_MATCH; return OU_O_MATCH; } static get_psORasc (value, buf) char *value; char *buf; { #ifndef STRICT_1148 (void) or_ps2asc (value, buf); #else (void) strcpy (buf, value); #endif }