|
|
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 r
Length: 5030 (0x13a6)
Types: TextFile
Names: »rfc2x400trace.c«
└─⟦2d1937cfd⟧ Bits:30007241 EUUGD22: P.P 5.0
└─⟦dc59850a2⟧ »EurOpenD22/pp5.0/pp-5.tar.Z«
└─⟦e5a54fb17⟧
└─⟦this⟧ »pp-5.0/Lib/format/rfc2x400trace.c«
/* rfc2x400trace.c: converts an RFC string to an x400 trace via rfc 1138 */
# ifndef lint
static char Rcsid[] = "@(#)$Header: /cs/research/pp/hubris/pp-beta/Lib/format/RCS/rfc2x400trace.c,v 5.0 90/09/20 16:05:59 pp Exp Locker: pp $";
# endif
/*
* $Header: /cs/research/pp/hubris/pp-beta/Lib/format/RCS/rfc2x400trace.c,v 5.0 90/09/20 16:05:59 pp Exp Locker: pp $
*
* $Log: rfc2x400trace.c,v $
* Revision 5.0 90/09/20 16:05:59 pp
* rcsforce : 5.0 public release
*
*/
#include "util.h"
#include "mta.h"
extern char *compress();
static int do_md_mta(),
do_deferred(),
do_converted(),
do_attempt_md_mta(),
do_arrival(),
do_actions();
int rfc2x400trace (trace, str)
Trace *trace;
char *str;
{
/* see sect 5.3.7 in 1138 */
char *start, *end, *tmp = strdup(str);
int result = OK;
PP_DBG (("Lib/rfc2x400trace (%s)", str));
start = tmp;
while (result == OK && start != NULLCP && *start != '\0') {
if ((end = index (start, ';')) != NULLCP)
*end++ = '\0';
(void) compress (start, start);
if (lexnequ(start, "by", strlen("by")) == 0)
/* md and mta bit */
result = do_md_mta(trace, start);
else if (lexnequ(start, "deferred until", strlen("deferred until")) == 0)
/* deffered delivery time */
result = do_deferred (trace, start);
else if (lexnequ(start, "converted", strlen("converted")) == 0)
/* converted eits */
result = do_converted(trace, start);
else if (lexnequ(start, "attempted", strlen("attempted")) == 0)
/* attempted md and mta */
result = do_attempt_md_mta(trace, start);
else if (end == NULLCP)
/* arrival-time */
result = do_arrival(trace, start);
else
/* action-list */
result = do_actions (trace, start);
start = end;
}
free(tmp);
return result;
}
static int do_md_mta (trace, start)
Trace *trace;
char *start;
{
char *end;
PP_DBG (("Lib/rfc2x400trace/do_md_mta (%s)", start));
start += strlen("by");
while (isspace(*start)) start++;
if (lexnequ (start, "mta ", strlen("mta ")) == 0) {
start += strlen("mta ");
while (isspace(*start)) start++;
end = start;
while (*end != ' ') end++;
*end = '\0';
trace -> trace_mta = strdup(start);
start = end+1;
while (isspace(*start)) start++;
if (lexnequ (start, "in ", strlen("in ")) != 0)
return NOTOK;
start += strlen("in ");
while (isspace(*start)) start++;
}
return rfc2x400globalid (&trace -> trace_DomId, start);
}
static int do_deferred (trace, start)
Trace *trace;
char *start;
{
PP_DBG (("Lib/rfc2x400trace/do_deferred (%s)", start));
start += strlen("deferred until");
while (isspace(*start)) start++;
return rfc2UTC (start, &trace->trace_DomSinfo.dsi_deferred);
}
static int do_converted (trace, start)
Trace *trace;
char *start;
{
char *end;
PP_DBG (("Lib/rfc2x400trace/do_converted (%s)", start));
if ((start = index(start, '(')) == NULLCP)
return NOTOK;
start++;
if ((end = index(start, ')')) == NULLCP)
return NOTOK;
*end = '\0';
return rfc2encinfo (&trace -> trace_DomSinfo.dsi_converted, start);
}
static int do_attempt_md_mta(trace, start)
Trace *trace;
char *start;
{
char *end;
PP_DBG (("Lib/rfc2x400trace/do_attempt_md_mta (%s)", start));
start += strlen("attempted");
while (isspace(*start)) start++;
if (lexnequ (start, "mta ", strlen("mta ")) == 0) {
start += strlen("mta ");
while (isspace(*start)) start++;
end = start;
while (*end != ' ') end++;
*end = '\0';
trace -> trace_DomSinfo.dsi_attempted_mta = strdup(start);
start = end+1;
while (isspace(*start)) start++;
if (lexnequ (start, "in ", strlen("in ")) != 0)
return NOTOK;
start += strlen("in ");
while (isspace(*start)) start++;
}
return rfc2x400globalid (&trace -> trace_DomSinfo.dsi_attempted_md, start);
}
static int do_actions (trace, start)
Trace *trace;
char *start;
{
PP_DBG (("Lib/rfc2x400trace/do_actions (%s)", start));
while (start != NULLCP && *start != '\0') {
while (isspace(*start)) start++;
if (lexnequ(start, "relayed", strlen("relayed")) == 0) {
trace -> trace_DomSinfo.dsi_action = ACTION_RELAYED;
start += strlen("relayed");
} else if (lexnequ(start, "rerouted", strlen("rerouted")) == 0) {
trace -> trace_DomSinfo.dsi_action = ACTION_ROUTED;
start += strlen("rerouted");
} else if (lexnequ(start, "redirected", strlen("redirected")) == 0) {
trace -> trace_DomSinfo.dsi_other_actions
= trace -> trace_DomSinfo.dsi_other_actions
| ACTION_REDIRECTED;
start += strlen("redirected");
} else if (lexnequ (start, "expanded", strlen("expanded")) == 0) {
trace -> trace_DomSinfo.dsi_other_actions
= trace -> trace_DomSinfo.dsi_other_actions
| ACTION_EXPANDED;
start += strlen("expanded");
} else {
PP_TRACE(("Unknown action in x400 trace '%s'", start));
return NOTOK;
}
while (isspace(*start)) start++;
}
return OK;
}
static int do_arrival (trace, start)
Trace *trace;
char *start;
{
PP_DBG (("Lib/rfc2x400trace/do_arrival (%s)", start));
return rfc2UTC (start, &trace->trace_DomSinfo.dsi_time);
}