|
|
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: 4145 (0x1031)
Types: TextFile
Names: »ad_getlocal.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Lib/parse/ad_getlocal.c«
/* ad_getlocal.c: get the local part of the address */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/parse/RCS/ad_getlocal.c,v 5.0 90/09/20 16:09:16 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Lib/parse/RCS/ad_getlocal.c,v 5.0 90/09/20 16:09:16 pp Exp Locker: pp $
*
* $Log: ad_getlocal.c,v $
* Revision 5.0 90/09/20 16:09:16 pp
* rcsforce : 5.0 public release
*
*/
#include "head.h"
#include "adr.h"
#include "alias.h"
#include "ap.h"
#include "or.h"
#include "chan.h"
#include "list_rchan.h"
static char *x440_getlocal(),
*rfc822_getlocal(),
*local_getlocal(),
*local_alias_check(),
*local_user_check();
extern char *loc_dom_site,
*loc_dom_mta,
*locsubdom;
extern int topParse;
char *ad_getlocal(addr, type)
char *addr;
int type;
{
if (type == AD_X400_TYPE)
return x440_getlocal(addr);
else
return rfc822_getlocal(addr);
}
/* \f
*/
static char *rfc822_getlocal(addr)
char *addr;
{
AP_ptr tree,
local,
domain;
char official[LINESIZE], mta_key[LINESIZE];
char *ltablepref;
char *retstr = NULLCP;
int weareTopParse = FALSE;
if (topParse == TRUE) {
weareTopParse = TRUE;
topParse = FALSE;
}
tree = ap_s2t(addr);
tree = ap_normalize(tree, 0);
if (tree == NULLAP
|| tree == (AP_ptr) NOTOK)
return NULLCP;
(void) ap_t2p (tree, (AP_ptr *)0, (AP_ptr*)0, &local, &domain,
(AP_ptr*)0);
if (domain == NULLAP ||
(lexequ(domain->ap_obvalue, loc_dom_site) == 0
|| lexequ(domain->ap_obvalue, loc_dom_mta) == 0))
/* local */
retstr = local_getlocal(local->ap_obvalue, NULLCP);
else {
if (tb_getdomain (domain -> ap_obvalue, mta_key, official,
CH_USA_PREF, <ablepref) == OK &&
ltablepref) {
retstr = local_getlocal (local -> ap_obvalue,
ltablepref);
free (ltablepref);
}
}
if (weareTopParse == TRUE) {
freeAliasList();
topParse = TRUE;
}
ap_sqdelete(tree, NULLAP);
return retstr;
}
/* \f
*/
static char *x440_getlocal(addr)
char *addr;
{
OR_ptr or;
char tbuf[LINESIZE],
*retstr = NULLCP;
int type;
char *ltablepref;
int weareTopParse = FALSE;
if (topParse == TRUE) {
weareTopParse = TRUE;
topParse = FALSE;
}
if ((or = or_std2or(addr)) == NULLOR)
return NULLCP;
if (or_check(&or, tbuf, &type, <ablepref) != NOTOK
&& type == OR_ISLOCAL)
retstr = local_getlocal(tbuf, ltablepref);
if (ltablepref) free (ltablepref);
or_free(or);
if (weareTopParse == TRUE) {
freeAliasList();
topParse = TRUE;
}
return retstr;
}
/* \f
*/
static char *local_getlocal(loc, ltablepref)
char *loc, *ltablepref;
{
ALIAS alias_struct,
*alp = &alias_struct;
switch (tb_getalias (loc, alp, ltablepref)) {
case NOTOK:
/* -- routine or table error -- */
return NULLCP;
case OK:
/* -- found, do alias check -- */
return local_alias_check (loc, alp, ltablepref);
default:
/* -- otherwise do the user checks -- */
return local_user_check (loc, ltablepref);
}
}
static char *local_alias_check(loc, alp, ltablepref)
char *loc;
ALIAS *alp;
char *ltablepref;
{
char *new_loc;
if (inAliasList(alp->alias_user) == OK)
return NULLCP;
else
addToAliasList(alp->alias_user);
switch (alp->alias_type) {
case ALIAS_PROPER:
if ((new_loc = local_getlocal(alp->alias_user,
ltablepref)) != NULLCP) {
/* proper alias don't unwind */
free(new_loc);
return (loc);
} else
return NULLCP;
case ALIAS_822_SYNONYM:
return rfc822_getlocal (alp -> alias_user);
case ALIAS_X400_SYNONYM:
return x440_getlocal (alp -> alias_user);
case ALIAS_SYNONYM:
return local_getlocal(alp->alias_user, ltablepref);
case ALIAS_X400:
case ALIAS_822:
return strdup(alp->alias_user);
default:
break;
}
return NULLCP;
}
static char *local_user_check(loc, ltablepref)
char *loc;
char *ltablepref;
{
LIST_RCHAN *temp;
extern LIST_RCHAN *tb_getuser();
if ((temp = tb_getuser (loc, ltablepref)) == NULLIST_RCHAN)
return NULLCP;
else
list_rchan_free(temp);
return strdup(loc);
}