fme.c revision 58841c984c2766b572c98824c0582c30e1d814d9
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * CDDL HEADER START
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * The contents of this file are subject to the terms of the
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * Common Development and Distribution License (the "License").
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * You may not use this file except in compliance with the License.
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * See the License for the specific language governing permissions
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * and limitations under the License.
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * When distributing Covered Code, include this CDDL HEADER in each
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * If applicable, add the following below this CDDL HEADER, with the
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * fields enclosed by brackets "[]" replaced with your own identifying
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * information: Portions Copyright [yyyy] [name of copyright owner]
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * CDDL HEADER END
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * Use is subject to license terms.
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * fme.c -- fault management exercise module
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * this module provides the simulated fault management exercise.
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings/* imported from eft.c... */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings/* fme under construction is global so we can free it on module abort */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic const char *Undiag_reason;
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic int Nextid = 0;
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic int Open_fme_count = 0; /* Count of open FMEs */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings/* list of fault management exercises underway */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic struct fme {
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings unsigned long long ull; /* time when fme was created */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings struct config *config; /* cooked configuration data */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings struct lut *eventtree; /* propagation tree for this FME */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * The initial error report that created this FME is kept in
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * two forms. e0 points to the instance tree node and is used
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * by fme_eval() as the starting point for the inference
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * algorithm. e0r is the event handle FMD passed to us when
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * the ereport first arrived and is used when setting timers,
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * which are always relative to the time of this initial
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings struct event *ecurrent; /* ereport under consideration */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings struct event *suspects; /* current suspect list */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings struct event *psuspects; /* previous suspect list */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings int nonfault; /* zero if all suspects T_FAULT */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings int posted_suspects; /* true if we've posted a diagnosis */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings int uniqobs; /* number of unique events observed */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings int peek; /* just peeking, don't track suspects */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings FME_DEFERRED /* don't know yet (k-count not met) */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings unsigned long long pull; /* time passed since created */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings unsigned long long wull; /* wait until this time for re-eval */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings struct event *observations; /* observation list */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings struct lut *globals; /* values of global variables */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings /* fmd interfacing */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings fmd_hdl_t *hdl; /* handle for talking with fmd */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings fmd_case_t *fmcase; /* what fmd 'case' we associate with */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic struct case_list {
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic void fme_eval(struct fme *fmep, fmd_event_t *ffep);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic enum fme_state hypothesise(struct fme *fmep, struct event *ep,
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings unsigned long long at_latest_by, unsigned long long *pdelay);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic struct node *eventprop_lookup(struct event *ep, const char *propname);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic struct node *pathstring2epnamenp(char *path);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic void publish_undiagnosable(fmd_hdl_t *hdl, fmd_event_t *ffep,
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic void restore_suspects(struct fme *fmep);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic void fme_receive_report(fmd_hdl_t *hdl, fmd_event_t *ffep,
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings const char *eventstring, const struct ipath *ipp, nvlist_t *nvl);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic void istat_counter_reset_cb(struct istat_entry *entp,
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings struct stats *statp, const struct ipath *ipp);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic void istat_counter_topo_chg_cb(struct istat_entry *entp,
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic void serd_reset_cb(struct serd_entry *entp, void *unused,
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic void serd_topo_chg_cb(struct serd_entry *entp, void *unused,
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic struct fme *
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * fme_ready -- called when all initialization of the FME (except for
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * stats) has completed successfully. Adds the fme to global lists
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings * and establishes its stats.
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic struct fme *
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings Nfmep = NULL; /* don't need to free this on module abort now */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Rcount", fmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings fmep->Rcount = stats_new_counter(nbuf, "ereports received", 0);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Hcall", fmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings fmep->Hcallcount = stats_new_counter(nbuf, "calls to hypothesise()", 1);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Rcall", fmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Ccall", fmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings fmep->Ccallcount = stats_new_counter(nbuf, "calls to causes_test()", 1);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Ecall", fmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings stats_new_counter(nbuf, "calls to effects_test()", 1);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Tcall", fmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings fmep->Tcallcount = stats_new_counter(nbuf, "calls to triggered()", 1);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Marrow", fmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.diags", fmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings fmep->diags = stats_new_counter(nbuf, "suspect lists diagnosed", 0);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings out(O_ALTFP|O_VERB2, "newfme: config snapshot contains...");
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsextern struct lut *itree_create_dummy(const char *, const struct ipath *);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings/* ARGSUSED */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsset_needed_arrows(struct event *ep, struct event *ep2, struct fme *fmep)
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings/* ARGSUSED */
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsunset_needed_arrows(struct event *ep, struct event *ep2, struct fme *fmep)
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic void globals_destructor(void *left, void *right, void *arg);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic void clear_arrows(struct event *ep, struct event *ep2, struct fme *fmep);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsprune_propagations(const char *e0class, const struct ipath *e0ipp)
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings unsigned long long my_delay = TIMEVAL_EVENTUALLY;
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings Nfmep->eventtree = itree_create_dummy(e0class, e0ipp);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings itree_lookup(Nfmep->eventtree, e0class, e0ipp)) == NULL) {
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings out(O_ALTFP, "prune_propagations: e0 not in instance tree");
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings Nfmep->ecurrent = Nfmep->observations = Nfmep->e0;
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Rcount", Nfmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings Nfmep->Rcount = stats_new_counter(nbuf, "ereports received", 0);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Hcall", Nfmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings stats_new_counter(nbuf, "calls to hypothesise()", 1);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Rcall", Nfmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Ccall", Nfmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings stats_new_counter(nbuf, "calls to causes_test()", 1);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Ecall", Nfmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings stats_new_counter(nbuf, "calls to effects_test()", 1);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Tcall", Nfmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings Nfmep->Tcallcount = stats_new_counter(nbuf, "calls to triggered()", 1);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.Marrow", Nfmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) sprintf(nbuf, "fme%d.diags", Nfmep->id);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings Nfmep->diags = stats_new_counter(nbuf, "suspect lists diagnosed", 0);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings lut_walk(Nfmep->eventtree, (lut_cb)unset_needed_arrows, (void *)Nfmep);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings lut_walk(Nfmep->eventtree, (lut_cb)clear_arrows, (void *)Nfmep);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings (void) hypothesise(Nfmep, Nfmep->e0, Nfmep->ull, &my_delay);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings lut_walk(Nfmep->eventtree, (lut_cb)set_needed_arrows, (void *)Nfmep);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings lut_free(Nfmep->globals, globals_destructor, NULL);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsstatic struct fme *
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbingsnewfme(const char *e0class, const struct ipath *e0ipp, fmd_hdl_t *hdl,
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings out(O_ALTFP|O_STAMP, "start config_snapshot using %d bytes", init_size);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings out(O_ALTFP|O_STAMP, "config_snapshot added %d bytes",
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings if ((Nfmep->eventtree = itree_create(Nfmep->config)) == NULL) {
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings itree_ptree(O_ALTFP|O_VERB2, Nfmep->eventtree);
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings itree_lookup(Nfmep->eventtree, e0class, e0ipp)) == NULL) {
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings out(O_ALTFP, "newfme: e0 not in instance tree");
449854c2a07b50ea64d9d6a8b03d18d4afeeee43Ken Stubbings /* clean up closed fmes */
if (Nfmep) {
char *estr;
char *sepptr;
char *estr;
int ocnt;
int elen;
if (elen == 0) {
tmpbuf);
if (pkdlen != 0) {
if (ocnt == 0)
char *sepptr;
char *estr;
int elen;
int init_size;
extern int alloc_total();
goto badcase;
goto badcase;
goto badcase;
sizeof (size_t));
goto badcase;
goto badcase;
goto badcase;
if (elen == 0) {
tmpbuf);
goto badcase;
goto badcase;
goto badcase;
if (rawsz > 0) {
goto badcase;
goto badcase;
goto badcase;
if (f->config)
FREE(f);
return (t == N_FAULT);
return (t == N_DEFECT);
return (t == N_UPSET);
static struct node *
char *ptr;
return (ret);
char *serdname;
char *serdresource;
NULL);
if ((nid =
char *suffix;
char *nserdname;
char *path;
const char *name;
char *tptr;
char *serd_name;
int tmplen;
char *ptr;
* eft.conf file values (if Serd_Override is set) or from
if (ptr3)
ptr3++;
if (!got_n_override) {
NULL);
if (!got_t_override) {
NULL);
const unsigned long long *ullp;
const char *suffix;
int len;
serd_save();
for (i = 0; i < serdincrement; i++) {
if (ippp) {
serdname);
const char *ename;
} *tripped;
nupset = 0;
nupset++;
if (nupset == 0)
ntrip = 0;
ntrip++;
for (i = 0; i < ntrip; i++) {
const char *eventstring;
int prev_verbose;
if (ffep) {
goto retry_lone_ereport;
if (Debug == 0)
Verbose = 0;
return (ntrip);
const char *class)
class);
const char *eventstring)
char *uuid;
while (nvc-- != 0) {
char *path;
path);
istat_save();
serd_save();
istat_save();
serd_save();
int matched = 0;
int prev_verbose;
if (Debug == 0)
Verbose = 0;
matched++;
if (pre_peek_nvp)
if (ffep) {
if (matched)
if (ofmep) {
if (ffep)
if (ffep)
if (ffep) {
static int current_indent;
indent_push(const char *s)
indent_set(const char *s)
current_indent = 0;
indent_push(s);
indent_pop(void)
if (current_indent > 0)
indent(void)
if (!Verbose)
for (i = 0; i < current_indent; i++)
static struct node *
if (n == NULL)
static nvlist_t *
char *failure;
int err, i;
return (NULL);
depth++;
return (NULL);
for (i = 0; i < depth; i++)
if (err != 0) {
goto boom;
if (err != 0) {
goto boom;
if (err != 0) {
goto boom;
pa[i++] = p;
if (err == 0) {
for (i = 0; i < depth; i++)
boom:
for (i = 0; i < depth; i++)
nvlist_free(f);
return (NULL);
struct ipath {
static nvlist_t *
char *failure;
int err, i;
depth++;
for (i = 0; i < depth; i++)
if (err != 0) {
goto boom;
if (err != 0) {
goto boom;
if (err != 0) {
goto boom;
pa[i++] = p;
if (err == 0) {
for (i = 0; i < depth; i++)
boom:
for (i = 0; i < depth; i++)
nvlist_free(f);
return (NULL);
static uint_t
static uint8_t
struct rsl {
rslcmp(const void *a, const void *b)
int rv;
if (rv != 0)
return (rv);
first++;
(*nprobs)--;
(*nnonf)--;
cr++;
first++;
char *pathstr;
pathstr);
int mess_zero_count = 0;
int serd_rval;
if (serd_rval == 0)
rp2++;
(*mess_zero_nonfaultp)++;
rp++;
return (mess_zero_count);
static char *Istatbuf;
static char *Istatbufptr;
static int Istatsz;
int val;
char *str;
int len;
int val;
if (Istat_need_save == 0)
Istatsz = 0;
if (Istatsz == 0) {
Istat_need_save = 0;
int cnt = 0;
char *sname;
char *snamep;
if (np)
if (np)
char *path;
void *unused)
char *path;
istat_fini(void)
static char *Serdbuf;
static char *Serdbufptr;
static int Serdsz;
char *str;
int len;
if (Serd_need_save == 0)
Serdsz = 0;
if (Serdsz == 0) {
Serd_need_save = 0;
int sz;
char *sbuf;
char *sepptr;
char *ptr;
char *namestring;
sepptr++;
serd_save();
char *path;
char *path;
serd_fini(void)
struct node *n;
} else if (fr == 0) {
frcnt++;
cert,
&messval) == 0) {
messval);
&retireval) == 0) {
&responseval) == 0) {
if (allfaulty) {
if (!allfaulty) {
(void *)fmep);
int mess_zero_count;
int mess_zero_nonfault = 0;
int rpcnt;
case FME_CREDIBLE:
if (ffep) {
case FME_WAIT:
case FME_DISPROVED:
static void indent(void);
unsigned long long *pdelay);
indent();
indent();
indent();
indent();
indent();
int count = 0;
unsigned long long my_delay;
int retval = 0;
if (mark == 0) {
keep);
indent();
indent();
indent();
indent();
indent();
indent();
&my_delay);
&my_delay);
indent();
WAIT_EFFECT) {
indent_pop();
indent();
indent();
indent_pop();
return (retval);
static enum fme_state
unsigned long long my_delay;
indent();
indent();
indent();
indent_pop();
return (return_value);
static enum fme_state
int waiting_events;
int credible_events;
int deferred_events;
unsigned long long arrow_delay;
unsigned long long my_delay;
indent();
return (FME_CREDIBLE);
indent();
return (FME_DISPROVED);
indent();
return (FME_WAIT);
indent();
indent();
switch (return_value) {
case FME_CREDIBLE:
case FME_DISPROVED:
case FME_WAIT:
indent_pop();
return (return_value);
credible_events = 0;
waiting_events = 0;
deferred_events = 0;
indent();
indent();
if (n <= credible_events)
&my_delay)) {
case FME_DEFERRED:
case FME_CREDIBLE:
case FME_DISPROVED:
case FME_WAIT:
indent();
indent();
indent_pop();
return (FME_DISPROVED);
} else if (credible_events < n) {
indent();
indent_pop();
return (return_value);
static enum fme_state
unsigned long long my_delay;
int credible_results = 0;
int waiting_results = 0;
indent();
int do_not_follow = 0;
indent();
if (do_not_follow) {
indent();
&my_delay);
switch (fstate) {
case FME_WAIT:
case FME_CREDIBLE:
case FME_DISPROVED:
indent();
indent_pop();
return (FME_DISPROVED);
if (waiting_results != 0) {
indent();
indent_pop();
return (FME_WAIT);
indent();
indent_pop();
return (FME_CREDIBLE);
static enum fme_state
unsigned long long my_delay;
indent();
indent();
indent_pop();
return (FME_DISPROVED);
indent();
indent_pop();
return (FME_DISPROVED);
indent();
indent_pop();
return (FME_DISPROVED);
indent();
indent_pop();
return (FME_WAIT);
indent();
indent_pop();
return (FME_CREDIBLE);
int sz;
char *sbuf;
char *ptr;
char *sepptr;
int val;
istat_save();